From 4f249b86525203aa88899c88bf50a4794a35a672 Mon Sep 17 00:00:00 2001 From: Daniel Reeves <31971762+dwreeves@users.noreply.github.com> Date: Tue, 16 May 2023 17:22:59 -0400 Subject: [PATCH 01/67] Add target_path to more cli commands that use it (#7647) --- .changes/unreleased/Fixes-20230516-152644.yaml | 6 ++++++ core/dbt/cli/main.py | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 .changes/unreleased/Fixes-20230516-152644.yaml diff --git a/.changes/unreleased/Fixes-20230516-152644.yaml b/.changes/unreleased/Fixes-20230516-152644.yaml new file mode 100644 index 00000000000..f68cf8dc842 --- /dev/null +++ b/.changes/unreleased/Fixes-20230516-152644.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Add --target-path to more CLI subcommands +time: 2023-05-16T15:26:44.557072-04:00 +custom: + Author: dwreeves + Issue: "7646" diff --git a/core/dbt/cli/main.py b/core/dbt/cli/main.py index 30051063095..73676b9024a 100644 --- a/core/dbt/cli/main.py +++ b/core/dbt/cli/main.py @@ -213,6 +213,7 @@ def build(ctx, **kwargs): @p.profiles_dir @p.project_dir @p.target +@p.target_path @p.vars @requires.postflight @requires.preflight @@ -284,6 +285,7 @@ def docs_generate(ctx, **kwargs): @p.profiles_dir @p.project_dir @p.target +@p.target_path @p.vars @requires.postflight @requires.preflight @@ -477,6 +479,7 @@ def init(ctx, **kwargs): @p.state @p.deprecated_state @p.target +@p.target_path @p.vars @requires.postflight @requires.preflight @@ -577,6 +580,7 @@ def run(ctx, **kwargs): @p.profiles_dir @p.project_dir @p.target +@p.target_path @p.vars @requires.postflight @requires.preflight @@ -691,6 +695,7 @@ def source(ctx, **kwargs): @p.state @p.deprecated_state @p.target +@p.target_path @p.threads @p.vars @requires.postflight From 5f7ae2fd4c5829075a8136e12719cbd7cf68ddc3 Mon Sep 17 00:00:00 2001 From: Gerda Shank Date: Tue, 16 May 2023 21:08:04 -0400 Subject: [PATCH 02/67] Move node patch method to schema parser patch_node_properties and refactor schema parsing (#7640) --- .../Under the Hood-20230516-094241.yaml | 7 + core/dbt/contracts/graph/manifest.py | 9 +- core/dbt/contracts/graph/nodes.py | 69 +- core/dbt/parser/common.py | 222 +++++ core/dbt/parser/generic_test.py | 4 +- core/dbt/parser/generic_test_builders.py | 153 +-- core/dbt/parser/manifest.py | 19 +- core/dbt/parser/schema_generic_tests.py | 407 ++++++++ core/dbt/parser/schema_yaml_readers.py | 271 +++++ core/dbt/parser/schemas.py | 943 ++++-------------- core/dbt/parser/sources.py | 31 +- test/unit/test_contracts_graph_parsed.py | 143 --- test/unit/test_parser.py | 58 +- .../defer_state/test_modified_state.py | 2 +- 14 files changed, 1112 insertions(+), 1226 deletions(-) create mode 100644 .changes/unreleased/Under the Hood-20230516-094241.yaml create mode 100644 core/dbt/parser/common.py create mode 100644 core/dbt/parser/schema_generic_tests.py create mode 100644 core/dbt/parser/schema_yaml_readers.py diff --git a/.changes/unreleased/Under the Hood-20230516-094241.yaml b/.changes/unreleased/Under the Hood-20230516-094241.yaml new file mode 100644 index 00000000000..b2f3173f093 --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230516-094241.yaml @@ -0,0 +1,7 @@ +kind: Under the Hood +body: Move node patch method to schema parser patch_node_properties and refactor schema + parsing +time: 2023-05-16T09:42:41.793503-04:00 +custom: + Author: gshank + Issue: "7430" diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index f4caefbf6e4..0c4c2e72dcf 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -38,6 +38,7 @@ ResultNode, BaseNode, ManifestOrPublicNode, + ModelNode, ) from dbt.contracts.graph.unparsed import SourcePatch, NodeVersion, UnparsedVersion from dbt.contracts.graph.manifest_upgrade import upgrade_manifest_json @@ -188,7 +189,13 @@ def find( # If this is an unpinned ref (no 'version' arg was passed), # AND this is a versioned node, # AND this ref is being resolved at runtime -- get_node_info != {} - if version is None and node.is_versioned and get_node_info(): + # Only ModelNodes can be versioned. + if ( + isinstance(node, ModelNode) + and version is None + and node.is_versioned + and get_node_info() + ): # Check to see if newer versions are available, and log an "FYI" if so max_version: UnparsedVersion = max( [ diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 26938b37554..94d30364a3d 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -40,13 +40,12 @@ ) from dbt.contracts.util import Replaceable, AdditionalPropertiesMixin from dbt.events.functions import warn_or_error -from dbt.exceptions import ParsingError, InvalidAccessTypeError, ContractBreakingChangeError +from dbt.exceptions import ParsingError, ContractBreakingChangeError from dbt.events.types import ( SeedIncreased, SeedExceedsLimitSamePath, SeedExceedsLimitAndPathChanged, SeedExceedsLimitChecksumChanged, - ValidationWarning, ) from dbt.events.contextvars import set_contextvars from dbt.flags import get_flags @@ -443,63 +442,6 @@ def same_contract(self, old, adapter_type=None) -> bool: # This would only apply to seeds return True - def patch(self, patch: "ParsedNodePatch"): - """Given a ParsedNodePatch, add the new information to the node.""" - # NOTE: Constraint patching is awkwardly done in the parse_patch function - # which calls this one. We need to combine the logic. - - # explicitly pick out the parts to update so we don't inadvertently - # step on the model name or anything - # Note: config should already be updated - self.patch_path: Optional[str] = patch.file_id - # update created_at so process_docs will run in partial parsing - self.created_at = time.time() - self.description = patch.description - self.columns = patch.columns - self.name = patch.name - - # TODO: version, latest_version, and access are specific to ModelNodes, consider splitting out to ModelNode - if self.resource_type != NodeType.Model: - if patch.version: - warn_or_error( - ValidationWarning( - field_name="version", - resource_type=self.resource_type.value, - node_name=patch.name, - ) - ) - if patch.latest_version: - warn_or_error( - ValidationWarning( - field_name="latest_version", - resource_type=self.resource_type.value, - node_name=patch.name, - ) - ) - self.version = patch.version - self.latest_version = patch.latest_version - - # This might not be the ideal place to validate the "access" field, - # but at this point we have the information we need to properly - # validate and we don't before this. - if patch.access: - if self.resource_type == NodeType.Model: - if AccessType.is_valid(patch.access): - self.access = AccessType(patch.access) - else: - raise InvalidAccessTypeError( - unique_id=self.unique_id, - field_value=patch.access, - ) - else: - warn_or_error( - ValidationWarning( - field_name="access", - resource_type=self.resource_type.value, - node_name=patch.name, - ) - ) - def same_contents(self, old, adapter_type) -> bool: if old is None: return False @@ -1015,14 +957,6 @@ class Macro(BaseNode): created_at: float = field(default_factory=lambda: time.time()) supported_languages: Optional[List[ModelLanguage]] = None - def patch(self, patch: "ParsedMacroPatch"): - self.patch_path: Optional[str] = patch.file_id - self.description = patch.description - self.created_at = time.time() - self.meta = patch.meta - self.docs = patch.docs - self.arguments = patch.arguments - def same_contents(self, other: Optional["Macro"]) -> bool: if other is None: return False @@ -1466,6 +1400,7 @@ class ParsedNodePatch(ParsedPatch): access: Optional[str] version: Optional[NodeVersion] latest_version: Optional[NodeVersion] + constraints: List[Dict[str, Any]] @dataclass diff --git a/core/dbt/parser/common.py b/core/dbt/parser/common.py new file mode 100644 index 00000000000..24a0810943b --- /dev/null +++ b/core/dbt/parser/common.py @@ -0,0 +1,222 @@ +from dbt.contracts.graph.unparsed import ( + HasColumnProps, + UnparsedColumn, + UnparsedNodeUpdate, + UnparsedMacroUpdate, + UnparsedAnalysisUpdate, + UnparsedExposure, + UnparsedModelUpdate, +) +from dbt.contracts.graph.unparsed import NodeVersion, HasColumnTests, HasColumnDocs +from dbt.contracts.graph.nodes import ( + UnpatchedSourceDefinition, + ColumnInfo, + ColumnLevelConstraint, + ConstraintType, +) +from dbt.parser.search import FileBlock +from typing import List, Dict, Any, TypeVar, Generic, Union, Optional +from dataclasses import dataclass +from dbt.exceptions import DbtInternalError, ParsingError + + +def trimmed(inp: str) -> str: + if len(inp) < 50: + return inp + return inp[:44] + "..." + inp[-3:] + + +TestDef = Union[str, Dict[str, Any]] + + +Target = TypeVar( + "Target", + UnparsedNodeUpdate, + UnparsedMacroUpdate, + UnparsedAnalysisUpdate, + UnpatchedSourceDefinition, + UnparsedExposure, + UnparsedModelUpdate, +) + + +ColumnTarget = TypeVar( + "ColumnTarget", + UnparsedModelUpdate, + UnparsedNodeUpdate, + UnparsedAnalysisUpdate, + UnpatchedSourceDefinition, +) + +Versioned = TypeVar("Versioned", bound=UnparsedModelUpdate) + +Testable = TypeVar("Testable", UnparsedNodeUpdate, UnpatchedSourceDefinition, UnparsedModelUpdate) + + +@dataclass +class YamlBlock(FileBlock): + data: Dict[str, Any] + + @classmethod + def from_file_block(cls, src: FileBlock, data: Dict[str, Any]): + return cls( + file=src.file, + data=data, + ) + + +@dataclass +class TargetBlock(YamlBlock, Generic[Target]): + target: Target + + @property + def name(self): + return self.target.name + + @property + def columns(self): + return [] + + @property + def tests(self) -> List[TestDef]: + return [] + + @classmethod + def from_yaml_block(cls, src: YamlBlock, target: Target) -> "TargetBlock[Target]": + return cls( + file=src.file, + data=src.data, + target=target, + ) + + +@dataclass +class TargetColumnsBlock(TargetBlock[ColumnTarget], Generic[ColumnTarget]): + @property + def columns(self): + if self.target.columns is None: + return [] + else: + return self.target.columns + + +@dataclass +class TestBlock(TargetColumnsBlock[Testable], Generic[Testable]): + @property + def tests(self) -> List[TestDef]: + if self.target.tests is None: + return [] + else: + return self.target.tests + + @property + def quote_columns(self) -> Optional[bool]: + return self.target.quote_columns + + @classmethod + def from_yaml_block(cls, src: YamlBlock, target: Testable) -> "TestBlock[Testable]": + return cls( + file=src.file, + data=src.data, + target=target, + ) + + +@dataclass +class VersionedTestBlock(TestBlock, Generic[Versioned]): + @property + def columns(self): + if not self.target.versions: + return super().columns + else: + raise DbtInternalError(".columns for VersionedTestBlock with versions") + + @property + def tests(self) -> List[TestDef]: + if not self.target.versions: + return super().tests + else: + raise DbtInternalError(".tests for VersionedTestBlock with versions") + + @classmethod + def from_yaml_block(cls, src: YamlBlock, target: Versioned) -> "VersionedTestBlock[Versioned]": + return cls( + file=src.file, + data=src.data, + target=target, + ) + + +@dataclass +class GenericTestBlock(TestBlock[Testable], Generic[Testable]): + test: Dict[str, Any] + column_name: Optional[str] + tags: List[str] + version: Optional[NodeVersion] + + @classmethod + def from_test_block( + cls, + src: TestBlock, + test: Dict[str, Any], + column_name: Optional[str], + tags: List[str], + version: Optional[NodeVersion], + ) -> "GenericTestBlock": + return cls( + file=src.file, + data=src.data, + target=src.target, + test=test, + column_name=column_name, + tags=tags, + version=version, + ) + + +class ParserRef: + """A helper object to hold parse-time references.""" + + def __init__(self): + self.column_info: Dict[str, ColumnInfo] = {} + + def _add(self, column: HasColumnProps): + tags: List[str] = [] + tags.extend(getattr(column, "tags", ())) + quote: Optional[bool] + if isinstance(column, UnparsedColumn): + quote = column.quote + else: + quote = None + + if any( + c + for c in column.constraints + if "type" not in c or not ConstraintType.is_valid(c["type"]) + ): + raise ParsingError(f"Invalid constraint type on column {column.name}") + + self.column_info[column.name] = ColumnInfo( + name=column.name, + description=column.description, + data_type=column.data_type, + constraints=[ColumnLevelConstraint.from_dict(c) for c in column.constraints], + meta=column.meta, + tags=tags, + quote=quote, + _extra=column.extra, + ) + + @classmethod + def from_target(cls, target: Union[HasColumnDocs, HasColumnTests]) -> "ParserRef": + refs = cls() + for column in target.columns: + refs._add(column) + return refs + + @classmethod + def from_versioned_target(cls, target: Versioned, version: NodeVersion) -> "ParserRef": + refs = cls() + for base_column in target.get_columns_for_version(version): + refs._add(base_column) + return refs diff --git a/core/dbt/parser/generic_test.py b/core/dbt/parser/generic_test.py index fe146419538..88efc3c7dce 100644 --- a/core/dbt/parser/generic_test.py +++ b/core/dbt/parser/generic_test.py @@ -22,7 +22,7 @@ def resource_type(self) -> NodeType: def get_compiled_path(cls, block: FileBlock): return block.path.relative_path - def parse_generic_test( + def create_generic_test_macro( self, block: jinja.BlockTag, base_node: UnparsedMacro, name: str ) -> Macro: unique_id = self.generate_unique_id(name) @@ -76,7 +76,7 @@ def parse_unparsed_generic_test(self, base_node: UnparsedMacro) -> Iterable[Macr continue name: str = generic_test_name.replace(MACRO_PREFIX, "") - node = self.parse_generic_test(block, base_node, name) + node = self.create_generic_test_macro(block, base_node, name) yield node def parse_file(self, block: FileBlock): diff --git a/core/dbt/parser/generic_test_builders.py b/core/dbt/parser/generic_test_builders.py index 34afcaa5ba6..847f2b29f3c 100644 --- a/core/dbt/parser/generic_test_builders.py +++ b/core/dbt/parser/generic_test_builders.py @@ -1,9 +1,7 @@ import re from copy import deepcopy -from dataclasses import dataclass from typing import ( Generic, - TypeVar, Dict, Any, Tuple, @@ -14,12 +12,8 @@ from dbt.clients.jinja import get_rendered, GENERIC_TEST_KWARGS_NAME from dbt.contracts.graph.nodes import UnpatchedSourceDefinition from dbt.contracts.graph.unparsed import ( - TestDef, NodeVersion, - UnparsedAnalysisUpdate, - UnparsedMacroUpdate, UnparsedNodeUpdate, - UnparsedExposure, UnparsedModelUpdate, ) from dbt.exceptions import ( @@ -34,9 +28,8 @@ TestNameNotStringError, UnexpectedTestNamePatternError, UndefinedMacroError, - DbtInternalError, ) -from dbt.parser.search import FileBlock +from dbt.parser.common import Testable from dbt.utils import md5 @@ -83,150 +76,6 @@ def synthesize_generic_test_names( return short_name, full_name -@dataclass -class YamlBlock(FileBlock): - data: Dict[str, Any] - - @classmethod - def from_file_block(cls, src: FileBlock, data: Dict[str, Any]): - return cls( - file=src.file, - data=data, - ) - - -Versioned = TypeVar("Versioned", bound=UnparsedModelUpdate) - -Testable = TypeVar("Testable", UnparsedNodeUpdate, UnpatchedSourceDefinition, UnparsedModelUpdate) - -ColumnTarget = TypeVar( - "ColumnTarget", - UnparsedModelUpdate, - UnparsedNodeUpdate, - UnparsedAnalysisUpdate, - UnpatchedSourceDefinition, -) - -Target = TypeVar( - "Target", - UnparsedNodeUpdate, - UnparsedMacroUpdate, - UnparsedAnalysisUpdate, - UnpatchedSourceDefinition, - UnparsedExposure, - UnparsedModelUpdate, -) - - -@dataclass -class TargetBlock(YamlBlock, Generic[Target]): - target: Target - - @property - def name(self): - return self.target.name - - @property - def columns(self): - return [] - - @property - def tests(self) -> List[TestDef]: - return [] - - @classmethod - def from_yaml_block(cls, src: YamlBlock, target: Target) -> "TargetBlock[Target]": - return cls( - file=src.file, - data=src.data, - target=target, - ) - - -@dataclass -class TargetColumnsBlock(TargetBlock[ColumnTarget], Generic[ColumnTarget]): - @property - def columns(self): - if self.target.columns is None: - return [] - else: - return self.target.columns - - -@dataclass -class TestBlock(TargetColumnsBlock[Testable], Generic[Testable]): - @property - def tests(self) -> List[TestDef]: - if self.target.tests is None: - return [] - else: - return self.target.tests - - @property - def quote_columns(self) -> Optional[bool]: - return self.target.quote_columns - - @classmethod - def from_yaml_block(cls, src: YamlBlock, target: Testable) -> "TestBlock[Testable]": - return cls( - file=src.file, - data=src.data, - target=target, - ) - - -@dataclass -class VersionedTestBlock(TestBlock, Generic[Versioned]): - @property - def columns(self): - if not self.target.versions: - return super().columns - else: - raise DbtInternalError(".columns for VersionedTestBlock with versions") - - @property - def tests(self) -> List[TestDef]: - if not self.target.versions: - return super().tests - else: - raise DbtInternalError(".tests for VersionedTestBlock with versions") - - @classmethod - def from_yaml_block(cls, src: YamlBlock, target: Versioned) -> "VersionedTestBlock[Versioned]": - return cls( - file=src.file, - data=src.data, - target=target, - ) - - -@dataclass -class GenericTestBlock(TestBlock[Testable], Generic[Testable]): - test: Dict[str, Any] - column_name: Optional[str] - tags: List[str] - version: Optional[NodeVersion] - - @classmethod - def from_test_block( - cls, - src: TestBlock, - test: Dict[str, Any], - column_name: Optional[str], - tags: List[str], - version: Optional[NodeVersion], - ) -> "GenericTestBlock": - return cls( - file=src.file, - data=src.data, - target=src.target, - test=test, - column_name=column_name, - tags=tags, - version=version, - ) - - class TestBuilder(Generic[Testable]): """An object to hold assorted test settings and perform basic parsing diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index 7a2c55e6af5..3708c263bf1 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -93,6 +93,7 @@ SeedNode, ManifestNode, ResultNode, + ModelNode, ) from dbt.contracts.graph.unparsed import NodeVersion from dbt.contracts.util import Writable @@ -1403,10 +1404,7 @@ def _process_refs_for_exposure(manifest: Manifest, current_project: str, exposur ) continue - elif ( - target_model.resource_type == NodeType.Model - and target_model.access == AccessType.Private - ): + elif isinstance(target_model, ModelNode) and target_model.access == AccessType.Private: # Exposures do not have a group and so can never reference private models raise dbt.exceptions.DbtReferenceError( unique_id=exposure.unique_id, @@ -1455,10 +1453,7 @@ def _process_refs_for_metric(manifest: Manifest, current_project: str, metric: M should_warn_if_disabled=False, ) continue - elif ( - target_model.resource_type == NodeType.Model - and target_model.access == AccessType.Private - ): + elif isinstance(target_model, ModelNode) and target_model.access == AccessType.Private: if not metric.group or metric.group != target_model.group: raise dbt.exceptions.DbtReferenceError( unique_id=metric.unique_id, @@ -1562,10 +1557,7 @@ def _process_refs_for_node(manifest: Manifest, current_project: str, node: Manif continue # Handle references to models that are private - elif ( - target_model.resource_type == NodeType.Model - and target_model.access == AccessType.Private - ): + elif isinstance(target_model, ModelNode) and target_model.access == AccessType.Private: if not node.group or node.group != target_model.group: raise dbt.exceptions.DbtReferenceError( unique_id=node.unique_id, @@ -1698,7 +1690,7 @@ def write_publication_artifact(root_project: RuntimeConfig, manifest: Manifest): public_node_ids = { node.unique_id for node in manifest.nodes.values() - if node.resource_type == NodeType.Model and node.access == AccessType.Public + if isinstance(node, ModelNode) and node.access == AccessType.Public } # Get the Graph object from the Linker @@ -1710,6 +1702,7 @@ def write_publication_artifact(root_project: RuntimeConfig, manifest: Manifest): public_models = {} for unique_id in public_node_ids: model = manifest.nodes[unique_id] + assert isinstance(model, ModelNode) # public_node_dependencies is the intersection of all parent nodes plus public nodes parents: Set[UniqueId] = graph.select_parents({UniqueId(unique_id)}) public_node_dependencies: Set[UniqueId] = parents.intersection(public_node_ids) diff --git a/core/dbt/parser/schema_generic_tests.py b/core/dbt/parser/schema_generic_tests.py new file mode 100644 index 00000000000..590f946bbc7 --- /dev/null +++ b/core/dbt/parser/schema_generic_tests.py @@ -0,0 +1,407 @@ +import pathlib +import itertools +import os + +from typing import List, Dict, Optional, Union, Any +from dbt.parser.base import SimpleParser +from dbt.parser.generic_test_builders import TestBuilder +from dbt.parser.search import FileBlock +from dbt.context.providers import RefArgs, generate_test_context +from dbt.parser.common import ( + TestBlock, + Testable, + TestDef, + GenericTestBlock, + VersionedTestBlock, + trimmed, +) +from dbt.contracts.graph.unparsed import UnparsedNodeUpdate, NodeVersion, UnparsedColumn +from dbt.contracts.graph.nodes import ( + GenericTestNode, + UnpatchedSourceDefinition, + ManifestNode, + GraphMemberNode, +) +from dbt.context.context_config import ContextConfig +from dbt.context.configured import generate_schema_yml_context, SchemaYamlVars +from dbt.dataclass_schema import ValidationError +from dbt.exceptions import SchemaConfigError, CompilationError, ParsingError, TestConfigError +from dbt.contracts.files import FileHash +from dbt.utils import md5, get_pseudo_test_path +from dbt.clients.jinja import get_rendered, add_rendered_test_kwargs +from dbt.adapters.factory import get_adapter, get_adapter_package_names +from dbt.node_types import NodeType +from dbt.context.macro_resolver import MacroResolver + + +# This parser handles the tests that are defined in "schema" (yaml) files, on models, +# sources, etc. The base generic test is handled by the GenericTestParser +class SchemaGenericTestParser(SimpleParser): + def __init__( + self, + project, + manifest, + root_project, + ) -> None: + super().__init__(project, manifest, root_project) + self.schema_yaml_vars = SchemaYamlVars() + self.render_ctx = generate_schema_yml_context( + self.root_project, self.project.project_name, self.schema_yaml_vars + ) + internal_package_names = get_adapter_package_names(self.root_project.credentials.type) + self.macro_resolver = MacroResolver( + self.manifest.macros, self.root_project.project_name, internal_package_names + ) + + @property + def resource_type(self) -> NodeType: + return NodeType.Test + + @classmethod + def get_compiled_path(cls, block: FileBlock) -> str: + return block.path.relative_path + + def parse_file(self, block: FileBlock, dct: Dict = None) -> None: + pass + + def parse_from_dict(self, dct, validate=True) -> GenericTestNode: + if validate: + GenericTestNode.validate(dct) + return GenericTestNode.from_dict(dct) + + def parse_column_tests( + self, block: TestBlock, column: UnparsedColumn, version: Optional[NodeVersion] + ) -> None: + if not column.tests: + return + + for test in column.tests: + self.parse_test(block, test, column, version) + + def create_test_node( + self, + target: Union[UnpatchedSourceDefinition, UnparsedNodeUpdate], + path: str, + config: ContextConfig, + tags: List[str], + fqn: List[str], + name: str, + raw_code: str, + test_metadata: Dict[str, Any], + file_key_name: str, + column_name: Optional[str], + ) -> GenericTestNode: + + HASH_LENGTH = 10 + + # N.B: This function builds a hashable string from any given test_metadata dict. + # it's a bit fragile for general use (only supports str, int, float, List, Dict) + # but it gets the job done here without the overhead of complete ser(de). + def get_hashable_md(data: Union[str, int, float, List, Dict]) -> Union[str, List, Dict]: + if type(data) == dict: + return {k: get_hashable_md(data[k]) for k in sorted(data.keys())} # type: ignore + elif type(data) == list: + return [get_hashable_md(val) for val in data] # type: ignore + else: + return str(data) + + hashable_metadata = repr(get_hashable_md(test_metadata)) + hash_string = "".join([name, hashable_metadata]) + test_hash = md5(hash_string)[-HASH_LENGTH:] + + dct = { + "alias": name, + "schema": self.default_schema, + "database": self.default_database, + "fqn": fqn, + "name": name, + "resource_type": self.resource_type, + "tags": tags, + "path": path, + "original_file_path": target.original_file_path, + "package_name": self.project.project_name, + "raw_code": raw_code, + "language": "sql", + "unique_id": self.generate_unique_id(name, test_hash), + "config": self.config_dict(config), + "test_metadata": test_metadata, + "column_name": column_name, + "checksum": FileHash.empty().to_dict(omit_none=True), + "file_key_name": file_key_name, + } + try: + GenericTestNode.validate(dct) + return GenericTestNode.from_dict(dct) + except ValidationError as exc: + # this is a bit silly, but build an UnparsedNode just for error + # message reasons + node = self._create_error_node( + name=target.name, + path=path, + original_file_path=target.original_file_path, + raw_code=raw_code, + ) + raise TestConfigError(exc, node) + + # This is called directly in the SourcePatcher and by the "parse_node" + # command which is called by the SchemaParser. + def parse_generic_test( + self, + target: Testable, + test: Dict[str, Any], + tags: List[str], + column_name: Optional[str], + schema_file_id: str, + version: Optional[NodeVersion], + ) -> GenericTestNode: + try: + builder = TestBuilder( + test=test, + target=target, + column_name=column_name, + version=version, + package_name=target.package_name, + render_ctx=self.render_ctx, + ) + if self.schema_yaml_vars.env_vars: + self.store_env_vars(target, schema_file_id, self.schema_yaml_vars.env_vars) + self.schema_yaml_vars.env_vars = {} + + except ParsingError as exc: + context = trimmed(str(target)) + msg = "Invalid test config given in {}:\n\t{}\n\t@: {}".format( + target.original_file_path, exc.msg, context + ) + raise ParsingError(msg) from exc + + except CompilationError as exc: + context = trimmed(str(target)) + msg = ( + "Invalid generic test configuration given in " + f"{target.original_file_path}: \n{exc.msg}\n\t@: {context}" + ) + raise CompilationError(msg) from exc + + original_name = os.path.basename(target.original_file_path) + compiled_path = get_pseudo_test_path(builder.compiled_name, original_name) + + # fqn is the relative path of the yaml file where this generic test is defined, + # minus the project-level directory and the file name itself + # TODO pass a consistent path object from both UnparsedNode and UnpatchedSourceDefinition + path = pathlib.Path(target.original_file_path) + relative_path = str(path.relative_to(*path.parts[:1])) + fqn = self.get_fqn(relative_path, builder.fqn_name) + + # this is the ContextConfig that is used in render_update + config: ContextConfig = self.initial_config(fqn) + + # builder.args contains keyword args for the test macro, + # not configs which have been separated out in the builder. + # The keyword args are not completely rendered until compilation. + metadata = { + "namespace": builder.namespace, + "name": builder.name, + "kwargs": builder.args, + } + tags = sorted(set(itertools.chain(tags, builder.tags()))) + + if isinstance(target, UnpatchedSourceDefinition): + file_key_name = f"{target.source.yaml_key}.{target.source.name}" + else: + file_key_name = f"{target.yaml_key}.{target.name}" + + node = self.create_test_node( + target=target, + path=compiled_path, + config=config, + fqn=fqn, + tags=tags, + name=builder.fqn_name, + raw_code=builder.build_raw_code(), + column_name=column_name, + test_metadata=metadata, + file_key_name=file_key_name, + ) + self.render_test_update(node, config, builder, schema_file_id) + + return node + + def _lookup_attached_node( + self, target: Testable, version: Optional[NodeVersion] + ) -> Optional[Union[ManifestNode, GraphMemberNode]]: + """Look up attached node for Testable target nodes other than sources. Can be None if generic test attached to SQL node with no corresponding .sql file.""" + attached_node = None # type: Optional[Union[ManifestNode, GraphMemberNode]] + if not isinstance(target, UnpatchedSourceDefinition): + attached_node_unique_id = self.manifest.ref_lookup.get_unique_id( + target.name, None, version + ) + if attached_node_unique_id: + attached_node = self.manifest.nodes[attached_node_unique_id] + else: + disabled_node = self.manifest.disabled_lookup.find( + target.name, None + ) or self.manifest.disabled_lookup.find(target.name.upper(), None) + if disabled_node: + attached_node = self.manifest.disabled[disabled_node[0].unique_id][0] + return attached_node + + def store_env_vars(self, target, schema_file_id, env_vars): + self.manifest.env_vars.update(env_vars) + if schema_file_id in self.manifest.files: + schema_file = self.manifest.files[schema_file_id] + if isinstance(target, UnpatchedSourceDefinition): + search_name = target.source.name + yaml_key = target.source.yaml_key + if "." in search_name: # source file definitions + (search_name, _) = search_name.split(".") + else: + search_name = target.name + yaml_key = target.yaml_key + for var in env_vars.keys(): + schema_file.add_env_var(var, yaml_key, search_name) + + # This does special shortcut processing for the two + # most common internal macros, not_null and unique, + # which avoids the jinja rendering to resolve config + # and variables, etc, which might be in the macro. + # In the future we will look at generalizing this + # more to handle additional macros or to use static + # parsing to avoid jinja overhead. + def render_test_update(self, node, config, builder, schema_file_id): + macro_unique_id = self.macro_resolver.get_macro_id( + node.package_name, "test_" + builder.name + ) + # Add the depends_on here so we can limit the macros added + # to the context in rendering processing + node.depends_on.add_macro(macro_unique_id) + if macro_unique_id in ["macro.dbt.test_not_null", "macro.dbt.test_unique"]: + config_call_dict = builder.get_static_config() + config._config_call_dict = config_call_dict + # This sets the config from dbt_project + self.update_parsed_node_config(node, config) + # source node tests are processed at patch_source time + if isinstance(builder.target, UnpatchedSourceDefinition): + sources = [builder.target.fqn[-2], builder.target.fqn[-1]] + node.sources.append(sources) + else: # all other nodes + node.refs.append(RefArgs(name=builder.target.name, version=builder.version)) + else: + try: + # make a base context that doesn't have the magic kwargs field + context = generate_test_context( + node, + self.root_project, + self.manifest, + config, + self.macro_resolver, + ) + # update with rendered test kwargs (which collects any refs) + # Note: This does not actually update the kwargs with the rendered + # values. That happens in compilation. + add_rendered_test_kwargs(context, node, capture_macros=True) + # the parsed node is not rendered in the native context. + get_rendered(node.raw_code, context, node, capture_macros=True) + self.update_parsed_node_config(node, config) + # env_vars should have been updated in the context env_var method + except ValidationError as exc: + # we got a ValidationError - probably bad types in config() + raise SchemaConfigError(exc, node=node) from exc + + # Set attached_node for generic test nodes, if available. + # Generic test node inherits attached node's group config value. + attached_node = self._lookup_attached_node(builder.target, builder.version) + if attached_node: + node.attached_node = attached_node.unique_id + node.group, node.group = attached_node.group, attached_node.group + + def parse_node(self, block: GenericTestBlock) -> GenericTestNode: + """In schema parsing, we rewrite most of the part of parse_node that + builds the initial node to be parsed, but rendering is basically the + same + """ + node = self.parse_generic_test( + target=block.target, + test=block.test, + tags=block.tags, + column_name=block.column_name, + schema_file_id=block.file.file_id, + version=block.version, + ) + self.add_test_node(block, node) + return node + + def add_test_node(self, block: GenericTestBlock, node: GenericTestNode): + test_from = {"key": block.target.yaml_key, "name": block.target.name} + if node.config.enabled: + self.manifest.add_node(block.file, node, test_from) + else: + self.manifest.add_disabled(block.file, node, test_from) + + def render_with_context( + self, + node: GenericTestNode, + config: ContextConfig, + ) -> None: + """Given the parsed node and a ContextConfig to use during + parsing, collect all the refs that might be squirreled away in the test + arguments. This includes the implicit "model" argument. + """ + # make a base context that doesn't have the magic kwargs field + context = self._context_for(node, config) + # update it with the rendered test kwargs (which collects any refs) + add_rendered_test_kwargs(context, node, capture_macros=True) + + # the parsed node is not rendered in the native context. + get_rendered(node.raw_code, context, node, capture_macros=True) + + def parse_test( + self, + target_block: TestBlock, + test: TestDef, + column: Optional[UnparsedColumn], + version: Optional[NodeVersion], + ) -> None: + if isinstance(test, str): + test = {test: {}} + + if column is None: + column_name: Optional[str] = None + column_tags: List[str] = [] + else: + column_name = column.name + should_quote = column.quote or (column.quote is None and target_block.quote_columns) + if should_quote: + column_name = get_adapter(self.root_project).quote(column_name) + column_tags = column.tags + + block = GenericTestBlock.from_test_block( + src=target_block, + test=test, + column_name=column_name, + tags=column_tags, + version=version, + ) + self.parse_node(block) + + def parse_tests(self, block: TestBlock) -> None: + for column in block.columns: + self.parse_column_tests(block, column, None) + + for test in block.tests: + self.parse_test(block, test, None, None) + + def parse_versioned_tests(self, block: VersionedTestBlock) -> None: + if not block.target.versions: + self.parse_tests(block) + else: + for version in block.target.versions: + for column in block.target.get_columns_for_version(version.v): + self.parse_column_tests(block, column, version.v) + + for test in block.target.get_tests_for_version(version.v): + self.parse_test(block, test, None, version.v) + + def generate_unique_id(self, resource_name: str, hash: Optional[str] = None) -> str: + return ".".join( + filter(None, [self.resource_type, self.project.project_name, resource_name, hash]) + ) diff --git a/core/dbt/parser/schema_yaml_readers.py b/core/dbt/parser/schema_yaml_readers.py new file mode 100644 index 00000000000..4a5863102c1 --- /dev/null +++ b/core/dbt/parser/schema_yaml_readers.py @@ -0,0 +1,271 @@ +from dbt.parser.schemas import YamlReader, SchemaParser +from dbt.parser.common import YamlBlock +from dbt.node_types import NodeType +from dbt.contracts.graph.unparsed import UnparsedExposure, UnparsedMetric, UnparsedGroup +from dbt.contracts.graph.nodes import Exposure, Metric, Group +from dbt.exceptions import DbtInternalError, YamlParseDictError, JSONValidationError +from dbt.context.providers import generate_parse_exposure, generate_parse_metrics +from dbt.contracts.graph.model_config import MetricConfig, ExposureConfig +from dbt.context.context_config import ( + BaseContextConfigGenerator, + ContextConfigGenerator, + UnrenderedConfigGenerator, +) +from dbt.clients.jinja import get_rendered +from typing import List +from dbt.dataclass_schema import ValidationError + + +class ExposureParser(YamlReader): + def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): + super().__init__(schema_parser, yaml, NodeType.Exposure.pluralize()) + self.schema_parser = schema_parser + self.yaml = yaml + + def parse_exposure(self, unparsed: UnparsedExposure): + package_name = self.project.project_name + unique_id = f"{NodeType.Exposure}.{package_name}.{unparsed.name}" + path = self.yaml.path.relative_path + + fqn = self.schema_parser.get_fqn_prefix(path) + fqn.append(unparsed.name) + + config = self._generate_exposure_config( + target=unparsed, + fqn=fqn, + package_name=package_name, + rendered=True, + ) + + config = config.finalize_and_validate() + + unrendered_config = self._generate_exposure_config( + target=unparsed, + fqn=fqn, + package_name=package_name, + rendered=False, + ) + + if not isinstance(config, ExposureConfig): + raise DbtInternalError( + f"Calculated a {type(config)} for an exposure, but expected an ExposureConfig" + ) + + parsed = Exposure( + resource_type=NodeType.Exposure, + package_name=package_name, + path=path, + original_file_path=self.yaml.path.original_file_path, + unique_id=unique_id, + fqn=fqn, + name=unparsed.name, + type=unparsed.type, + url=unparsed.url, + meta=unparsed.meta, + tags=unparsed.tags, + description=unparsed.description, + label=unparsed.label, + owner=unparsed.owner, + maturity=unparsed.maturity, + config=config, + unrendered_config=unrendered_config, + ) + ctx = generate_parse_exposure( + parsed, + self.root_project, + self.schema_parser.manifest, + package_name, + ) + depends_on_jinja = "\n".join("{{ " + line + "}}" for line in unparsed.depends_on) + get_rendered(depends_on_jinja, ctx, parsed, capture_macros=True) + # parsed now has a populated refs/sources/metrics + + if parsed.config.enabled: + self.manifest.add_exposure(self.yaml.file, parsed) + else: + self.manifest.add_disabled(self.yaml.file, parsed) + + def _generate_exposure_config( + self, target: UnparsedExposure, fqn: List[str], package_name: str, rendered: bool + ): + generator: BaseContextConfigGenerator + if rendered: + generator = ContextConfigGenerator(self.root_project) + else: + generator = UnrenderedConfigGenerator(self.root_project) + + # configs with precendence set + precedence_configs = dict() + # apply exposure configs + precedence_configs.update(target.config) + + return generator.calculate_node_config( + config_call_dict={}, + fqn=fqn, + resource_type=NodeType.Exposure, + project_name=package_name, + base=False, + patch_config_dict=precedence_configs, + ) + + def parse(self): + for data in self.get_key_dicts(): + try: + UnparsedExposure.validate(data) + unparsed = UnparsedExposure.from_dict(data) + except (ValidationError, JSONValidationError) as exc: + raise YamlParseDictError(self.yaml.path, self.key, data, exc) + + self.parse_exposure(unparsed) + + +class MetricParser(YamlReader): + def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): + super().__init__(schema_parser, yaml, NodeType.Metric.pluralize()) + self.schema_parser = schema_parser + self.yaml = yaml + + def parse_metric(self, unparsed: UnparsedMetric): + package_name = self.project.project_name + unique_id = f"{NodeType.Metric}.{package_name}.{unparsed.name}" + path = self.yaml.path.relative_path + + fqn = self.schema_parser.get_fqn_prefix(path) + fqn.append(unparsed.name) + + config = self._generate_metric_config( + target=unparsed, + fqn=fqn, + package_name=package_name, + rendered=True, + ) + + config = config.finalize_and_validate() + + unrendered_config = self._generate_metric_config( + target=unparsed, + fqn=fqn, + package_name=package_name, + rendered=False, + ) + + if not isinstance(config, MetricConfig): + raise DbtInternalError( + f"Calculated a {type(config)} for a metric, but expected a MetricConfig" + ) + + parsed = Metric( + resource_type=NodeType.Metric, + package_name=package_name, + path=path, + original_file_path=self.yaml.path.original_file_path, + unique_id=unique_id, + fqn=fqn, + model=unparsed.model, + name=unparsed.name, + description=unparsed.description, + label=unparsed.label, + calculation_method=unparsed.calculation_method, + expression=str(unparsed.expression), + timestamp=unparsed.timestamp, + dimensions=unparsed.dimensions, + window=unparsed.window, + time_grains=unparsed.time_grains, + filters=unparsed.filters, + meta=unparsed.meta, + tags=unparsed.tags, + config=config, + unrendered_config=unrendered_config, + group=config.group, + ) + + ctx = generate_parse_metrics( + parsed, + self.root_project, + self.schema_parser.manifest, + package_name, + ) + + if parsed.model is not None: + model_ref = "{{ " + parsed.model + " }}" + get_rendered(model_ref, ctx, parsed) + + parsed.expression = get_rendered( + parsed.expression, + ctx, + node=parsed, + ) + + # if the metric is disabled we do not want it included in the manifest, only in the disabled dict + if parsed.config.enabled: + self.manifest.add_metric(self.yaml.file, parsed) + else: + self.manifest.add_disabled(self.yaml.file, parsed) + + def _generate_metric_config( + self, target: UnparsedMetric, fqn: List[str], package_name: str, rendered: bool + ): + generator: BaseContextConfigGenerator + if rendered: + generator = ContextConfigGenerator(self.root_project) + else: + generator = UnrenderedConfigGenerator(self.root_project) + + # configs with precendence set + precedence_configs = dict() + # first apply metric configs + precedence_configs.update(target.config) + + config = generator.calculate_node_config( + config_call_dict={}, + fqn=fqn, + resource_type=NodeType.Metric, + project_name=package_name, + base=False, + patch_config_dict=precedence_configs, + ) + return config + + def parse(self): + for data in self.get_key_dicts(): + try: + UnparsedMetric.validate(data) + unparsed = UnparsedMetric.from_dict(data) + + except (ValidationError, JSONValidationError) as exc: + raise YamlParseDictError(self.yaml.path, self.key, data, exc) + self.parse_metric(unparsed) + + +class GroupParser(YamlReader): + def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): + super().__init__(schema_parser, yaml, NodeType.Group.pluralize()) + self.schema_parser = schema_parser + self.yaml = yaml + + def parse_group(self, unparsed: UnparsedGroup): + package_name = self.project.project_name + unique_id = f"{NodeType.Group}.{package_name}.{unparsed.name}" + path = self.yaml.path.relative_path + + parsed = Group( + resource_type=NodeType.Group, + package_name=package_name, + path=path, + original_file_path=self.yaml.path.original_file_path, + unique_id=unique_id, + name=unparsed.name, + owner=unparsed.owner, + ) + + self.manifest.add_group(self.yaml.file, parsed) + + def parse(self): + for data in self.get_key_dicts(): + try: + UnparsedGroup.validate(data) + unparsed = UnparsedGroup.from_dict(data) + except (ValidationError, JSONValidationError) as exc: + raise YamlParseDictError(self.yaml.path, self.key, data, exc) + + self.parse_group(unparsed) diff --git a/core/dbt/parser/schemas.py b/core/dbt/parser/schemas.py index 727824f323e..0d187735f29 100644 --- a/core/dbt/parser/schemas.py +++ b/core/dbt/parser/schemas.py @@ -1,45 +1,21 @@ -import itertools -import os -import pathlib +import time from abc import ABCMeta, abstractmethod -from typing import Iterable, Dict, Any, Union, List, Optional, Generic, TypeVar, Type, Callable +from typing import Iterable, Dict, Any, List, Generic, TypeVar, Type, Callable from dataclasses import dataclass, field from dbt.dataclass_schema import ValidationError, dbtClassMixin -from dbt.adapters.factory import get_adapter, get_adapter_package_names -from dbt.clients.jinja import get_rendered, add_rendered_test_kwargs from dbt.clients.yaml_helper import load_yaml_text -from dbt.context.providers import RefArgs from dbt.parser.schema_renderer import SchemaYamlRenderer -from dbt.context.context_config import ( - ContextConfig, - BaseContextConfigGenerator, - ContextConfigGenerator, - UnrenderedConfigGenerator, -) +from dbt.parser.schema_generic_tests import SchemaGenericTestParser +from dbt.context.context_config import ContextConfig from dbt.context.configured import generate_schema_yml_context, SchemaYamlVars -from dbt.context.providers import ( - generate_parse_exposure, - generate_parse_metrics, - generate_test_context, -) -from dbt.context.macro_resolver import MacroResolver -from dbt.contracts.files import FileHash, SchemaSourceFile -from dbt.contracts.graph.model_config import MetricConfig, ExposureConfig +from dbt.contracts.files import SchemaSourceFile from dbt.contracts.graph.nodes import ( ParsedNodePatch, - ColumnInfo, - ColumnLevelConstraint, - GenericTestNode, ParsedMacroPatch, UnpatchedSourceDefinition, - Exposure, - Metric, - Group, - ManifestNode, - GraphMemberNode, ConstraintType, ModelNode, ModelLevelConstraint, @@ -47,53 +23,46 @@ from dbt.contracts.graph.unparsed import ( HasColumnDocs, HasColumnTests, - HasColumnProps, SourcePatch, UnparsedAnalysisUpdate, - UnparsedColumn, UnparsedMacroUpdate, UnparsedNodeUpdate, UnparsedModelUpdate, - UnparsedExposure, - UnparsedMetric, UnparsedSourceDefinition, - UnparsedGroup, - NodeVersion, ) from dbt.exceptions import ( - CompilationError, DuplicateMacroPatchNameError, DuplicatePatchPathError, DuplicateSourcePatchNameError, JSONValidationError, DbtInternalError, - SchemaConfigError, - TestConfigError, ParsingError, DbtValidationError, YamlLoadError, YamlParseDictError, YamlParseListError, + InvalidAccessTypeError, ) from dbt.events.functions import warn_or_error -from dbt.events.types import WrongResourceSchemaFile, NoNodeForYamlKey, MacroNotFoundForPatch -from dbt.node_types import NodeType +from dbt.events.types import ( + WrongResourceSchemaFile, + NoNodeForYamlKey, + MacroNotFoundForPatch, + ValidationWarning, +) +from dbt.node_types import NodeType, AccessType from dbt.parser.base import SimpleParser from dbt.parser.search import FileBlock -from dbt.parser.generic_test_builders import ( - TestBuilder, - GenericTestBlock, - TargetBlock, +from dbt.parser.common import ( YamlBlock, + TargetBlock, TestBlock, VersionedTestBlock, - Testable, - Versioned, + ParserRef, + trimmed, ) -from dbt.utils import get_pseudo_test_path, coerce_dict_str, md5, deep_merge - +from dbt.utils import coerce_dict_str, deep_merge -TestDef = Union[str, Dict[str, Any]] schema_file_keys = ( "models", @@ -107,6 +76,36 @@ ) +# =============================================================================== +# Schema Parser classes +# +# The SchemaParser is a subclass of the SimpleParser from base.py, as is +# the SchemaGenericTestParser. The schema sub-parsers are all subclasses of +# the YamlReader parsing class. Most of the action in creating SourceDefinition +# nodes actually happens in the SourcePatcher class, in sources.py, which is +# called as a late-stage parsing step in manifest.py. +# +# The "patch" parsers read yaml config and properties and apply them to +# nodes that were already created from sql files. +# +# The SchemaParser and SourcePatcher both use the SchemaGenericTestParser +# (in schema_generic_tests.py) to create generic test nodes. +# +# YamlReader +# MetricParser (metrics) [schema_yaml_readers.py] +# ExposureParser (exposures) [schema_yaml_readers.py] +# GroupParser (groups) [schema_yaml_readers.py] +# SourceParser (sources) +# PatchParser +# MacroPatchParser (macros) +# NodePatchParser +# ModelPatchParser (models) +# AnalysisPatchParser (analyses) +# TestablePatchParser (seeds, snapshots) +# +# =============================================================================== + + def yaml_from_file(source_file: SchemaSourceFile) -> Dict[str, Any]: """If loading the yaml fails, raise an exception.""" try: @@ -118,61 +117,9 @@ def yaml_from_file(source_file: SchemaSourceFile) -> Dict[str, Any]: ) -class ParserRef: - """A helper object to hold parse-time references.""" - - def __init__(self): - self.column_info: Dict[str, ColumnInfo] = {} - - def _add(self, column: HasColumnProps): - tags: List[str] = [] - tags.extend(getattr(column, "tags", ())) - quote: Optional[bool] - if isinstance(column, UnparsedColumn): - quote = column.quote - else: - quote = None - - if any( - c - for c in column.constraints - if "type" not in c or not ConstraintType.is_valid(c["type"]) - ): - raise ParsingError(f"Invalid constraint type on column {column.name}") - - self.column_info[column.name] = ColumnInfo( - name=column.name, - description=column.description, - data_type=column.data_type, - constraints=[ColumnLevelConstraint.from_dict(c) for c in column.constraints], - meta=column.meta, - tags=tags, - quote=quote, - _extra=column.extra, - ) - - @classmethod - def from_target(cls, target: Union[HasColumnDocs, HasColumnTests]) -> "ParserRef": - refs = cls() - for column in target.columns: - refs._add(column) - return refs - - @classmethod - def from_versioned_target(cls, target: Versioned, version: NodeVersion) -> "ParserRef": - refs = cls() - for base_column in target.get_columns_for_version(version): - refs._add(base_column) - return refs - - -def _trimmed(inp: str) -> str: - if len(inp) < 50: - return inp - return inp[:44] + "..." + inp[-3:] - - -class SchemaParser(SimpleParser[GenericTestBlock, GenericTestNode]): +# This is the main schema file parser, but almost everything happens in the +# the schema sub-parsers. +class SchemaParser(SimpleParser[YamlBlock, ModelNode]): def __init__( self, project, @@ -181,14 +128,12 @@ def __init__( ) -> None: super().__init__(project, manifest, root_project) + self.generic_test_parser = SchemaGenericTestParser(project, manifest, root_project) + self.schema_yaml_vars = SchemaYamlVars() self.render_ctx = generate_schema_yml_context( self.root_project, self.project.project_name, self.schema_yaml_vars ) - internal_package_names = get_adapter_package_names(self.root_project.credentials.type) - self.macro_resolver = MacroResolver( - self.manifest.macros, self.root_project.project_name, internal_package_names - ) @classmethod def get_compiled_path(cls, block: FileBlock) -> str: @@ -199,342 +144,6 @@ def get_compiled_path(cls, block: FileBlock) -> str: def resource_type(self) -> NodeType: return NodeType.Test - def parse_from_dict(self, dct, validate=True) -> GenericTestNode: - if validate: - GenericTestNode.validate(dct) - return GenericTestNode.from_dict(dct) - - def parse_column_tests( - self, block: TestBlock, column: UnparsedColumn, version: Optional[NodeVersion] - ) -> None: - if not column.tests: - return - - for test in column.tests: - self.parse_test(block, test, column, version) - - def create_test_node( - self, - target: Union[UnpatchedSourceDefinition, UnparsedNodeUpdate], - path: str, - config: ContextConfig, - tags: List[str], - fqn: List[str], - name: str, - raw_code: str, - test_metadata: Dict[str, Any], - file_key_name: str, - column_name: Optional[str], - ) -> GenericTestNode: - - HASH_LENGTH = 10 - - # N.B: This function builds a hashable string from any given test_metadata dict. - # it's a bit fragile for general use (only supports str, int, float, List, Dict) - # but it gets the job done here without the overhead of complete ser(de). - def get_hashable_md(data: Union[str, int, float, List, Dict]) -> Union[str, List, Dict]: - if type(data) == dict: - return {k: get_hashable_md(data[k]) for k in sorted(data.keys())} # type: ignore - elif type(data) == list: - return [get_hashable_md(val) for val in data] # type: ignore - else: - return str(data) - - hashable_metadata = repr(get_hashable_md(test_metadata)) - hash_string = "".join([name, hashable_metadata]) - test_hash = md5(hash_string)[-HASH_LENGTH:] - - dct = { - "alias": name, - "schema": self.default_schema, - "database": self.default_database, - "fqn": fqn, - "name": name, - "resource_type": self.resource_type, - "tags": tags, - "path": path, - "original_file_path": target.original_file_path, - "package_name": self.project.project_name, - "raw_code": raw_code, - "language": "sql", - "unique_id": self.generate_unique_id(name, test_hash), - "config": self.config_dict(config), - "test_metadata": test_metadata, - "column_name": column_name, - "checksum": FileHash.empty().to_dict(omit_none=True), - "file_key_name": file_key_name, - } - try: - GenericTestNode.validate(dct) - return GenericTestNode.from_dict(dct) - except ValidationError as exc: - # this is a bit silly, but build an UnparsedNode just for error - # message reasons - node = self._create_error_node( - name=target.name, - path=path, - original_file_path=target.original_file_path, - raw_code=raw_code, - ) - raise TestConfigError(exc, node) - - # lots of time spent in this method - def _parse_generic_test( - self, - target: Testable, - test: Dict[str, Any], - tags: List[str], - column_name: Optional[str], - schema_file_id: str, - version: Optional[NodeVersion], - ) -> GenericTestNode: - try: - builder = TestBuilder( - test=test, - target=target, - column_name=column_name, - version=version, - package_name=target.package_name, - render_ctx=self.render_ctx, - ) - if self.schema_yaml_vars.env_vars: - self.store_env_vars(target, schema_file_id, self.schema_yaml_vars.env_vars) - self.schema_yaml_vars.env_vars = {} - - except ParsingError as exc: - context = _trimmed(str(target)) - msg = "Invalid test config given in {}:\n\t{}\n\t@: {}".format( - target.original_file_path, exc.msg, context - ) - raise ParsingError(msg) from exc - - except CompilationError as exc: - context = _trimmed(str(target)) - msg = ( - "Invalid generic test configuration given in " - f"{target.original_file_path}: \n{exc.msg}\n\t@: {context}" - ) - raise CompilationError(msg) from exc - - original_name = os.path.basename(target.original_file_path) - compiled_path = get_pseudo_test_path(builder.compiled_name, original_name) - - # fqn is the relative path of the yaml file where this generic test is defined, - # minus the project-level directory and the file name itself - # TODO pass a consistent path object from both UnparsedNode and UnpatchedSourceDefinition - path = pathlib.Path(target.original_file_path) - relative_path = str(path.relative_to(*path.parts[:1])) - fqn = self.get_fqn(relative_path, builder.fqn_name) - - # this is the ContextConfig that is used in render_update - config: ContextConfig = self.initial_config(fqn) - - # builder.args contains keyword args for the test macro, - # not configs which have been separated out in the builder. - # The keyword args are not completely rendered until compilation. - metadata = { - "namespace": builder.namespace, - "name": builder.name, - "kwargs": builder.args, - } - tags = sorted(set(itertools.chain(tags, builder.tags()))) - - if isinstance(target, UnpatchedSourceDefinition): - file_key_name = f"{target.source.yaml_key}.{target.source.name}" - else: - file_key_name = f"{target.yaml_key}.{target.name}" - - node = self.create_test_node( - target=target, - path=compiled_path, - config=config, - fqn=fqn, - tags=tags, - name=builder.fqn_name, - raw_code=builder.build_raw_code(), - column_name=column_name, - test_metadata=metadata, - file_key_name=file_key_name, - ) - self.render_test_update(node, config, builder, schema_file_id) - - return node - - def _lookup_attached_node( - self, target: Testable, version: Optional[NodeVersion] - ) -> Optional[Union[ManifestNode, GraphMemberNode]]: - """Look up attached node for Testable target nodes other than sources. Can be None if generic test attached to SQL node with no corresponding .sql file.""" - attached_node = None # type: Optional[Union[ManifestNode, GraphMemberNode]] - if not isinstance(target, UnpatchedSourceDefinition): - attached_node_unique_id = self.manifest.ref_lookup.get_unique_id( - target.name, None, version - ) - if attached_node_unique_id: - attached_node = self.manifest.nodes[attached_node_unique_id] - else: - disabled_node = self.manifest.disabled_lookup.find( - target.name, None - ) or self.manifest.disabled_lookup.find(target.name.upper(), None) - if disabled_node: - attached_node = self.manifest.disabled[disabled_node[0].unique_id][0] - return attached_node - - def store_env_vars(self, target, schema_file_id, env_vars): - self.manifest.env_vars.update(env_vars) - if schema_file_id in self.manifest.files: - schema_file = self.manifest.files[schema_file_id] - if isinstance(target, UnpatchedSourceDefinition): - search_name = target.source.name - yaml_key = target.source.yaml_key - if "." in search_name: # source file definitions - (search_name, _) = search_name.split(".") - else: - search_name = target.name - yaml_key = target.yaml_key - for var in env_vars.keys(): - schema_file.add_env_var(var, yaml_key, search_name) - - # This does special shortcut processing for the two - # most common internal macros, not_null and unique, - # which avoids the jinja rendering to resolve config - # and variables, etc, which might be in the macro. - # In the future we will look at generalizing this - # more to handle additional macros or to use static - # parsing to avoid jinja overhead. - def render_test_update(self, node, config, builder, schema_file_id): - macro_unique_id = self.macro_resolver.get_macro_id( - node.package_name, "test_" + builder.name - ) - # Add the depends_on here so we can limit the macros added - # to the context in rendering processing - node.depends_on.add_macro(macro_unique_id) - if macro_unique_id in ["macro.dbt.test_not_null", "macro.dbt.test_unique"]: - config_call_dict = builder.get_static_config() - config._config_call_dict = config_call_dict - # This sets the config from dbt_project - self.update_parsed_node_config(node, config) - # source node tests are processed at patch_source time - if isinstance(builder.target, UnpatchedSourceDefinition): - sources = [builder.target.fqn[-2], builder.target.fqn[-1]] - node.sources.append(sources) - else: # all other nodes - node.refs.append(RefArgs(name=builder.target.name, version=builder.version)) - else: - try: - # make a base context that doesn't have the magic kwargs field - context = generate_test_context( - node, - self.root_project, - self.manifest, - config, - self.macro_resolver, - ) - # update with rendered test kwargs (which collects any refs) - # Note: This does not actually update the kwargs with the rendered - # values. That happens in compilation. - add_rendered_test_kwargs(context, node, capture_macros=True) - # the parsed node is not rendered in the native context. - get_rendered(node.raw_code, context, node, capture_macros=True) - self.update_parsed_node_config(node, config) - # env_vars should have been updated in the context env_var method - except ValidationError as exc: - # we got a ValidationError - probably bad types in config() - raise SchemaConfigError(exc, node=node) from exc - - # Set attached_node for generic test nodes, if available. - # Generic test node inherits attached node's group config value. - attached_node = self._lookup_attached_node(builder.target, builder.version) - if attached_node: - node.attached_node = attached_node.unique_id - node.group, node.group = attached_node.group, attached_node.group - - def parse_node(self, block: GenericTestBlock) -> GenericTestNode: - """In schema parsing, we rewrite most of the part of parse_node that - builds the initial node to be parsed, but rendering is basically the - same - """ - node = self._parse_generic_test( - target=block.target, - test=block.test, - tags=block.tags, - column_name=block.column_name, - schema_file_id=block.file.file_id, - version=block.version, - ) - self.add_test_node(block, node) - return node - - def add_test_node(self, block: GenericTestBlock, node: GenericTestNode): - test_from = {"key": block.target.yaml_key, "name": block.target.name} - if node.config.enabled: - self.manifest.add_node(block.file, node, test_from) - else: - self.manifest.add_disabled(block.file, node, test_from) - - def render_with_context( - self, - node: GenericTestNode, - config: ContextConfig, - ) -> None: - """Given the parsed node and a ContextConfig to use during - parsing, collect all the refs that might be squirreled away in the test - arguments. This includes the implicit "model" argument. - """ - # make a base context that doesn't have the magic kwargs field - context = self._context_for(node, config) - # update it with the rendered test kwargs (which collects any refs) - add_rendered_test_kwargs(context, node, capture_macros=True) - - # the parsed node is not rendered in the native context. - get_rendered(node.raw_code, context, node, capture_macros=True) - - def parse_test( - self, - target_block: TestBlock, - test: TestDef, - column: Optional[UnparsedColumn], - version: Optional[NodeVersion], - ) -> None: - if isinstance(test, str): - test = {test: {}} - - if column is None: - column_name: Optional[str] = None - column_tags: List[str] = [] - else: - column_name = column.name - should_quote = column.quote or (column.quote is None and target_block.quote_columns) - if should_quote: - column_name = get_adapter(self.root_project).quote(column_name) - column_tags = column.tags - - block = GenericTestBlock.from_test_block( - src=target_block, - test=test, - column_name=column_name, - tags=column_tags, - version=version, - ) - self.parse_node(block) - - def parse_tests(self, block: TestBlock) -> None: - for column in block.columns: - self.parse_column_tests(block, column, None) - - for test in block.tests: - self.parse_test(block, test, None, None) - - def parse_versioned_tests(self, block: VersionedTestBlock) -> None: - if not block.target.versions: - self.parse_tests(block) - else: - for version in block.target.versions: - for column in block.target.get_columns_for_version(version.v): - self.parse_column_tests(block, column, version.v) - - for test in block.target.get_tests_for_version(version.v): - self.parse_test(block, test, None, version.v) - def parse_file(self, block: FileBlock, dct: Dict = None) -> None: assert isinstance(block.file, SchemaSourceFile) @@ -544,10 +153,10 @@ def parse_file(self, block: FileBlock, dct: Dict = None) -> None: # contains the FileBlock and the data (dictionary) yaml_block = YamlBlock.from_file_block(block, dct) - parser: YamlDocsReader + parser: YamlReader - # There are 7 kinds of parsers: - # Model, Seed, Snapshot, Source, Macro, Analysis, Exposures + # There are 9 different yaml lists which are parsed by different parsers: + # Model, Seed, Snapshot, Source, Macro, Analysis, Exposure, Metric, Group # ModelPatchParser.parse() if "models" in dct: @@ -555,19 +164,19 @@ def parse_file(self, block: FileBlock, dct: Dict = None) -> None: # even if they are disabled in the schema file model_parse_result = ModelPatchParser(self, yaml_block, "models").parse() for versioned_test_block in model_parse_result.versioned_test_blocks: - self.parse_versioned_tests(versioned_test_block) + self.generic_test_parser.parse_versioned_tests(versioned_test_block) - # NonSourceParser.parse() + # PatchParser.parse() if "seeds" in dct: seed_parse_result = TestablePatchParser(self, yaml_block, "seeds").parse() for test_block in seed_parse_result.test_blocks: - self.parse_tests(test_block) + self.generic_test_parser.parse_tests(test_block) - # NonSourceParser.parse() + # PatchParser.parse() if "snapshots" in dct: snapshot_parse_result = TestablePatchParser(self, yaml_block, "snapshots").parse() for test_block in snapshot_parse_result.test_blocks: - self.parse_tests(test_block) + self.generic_test_parser.parse_tests(test_block) # This parser uses SourceParser.parse() which doesn't return # any test blocks. Source tests are handled at a later point @@ -576,28 +185,34 @@ def parse_file(self, block: FileBlock, dct: Dict = None) -> None: parser = SourceParser(self, yaml_block, "sources") parser.parse() - # NonSourceParser.parse() (but never test_blocks) + # PatchParser.parse() (but never test_blocks) if "macros" in dct: parser = MacroPatchParser(self, yaml_block, "macros") parser.parse() - # NonSourceParser.parse() (but never test_blocks) + # PatchParser.parse() (but never test_blocks) if "analyses" in dct: parser = AnalysisPatchParser(self, yaml_block, "analyses") parser.parse() - # parse exposures + # ExposureParser.parse() if "exposures" in dct: + from dbt.parser.schema_yaml_readers import ExposureParser + exp_parser = ExposureParser(self, yaml_block) exp_parser.parse() - # parse metrics + # MetricParser.parse() if "metrics" in dct: + from dbt.parser.schema_yaml_readers import MetricParser + metric_parser = MetricParser(self, yaml_block) metric_parser.parse() - # parse groups + # GroupParser.parse() if "groups" in dct: + from dbt.parser.schema_yaml_readers import GroupParser + group_parser = GroupParser(self, yaml_block) group_parser.parse() @@ -620,6 +235,7 @@ class ParseResult: # abstract base class (ABCMeta) +# Four subclasses: MetricParser, ExposureParser, GroupParser, SourceParser, PatchParser class YamlReader(metaclass=ABCMeta): def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock, key: str) -> None: self.schema_parser = schema_parser @@ -659,7 +275,7 @@ def get_key_dicts(self) -> Iterable[Dict[str, Any]]: if not isinstance(data, list): raise ParsingError( "{} must be a list, got {} instead: ({})".format( - self.key, type(data), _trimmed(str(data)) + self.key, type(data), trimmed(str(data)) ) ) path = self.yaml.path.original_file_path @@ -699,8 +315,6 @@ def render_entry(self, dct): ) from exc return dct - -class YamlDocsReader(YamlReader): @abstractmethod def parse(self) -> ParseResult: raise NotImplementedError("parse is abstract") @@ -710,7 +324,7 @@ def parse(self) -> ParseResult: # This parses the 'sources' keys in yaml files. -class SourceParser(YamlDocsReader): +class SourceParser(YamlReader): def _target_from_dict(self, cls: Type[T], data: Dict[str, Any]) -> T: path = self.yaml.path.original_file_path try: @@ -719,8 +333,7 @@ def _target_from_dict(self, cls: Type[T], data: Dict[str, Any]) -> T: except (ValidationError, JSONValidationError) as exc: raise YamlParseDictError(path, self.key, data, exc) - # The other parse method returns TestBlocks. This one doesn't. - # This takes the yaml dictionaries in 'sources' keys and uses them + # This parse method takes the yaml dictionaries in 'sources' keys and uses them # to create UnparsedSourceDefinition objects. They are then turned # into UnpatchedSourceDefinition objects in 'add_source_definitions' # or SourcePatch objects in 'add_source_patch' @@ -771,9 +384,8 @@ def add_source_definitions(self, source: UnparsedSourceDefinition) -> None: self.manifest.add_source(self.yaml.file, source_def) -# This class has three main subclasses: TestablePatchParser (models, -# seeds, snapshots), MacroPatchParser, and AnalysisPatchParser -class NonSourceParser(YamlDocsReader, Generic[NonSourceTarget, Parsed]): +# This class has two subclasses: NodePatchParser and MacroPatchParser +class PatchParser(YamlReader, Generic[NonSourceTarget, Parsed]): @abstractmethod def _target_type(self) -> Type[NonSourceTarget]: raise NotImplementedError("_target_type not implemented") @@ -896,7 +508,9 @@ def patch_node_config(self, node, patch): self.schema_parser.update_parsed_node_config(node, config, patch_config_dict=patch.config) -class NodePatchParser(NonSourceParser[NodeTarget, ParsedNodePatch], Generic[NodeTarget]): +# Subclasses of NodePatchParser: TestablePatchParser, ModelPatchParser, AnalysisPatchParser, +# so models, seeds, snapshots, analyses +class NodePatchParser(PatchParser[NodeTarget, ParsedNodePatch], Generic[NodeTarget]): def parse_patch(self, block: TargetBlock[NodeTarget], refs: ParserRef) -> None: # We're not passing the ParsedNodePatch around anymore, so we # could possibly skip creating one. Leaving here for now for @@ -914,6 +528,7 @@ def parse_patch(self, block: TargetBlock[NodeTarget], refs: ParserRef) -> None: access=block.target.access, version=None, latest_version=None, + constraints=block.target.constraints, ) assert isinstance(self.yaml.file, SchemaSourceFile) source_file: SchemaSourceFile = self.yaml.file @@ -970,7 +585,7 @@ def parse_patch(self, block: TargetBlock[NodeTarget], refs: ParserRef) -> None: if patch.config: self.patch_node_config(node, patch) - node.patch(patch) + self.patch_node_properties(node, patch) else: warn_or_error( NoNodeForYamlKey( @@ -994,48 +609,30 @@ def parse_patch(self, block: TargetBlock[NodeTarget], refs: ParserRef) -> None: if patch.config: self.patch_node_config(node, patch) - node.patch(patch) - # TODO: We want to do all the actual patching either in the above node.patch() call - # or here, but it will require some thought to the details. For now the patching is - # awkwardly split. - self.patch_constraints(node, block.target.constraints) - node.build_contract_checksum() - - def patch_constraints(self, node, constraints): - contract_config = node.config.get("contract") - if isinstance(node, ModelNode) and contract_config.enforced is True: - self._validate_constraint_prerequisites(node) - - if any( - c for c in constraints if "type" not in c or not ConstraintType.is_valid(c["type"]) - ): - raise ParsingError( - f"Invalid constraint type on model {node.name}: " - f"Type must be one of {[ct.value for ct in ConstraintType]}" - ) - - node.constraints = [ModelLevelConstraint.from_dict(c) for c in constraints] - - def _validate_constraint_prerequisites(self, model_node: ModelNode): - errors = [] - if not model_node.columns: - errors.append( - "Constraints must be defined in a `yml` schema configuration file like `schema.yml`." - ) - - if model_node.config.materialized not in ["table", "view", "incremental"]: - errors.append( - f"Only table, view, and incremental materializations are supported for constraints, but found '{model_node.config.materialized}'" - ) - - if str(model_node.language) != "sql": - errors.append(f"Language Error: Expected 'sql' but found '{model_node.language}'") - - if errors: - raise ParsingError( - f"Constraint validation failed for: ({model_node.original_file_path})\n" - + "\n".join(errors) - ) + self.patch_node_properties(node, patch) + + def patch_node_properties(self, node, patch: "ParsedNodePatch"): + """Given a ParsedNodePatch, add the new information to the node.""" + # explicitly pick out the parts to update so we don't inadvertently + # step on the model name or anything + # Note: config should already be updated + node.patch_path = patch.file_id + # update created_at so process_docs will run in partial parsing + node.created_at = time.time() + node.description = patch.description + node.columns = patch.columns + node.name = patch.name + + if not isinstance(node, ModelNode): + for attr in ["latest_version", "access", "version", "constraints"]: + if getattr(patch, attr): + warn_or_error( + ValidationWarning( + field_name=attr, + resource_type=node.resource_type.value, + node_name=patch.name, + ) + ) # TestablePatchParser = seeds, snapshots @@ -1163,17 +760,12 @@ def parse_patch(self, block: TargetBlock[UnparsedModelUpdate], refs: ParserRef) access=unparsed_version.access or target.access, version=unparsed_version.v, latest_version=latest_version, + constraints=unparsed_version.constraints or target.constraints, ) # Node patched before config because config patching depends on model name, # which may have been updated in the version patch - versioned_model_node.patch(versioned_model_patch) - # TODO: We want to do all the actual patching either in the above node.patch() call - # or here, but it will require some thought to the details. For now the patching is - # awkwardly split. - self.patch_constraints( - versioned_model_node, unparsed_version.constraints or target.constraints - ) - versioned_model_node.build_contract_checksum() + # versioned_model_node.patch(versioned_model_patch) + self.patch_node_properties(versioned_model_node, versioned_model_patch) # Includes alias recomputation self.patch_node_config(versioned_model_node, versioned_model_patch) @@ -1186,6 +778,57 @@ def parse_patch(self, block: TargetBlock[UnparsedModelUpdate], refs: ParserRef) def _target_type(self) -> Type[UnparsedModelUpdate]: return UnparsedModelUpdate + def patch_node_properties(self, node, patch: "ParsedNodePatch"): + super().patch_node_properties(node, patch) + node.version = patch.version + node.latest_version = patch.latest_version + if patch.access: + if AccessType.is_valid(patch.access): + node.access = AccessType(patch.access) + else: + raise InvalidAccessTypeError( + unique_id=node.unique_id, + field_value=patch.access, + ) + self.patch_constraints(node, patch.constraints) + node.build_contract_checksum() + + def patch_constraints(self, node, constraints): + contract_config = node.config.get("contract") + if contract_config.enforced is True: + self._validate_constraint_prerequisites(node) + + if any( + c for c in constraints if "type" not in c or not ConstraintType.is_valid(c["type"]) + ): + raise ParsingError( + f"Invalid constraint type on model {node.name}: " + f"Type must be one of {[ct.value for ct in ConstraintType]}" + ) + + node.constraints = [ModelLevelConstraint.from_dict(c) for c in constraints] + + def _validate_constraint_prerequisites(self, model_node: ModelNode): + errors = [] + if not model_node.columns: + errors.append( + "Constraints must be defined in a `yml` schema configuration file like `schema.yml`." + ) + + if model_node.config.materialized not in ["table", "view", "incremental"]: + errors.append( + f"Only table, view, and incremental materializations are supported for constraints, but found '{model_node.config.materialized}'" + ) + + if str(model_node.language) != "sql": + errors.append(f"Language Error: Expected 'sql' but found '{model_node.language}'") + + if errors: + raise ParsingError( + f"Constraint validation failed for: ({model_node.original_file_path})\n" + + "\n".join(errors) + ) + class AnalysisPatchParser(NodePatchParser[UnparsedAnalysisUpdate]): def get_block(self, node: UnparsedAnalysisUpdate) -> TargetBlock: @@ -1195,7 +838,7 @@ def _target_type(self) -> Type[UnparsedAnalysisUpdate]: return UnparsedAnalysisUpdate -class MacroPatchParser(NonSourceParser[UnparsedMacroUpdate, ParsedMacroPatch]): +class MacroPatchParser(PatchParser[UnparsedMacroUpdate, ParsedMacroPatch]): def get_block(self, node: UnparsedMacroUpdate) -> TargetBlock: return TargetBlock.from_yaml_block(self.yaml, node) @@ -1226,259 +869,11 @@ def parse_patch(self, block: TargetBlock[UnparsedMacroUpdate], refs: ParserRef) package_name, existing_file_path = macro.patch_path.split("://") raise DuplicateMacroPatchNameError(patch, existing_file_path) source_file.macro_patches[patch.name] = unique_id - macro.patch(patch) - - -class ExposureParser(YamlReader): - def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): - super().__init__(schema_parser, yaml, NodeType.Exposure.pluralize()) - self.schema_parser = schema_parser - self.yaml = yaml - - def parse_exposure(self, unparsed: UnparsedExposure): - package_name = self.project.project_name - unique_id = f"{NodeType.Exposure}.{package_name}.{unparsed.name}" - path = self.yaml.path.relative_path - - fqn = self.schema_parser.get_fqn_prefix(path) - fqn.append(unparsed.name) - - config = self._generate_exposure_config( - target=unparsed, - fqn=fqn, - package_name=package_name, - rendered=True, - ) - - config = config.finalize_and_validate() - - unrendered_config = self._generate_exposure_config( - target=unparsed, - fqn=fqn, - package_name=package_name, - rendered=False, - ) - - if not isinstance(config, ExposureConfig): - raise DbtInternalError( - f"Calculated a {type(config)} for an exposure, but expected an ExposureConfig" - ) - - parsed = Exposure( - resource_type=NodeType.Exposure, - package_name=package_name, - path=path, - original_file_path=self.yaml.path.original_file_path, - unique_id=unique_id, - fqn=fqn, - name=unparsed.name, - type=unparsed.type, - url=unparsed.url, - meta=unparsed.meta, - tags=unparsed.tags, - description=unparsed.description, - label=unparsed.label, - owner=unparsed.owner, - maturity=unparsed.maturity, - config=config, - unrendered_config=unrendered_config, - ) - ctx = generate_parse_exposure( - parsed, - self.root_project, - self.schema_parser.manifest, - package_name, - ) - depends_on_jinja = "\n".join("{{ " + line + "}}" for line in unparsed.depends_on) - get_rendered(depends_on_jinja, ctx, parsed, capture_macros=True) - # parsed now has a populated refs/sources/metrics - - if parsed.config.enabled: - self.manifest.add_exposure(self.yaml.file, parsed) - else: - self.manifest.add_disabled(self.yaml.file, parsed) - - def _generate_exposure_config( - self, target: UnparsedExposure, fqn: List[str], package_name: str, rendered: bool - ): - generator: BaseContextConfigGenerator - if rendered: - generator = ContextConfigGenerator(self.root_project) - else: - generator = UnrenderedConfigGenerator(self.root_project) - - # configs with precendence set - precedence_configs = dict() - # apply exposure configs - precedence_configs.update(target.config) - - return generator.calculate_node_config( - config_call_dict={}, - fqn=fqn, - resource_type=NodeType.Exposure, - project_name=package_name, - base=False, - patch_config_dict=precedence_configs, - ) - - def parse(self): - for data in self.get_key_dicts(): - try: - UnparsedExposure.validate(data) - unparsed = UnparsedExposure.from_dict(data) - except (ValidationError, JSONValidationError) as exc: - raise YamlParseDictError(self.yaml.path, self.key, data, exc) - - self.parse_exposure(unparsed) - - -class MetricParser(YamlReader): - def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): - super().__init__(schema_parser, yaml, NodeType.Metric.pluralize()) - self.schema_parser = schema_parser - self.yaml = yaml - - def parse_metric(self, unparsed: UnparsedMetric): - package_name = self.project.project_name - unique_id = f"{NodeType.Metric}.{package_name}.{unparsed.name}" - path = self.yaml.path.relative_path - - fqn = self.schema_parser.get_fqn_prefix(path) - fqn.append(unparsed.name) - - config = self._generate_metric_config( - target=unparsed, - fqn=fqn, - package_name=package_name, - rendered=True, - ) - - config = config.finalize_and_validate() - - unrendered_config = self._generate_metric_config( - target=unparsed, - fqn=fqn, - package_name=package_name, - rendered=False, - ) - - if not isinstance(config, MetricConfig): - raise DbtInternalError( - f"Calculated a {type(config)} for a metric, but expected a MetricConfig" - ) - - parsed = Metric( - resource_type=NodeType.Metric, - package_name=package_name, - path=path, - original_file_path=self.yaml.path.original_file_path, - unique_id=unique_id, - fqn=fqn, - model=unparsed.model, - name=unparsed.name, - description=unparsed.description, - label=unparsed.label, - calculation_method=unparsed.calculation_method, - expression=str(unparsed.expression), - timestamp=unparsed.timestamp, - dimensions=unparsed.dimensions, - window=unparsed.window, - time_grains=unparsed.time_grains, - filters=unparsed.filters, - meta=unparsed.meta, - tags=unparsed.tags, - config=config, - unrendered_config=unrendered_config, - group=config.group, - ) - - ctx = generate_parse_metrics( - parsed, - self.root_project, - self.schema_parser.manifest, - package_name, - ) - - if parsed.model is not None: - model_ref = "{{ " + parsed.model + " }}" - get_rendered(model_ref, ctx, parsed) - - parsed.expression = get_rendered( - parsed.expression, - ctx, - node=parsed, - ) - - # if the metric is disabled we do not want it included in the manifest, only in the disabled dict - if parsed.config.enabled: - self.manifest.add_metric(self.yaml.file, parsed) - else: - self.manifest.add_disabled(self.yaml.file, parsed) - - def _generate_metric_config( - self, target: UnparsedMetric, fqn: List[str], package_name: str, rendered: bool - ): - generator: BaseContextConfigGenerator - if rendered: - generator = ContextConfigGenerator(self.root_project) - else: - generator = UnrenderedConfigGenerator(self.root_project) - - # configs with precendence set - precedence_configs = dict() - # first apply metric configs - precedence_configs.update(target.config) - - config = generator.calculate_node_config( - config_call_dict={}, - fqn=fqn, - resource_type=NodeType.Metric, - project_name=package_name, - base=False, - patch_config_dict=precedence_configs, - ) - return config - - def parse(self): - for data in self.get_key_dicts(): - try: - UnparsedMetric.validate(data) - unparsed = UnparsedMetric.from_dict(data) - - except (ValidationError, JSONValidationError) as exc: - raise YamlParseDictError(self.yaml.path, self.key, data, exc) - self.parse_metric(unparsed) - - -class GroupParser(YamlReader): - def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): - super().__init__(schema_parser, yaml, NodeType.Group.pluralize()) - self.schema_parser = schema_parser - self.yaml = yaml - - def parse_group(self, unparsed: UnparsedGroup): - package_name = self.project.project_name - unique_id = f"{NodeType.Group}.{package_name}.{unparsed.name}" - path = self.yaml.path.relative_path - - parsed = Group( - resource_type=NodeType.Group, - package_name=package_name, - path=path, - original_file_path=self.yaml.path.original_file_path, - unique_id=unique_id, - name=unparsed.name, - owner=unparsed.owner, - ) - - self.manifest.add_group(self.yaml.file, parsed) - - def parse(self): - for data in self.get_key_dicts(): - try: - UnparsedGroup.validate(data) - unparsed = UnparsedGroup.from_dict(data) - except (ValidationError, JSONValidationError) as exc: - raise YamlParseDictError(self.yaml.path, self.key, data, exc) - self.parse_group(unparsed) + # former macro.patch code + macro.patch_path = patch.file_id + macro.description = patch.description + macro.created_at = time.time() + macro.meta = patch.meta + macro.docs = patch.docs + macro.arguments = patch.arguments diff --git a/core/dbt/parser/sources.py b/core/dbt/parser/sources.py index 164c885b30f..4095599a9c4 100644 --- a/core/dbt/parser/sources.py +++ b/core/dbt/parser/sources.py @@ -29,7 +29,8 @@ from dbt.exceptions import DbtInternalError from dbt.node_types import NodeType -from dbt.parser.schemas import SchemaParser, ParserRef +from dbt.parser.common import ParserRef +from dbt.parser.schema_generic_tests import SchemaGenericTestParser # An UnparsedSourceDefinition is taken directly from the yaml @@ -48,7 +49,7 @@ def __init__( ) -> None: self.root_project = root_project self.manifest = manifest - self.schema_parsers: Dict[str, SchemaParser] = {} + self.generic_test_parsers: Dict[str, SchemaGenericTestParser] = {} self.patches_used: Dict[SourceKey, Set[str]] = {} self.sources: Dict[str, SourceDefinition] = {} @@ -188,18 +189,18 @@ def parse_source(self, target: UnpatchedSourceDefinition) -> SourceDefinition: parsed_source.relation_name = self._get_relation_name(parsed_source) return parsed_source - # This code uses the SchemaParser because it shares the '_parse_generic_test' - # code. It might be nice to separate out the generic test code - # and make it common to the schema parser and source patcher. - def get_schema_parser_for(self, package_name: str) -> "SchemaParser": - if package_name in self.schema_parsers: - schema_parser = self.schema_parsers[package_name] + # Use the SchemaGenericTestParser to parse the source tests + def get_generic_test_parser_for(self, package_name: str) -> "SchemaGenericTestParser": + if package_name in self.generic_test_parsers: + generic_test_parser = self.generic_test_parsers[package_name] else: all_projects = self.root_project.load_dependencies() project = all_projects[package_name] - schema_parser = SchemaParser(project, self.manifest, self.root_project) - self.schema_parsers[package_name] = schema_parser - return schema_parser + generic_test_parser = SchemaGenericTestParser( + project, self.manifest, self.root_project + ) + self.generic_test_parsers[package_name] = generic_test_parser + return generic_test_parser def get_source_tests(self, target: UnpatchedSourceDefinition) -> Iterable[GenericTestNode]: for test, column in target.get_tests(): @@ -226,7 +227,7 @@ def get_patch_for( self.patches_used[key].add(unpatched.table.name) return patch - # This calls _parse_generic_test in the SchemaParser + # This calls parse_generic_test in the SchemaGenericTestParser def parse_source_test( self, target: UnpatchedSourceDefinition, @@ -247,10 +248,8 @@ def parse_source_test( tags_sources.append(column.tags) tags = list(itertools.chain.from_iterable(tags_sources)) - # TODO: make the generic_test code common so we don't need to - # create schema parsers to handle the tests - schema_parser = self.get_schema_parser_for(target.package_name) - node = schema_parser._parse_generic_test( + generic_test_parser = self.get_generic_test_parser_for(target.package_name) + node = generic_test_parser.parse_generic_test( target=target, test=test, tags=tags, diff --git a/test/unit/test_contracts_graph_parsed.py b/test/unit/test_contracts_graph_parsed.py index 651cc41793a..9fc11e985c7 100644 --- a/test/unit/test_contracts_graph_parsed.py +++ b/test/unit/test_contracts_graph_parsed.py @@ -20,7 +20,6 @@ GenericTestNode, SnapshotNode, IntermediateSnapshotNode, - ParsedNodePatch, Macro, Exposure, Metric, @@ -762,94 +761,6 @@ def test_compare_changed_seed(func, basic_parsed_seed_object): assert not node.same_contents(compare, "postgres") -@pytest.fixture -def basic_parsed_model_patch_dict(): - return { - "name": "foo", - "description": "The foo model", - "original_file_path": "path/to/schema.yml", - "docs": {"show": True}, - "meta": {}, - "yaml_key": "models", - "package_name": "test", - "columns": { - "a": { - "name": "a", - "description": "a text field", - "meta": {}, - "tags": [], - "constraints": [], - }, - }, - "config": {}, - "access": "public", - "version": "1", - "latest_version": "1", - } - - -@pytest.fixture -def basic_parsed_model_patch_object(): - return ParsedNodePatch( - name="foo", - yaml_key="models", - package_name="test", - description="The foo model", - original_file_path="path/to/schema.yml", - columns={"a": ColumnInfo(name="a", description="a text field", meta={})}, - docs=Docs(), - meta={}, - config={}, - access="public", - version="1", - latest_version="1", - ) - - -@pytest.fixture -def patched_model_object(): - return ModelNode( - package_name="test", - path="/root/x/path.sql", - original_file_path="/root/path.sql", - language="sql", - raw_code="select * from wherever", - name="foo", - resource_type=NodeType.Model, - unique_id="model.test.foo", - fqn=["test", "models", "foo"], - refs=[], - sources=[], - metrics=[], - depends_on=DependsOn(), - description="The foo model", - database="test_db", - schema="test_schema", - alias="bar", - tags=[], - meta={}, - config=NodeConfig(), - patch_path="test://path/to/schema.yml", - columns={"a": ColumnInfo(name="a", description="a text field", meta={})}, - docs=Docs(), - checksum=FileHash.from_contents(""), - unrendered_config={}, - access=AccessType.Public, - version="1", - latest_version="1", - ) - - -def test_patch_parsed_model( - basic_parsed_model_object, basic_parsed_model_patch_object, patched_model_object -): - pre_patch = basic_parsed_model_object - pre_patch.patch(basic_parsed_model_patch_object) - pre_patch.created_at = 1.0 - patched_model_object.created_at = 1.0 - assert patched_model_object == pre_patch - - @pytest.fixture def minimal_parsed_hook_dict(): return { @@ -1894,60 +1805,6 @@ def test_invalid_snapshot_bad_resource_type(basic_timestamp_snapshot_dict): assert_fails_validation(bad_resource_type, SnapshotNode) -def test_basic_parsed_node_patch(basic_parsed_model_patch_object, basic_parsed_model_patch_dict): - assert_symmetric(basic_parsed_model_patch_object, basic_parsed_model_patch_dict) - - -@pytest.fixture -def populated_parsed_node_patch_dict(): - return { - "name": "foo", - "description": "The foo model", - "original_file_path": "path/to/schema.yml", - "columns": { - "a": { - "name": "a", - "description": "a text field", - "meta": {}, - "tags": [], - "constraints": [], - }, - }, - "docs": {"show": False}, - "meta": {"key": ["value"]}, - "yaml_key": "models", - "package_name": "test", - "config": {}, - "access": "public", - "version": "1", - "latest_version": "1", - } - - -@pytest.fixture -def populated_parsed_node_patch_object(): - return ParsedNodePatch( - name="foo", - description="The foo model", - original_file_path="path/to/schema.yml", - columns={"a": ColumnInfo(name="a", description="a text field", meta={})}, - meta={"key": ["value"]}, - yaml_key="models", - package_name="test", - docs=Docs(show=False), - config={}, - access="public", - version="1", - latest_version="1", - ) - - -def test_populated_parsed_node_patch( - populated_parsed_node_patch_dict, populated_parsed_node_patch_object -): - assert_symmetric(populated_parsed_node_patch_object, populated_parsed_node_patch_dict) - - class TestParsedMacro(ContractTestCase): ContractType = Macro diff --git a/test/unit/test_parser.py b/test/unit/test_parser.py index 80a3404d702..eadb081415b 100644 --- a/test/unit/test_parser.py +++ b/test/unit/test_parser.py @@ -33,7 +33,7 @@ SnapshotParser, AnalysisParser, ) -from dbt.parser.generic_test_builders import YamlBlock +from dbt.parser.common import YamlBlock from dbt.parser.models import ( _get_config_call_dict, _shift_sources, @@ -727,31 +727,6 @@ def test__parsed_versioned_models(self): self.parser.parse_file(block, dct) self.assert_has_manifest_lengths(self.parser.manifest, nodes=2) - all_nodes = sorted(self.parser.manifest.nodes.values(), key=lambda n: n.unique_id) - models = [node for node in all_nodes if node.resource_type == NodeType.Model] - - # test v1 model - parsed_node_patch_v1 = models[0].patch.call_args_list[0][0][0] - self.assertEqual(models[0].unique_id, "model.snowplow.my_model.v1") - self.assertEqual(parsed_node_patch_v1.version, 1) - self.assertEqual(parsed_node_patch_v1.latest_version, 2) - self.assertEqual( - list(parsed_node_patch_v1.columns.keys()), ["color", "location_id", "extra"] - ) - self.assertEqual( - parsed_node_patch_v1.config, {"materialized": "table", "sql_header": "test_sql_header"} - ) - - # test v2 model - parsed_node_patch_v2 = models[1].patch.call_args_list[0][0][0] - self.assertEqual(models[1].unique_id, "model.snowplow.my_model.v2") - self.assertEqual(parsed_node_patch_v2.version, 2) - self.assertEqual(parsed_node_patch_v2.latest_version, 2) - self.assertEqual(list(parsed_node_patch_v2.columns.keys()), ["color", "extra"]) - self.assertEqual( - parsed_node_patch_v2.config, {"materialized": "view", "sql_header": "test_sql_header"} - ) - def test__parsed_versioned_models_v0(self): block = self.file_block_for(MULTIPLE_TABLE_VERSIONED_MODEL_V0, "test_one.yml") self.parser.manifest.files[block.file.file_id] = block.file @@ -759,21 +734,6 @@ def test__parsed_versioned_models_v0(self): self.parser.parse_file(block, dct) self.assert_has_manifest_lengths(self.parser.manifest, nodes=2) - all_nodes = sorted(self.parser.manifest.nodes.values(), key=lambda n: n.unique_id) - models = [node for node in all_nodes if node.resource_type == NodeType.Model] - - # test v0 model - parsed_node_patch_v1 = models[0].patch.call_args_list[0][0][0] - self.assertEqual(models[0].unique_id, "model.snowplow.my_model.v0") - self.assertEqual(parsed_node_patch_v1.version, 0) - self.assertEqual(parsed_node_patch_v1.latest_version, 2) - - # test v2 model - parsed_node_patch_v2 = models[1].patch.call_args_list[0][0][0] - self.assertEqual(models[1].unique_id, "model.snowplow.my_model.v2") - self.assertEqual(parsed_node_patch_v2.version, 2) - self.assertEqual(parsed_node_patch_v2.latest_version, 2) - def test__parsed_versioned_models_v0_latest_version(self): block = self.file_block_for( MULTIPLE_TABLE_VERSIONED_MODEL_V0_LATEST_VERSION, "test_one.yml" @@ -783,21 +743,6 @@ def test__parsed_versioned_models_v0_latest_version(self): self.parser.parse_file(block, dct) self.assert_has_manifest_lengths(self.parser.manifest, nodes=2) - all_nodes = sorted(self.parser.manifest.nodes.values(), key=lambda n: n.unique_id) - models = [node for node in all_nodes if node.resource_type == NodeType.Model] - - # test v0 model - parsed_node_patch_v1 = models[0].patch.call_args_list[0][0][0] - self.assertEqual(models[0].unique_id, "model.snowplow.my_model.v0") - self.assertEqual(parsed_node_patch_v1.version, 0) - self.assertEqual(parsed_node_patch_v1.latest_version, 0) - - # test v2 model - parsed_node_patch_v2 = models[1].patch.call_args_list[0][0][0] - self.assertEqual(models[1].unique_id, "model.snowplow.my_model.v2") - self.assertEqual(parsed_node_patch_v2.version, 2) - self.assertEqual(parsed_node_patch_v2.latest_version, 0) - sql_model = """ {{ config(materialized="table") }} @@ -1540,7 +1485,6 @@ def test_multiple_blocks(self): "{% macro foo(a, b) %}a ~ b{% endmacro %}\n{% macro bar(c, d) %}c + d{% endmacro %}" ) block = self.file_block_for(raw_code, "macro.sql") - print(f"--- test_multiple_blocks block: {block}") self.parser.manifest.files[block.file.file_id] = block.file self.parser.parse_file(block) self.assertEqual(len(self.parser.manifest.macros), 2) diff --git a/tests/functional/defer_state/test_modified_state.py b/tests/functional/defer_state/test_modified_state.py index da80bc78095..ad1131490d6 100644 --- a/tests/functional/defer_state/test_modified_state.py +++ b/tests/functional/defer_state/test_modified_state.py @@ -364,7 +364,7 @@ def test_changed_constraint(self, project): with pytest.raises(ContractBreakingChangeError): run_dbt(["run", "--models", "state:modified.contract", "--state", "./state"]) - # This should raise because a model level constraint was removed + # This should raise because a model level constraint was removed (primary_key on id) write_file(modified_model_constraint_schema_yml, "models", "schema.yml") # we don't have a way to know this failed unless we have a previous state to refer to, so the run succeeds results = run_dbt(["run"]) From dea3181d9669dd653269e554a81cb487806643eb Mon Sep 17 00:00:00 2001 From: Peter Webb Date: Wed, 17 May 2023 11:38:48 -0400 Subject: [PATCH 03/67] Exclude some profile fields from Jinja rendering when they are not valid Jinja. (#7630) * CT-2583: Exclude some profile fields from Jinja rendering. * CT-2583: Add functional test. * CT-2583: Change approach to password jinja detection * CT-2583: Extract string constant and add additional checks * CT-2583: Improve unit test coverage --- .../unreleased/Fixes-20230515-142851.yaml | 6 ++ core/dbt/config/renderer.py | 12 +++- .../functional/profiles/test_profiles_yml.py | 64 +++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Fixes-20230515-142851.yaml create mode 100644 tests/functional/profiles/test_profiles_yml.py diff --git a/.changes/unreleased/Fixes-20230515-142851.yaml b/.changes/unreleased/Fixes-20230515-142851.yaml new file mode 100644 index 00000000000..a64f3a4f88b --- /dev/null +++ b/.changes/unreleased/Fixes-20230515-142851.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Exclude password fields from Jinja rendering. +time: 2023-05-15T14:28:51.400321-04:00 +custom: + Author: peterallenwebb + Issue: "7629" diff --git a/core/dbt/config/renderer.py b/core/dbt/config/renderer.py index 3de826d4d54..69361da18b7 100644 --- a/core/dbt/config/renderer.py +++ b/core/dbt/config/renderer.py @@ -182,7 +182,17 @@ def render_value(self, value: Any, keypath: Optional[Keypath] = None) -> Any: # First, standard Jinja rendering, with special handling for 'secret' environment variables # "{{ env_var('DBT_SECRET_ENV_VAR') }}" -> "$$$DBT_SECRET_START$$$DBT_SECRET_ENV_{VARIABLE_NAME}$$$DBT_SECRET_END$$$" # This prevents Jinja manipulation of secrets via macros/filters that might leak partial/modified values in logs - rendered = super().render_value(value, keypath) + + try: + rendered = super().render_value(value, keypath) + except Exception as ex: + if keypath and "password" in keypath: + # Passwords sometimes contain jinja-esque characters, but we + # don't want to render them if they aren't valid jinja. + rendered = value + else: + raise ex + # Now, detect instances of the placeholder value ($$$DBT_SECRET_START...DBT_SECRET_END$$$) # and replace them with the actual secret value if SECRET_ENV_PREFIX in str(rendered): diff --git a/tests/functional/profiles/test_profiles_yml.py b/tests/functional/profiles/test_profiles_yml.py new file mode 100644 index 00000000000..50771c24132 --- /dev/null +++ b/tests/functional/profiles/test_profiles_yml.py @@ -0,0 +1,64 @@ +import pathlib +from test_profile_dir import environ + +from dbt.cli.main import dbtRunner + +jinjaesque_password = "no{{jinja{%re{#ndering" + +profile_with_jinjaesque_password = f"""test: + outputs: + default: + dbname: my_db + host: localhost + password: {jinjaesque_password} + port: 12345 + schema: dummy + threads: 4 + type: postgres + user: peter.webb + target: default +""" + +profile_with_env_password = """test: + outputs: + default: + dbname: my_db + host: localhost + password: "{{ env_var('DBT_PASSWORD') }}" + port: 12345 + schema: dummy + threads: 4 + type: postgres + user: peter.webb + target: default +""" + + +class TestProfileParsing: + def write_profiles_yml(self, profiles_root, content) -> None: + with open(pathlib.Path(profiles_root, "profiles.yml"), "w") as profiles_yml: + profiles_yml.write(content) + + def test_password_not_jinja_rendered_when_invalid(self, project, profiles_root) -> None: + """Verifies that passwords that contain Jinja control characters, but which are + not valid Jinja, do not cause errors.""" + self.write_profiles_yml(profiles_root, profile_with_jinjaesque_password) + + events = [] + result = dbtRunner(callbacks=[events.append]).invoke(["parse"]) + assert result.success + + for e in events: + assert "no{{jinja{%re{#ndering" not in e.info.msg + + def test_password_jinja_rendered_when_valid(self, project, profiles_root) -> None: + """Verifies that a password value that is valid Jinja is rendered as such, + and that it doesn't cause problems if the resulting value looks like Jinja""" + self.write_profiles_yml(profiles_root, profile_with_env_password) + + events = [] + with environ({"DBT_PASSWORD": jinjaesque_password}): + result = dbtRunner(callbacks=[events.append]).invoke(["parse"]) + + assert result.success + assert project.adapter.config.credentials.password == jinjaesque_password From f6e558237036efc53903ff7ec16dbdc955b4a29e Mon Sep 17 00:00:00 2001 From: Stu Kilgore Date: Wed, 17 May 2023 12:14:16 -0500 Subject: [PATCH 04/67] Add "other" relation to reffable node classes (#7645) --- .../unreleased/Under the Hood-20230515-152107.yaml | 6 ++++++ core/dbt/contracts/graph/manifest.py | 2 ++ core/dbt/contracts/graph/nodes.py | 14 ++++++++++++++ test/unit/test_manifest.py | 1 + 4 files changed, 23 insertions(+) create mode 100644 .changes/unreleased/Under the Hood-20230515-152107.yaml diff --git a/.changes/unreleased/Under the Hood-20230515-152107.yaml b/.changes/unreleased/Under the Hood-20230515-152107.yaml new file mode 100644 index 00000000000..c695c7e945e --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230515-152107.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Add other relation to reffable nodes +time: 2023-05-15T15:21:07.808892-05:00 +custom: + Author: stu-k + Issue: "7550" diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index 0c4c2e72dcf..414cf76001e 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -1323,6 +1323,8 @@ def __post_serialize__(self, dct): for unique_id, node in dct["nodes"].items(): if "config_call_dict" in node: del node["config_call_dict"] + if "state_relation" in node: + del node["state_relation"] return dct diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 94d30364a3d..b71e4694ee3 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -269,6 +269,17 @@ def add_public_node(self, value: str): self.public_nodes.append(value) +@dataclass +class StateRelation(dbtClassMixin): + alias: str + database: Optional[str] + schema: str + + @property + def identifier(self): + return self.alias + + @dataclass class ParsedNodeMandatory(GraphNode, HasRelationMetadata, Replaceable): alias: str @@ -557,6 +568,7 @@ class ModelNode(CompiledNode): constraints: List[ModelLevelConstraint] = field(default_factory=list) version: Optional[NodeVersion] = None latest_version: Optional[NodeVersion] = None + state_relation: Optional[StateRelation] = None @property def is_latest_version(self) -> bool: @@ -739,6 +751,7 @@ class SeedNode(ParsedNode): # No SQLDefaults! # and we need the root_path to load the seed later root_path: Optional[str] = None depends_on: MacroDependsOn = field(default_factory=MacroDependsOn) + state_relation: Optional[StateRelation] = None def same_seeds(self, other: "SeedNode") -> bool: # for seeds, we check the hashes. If the hashes are different types, @@ -937,6 +950,7 @@ class IntermediateSnapshotNode(CompiledNode): class SnapshotNode(CompiledNode): resource_type: NodeType = field(metadata={"restrict": [NodeType.Snapshot]}) config: SnapshotConfig + state_relation: Optional[StateRelation] = None # ==================================== diff --git a/test/unit/test_manifest.py b/test/unit/test_manifest.py index ccca812810e..640db1002e5 100644 --- a/test/unit/test_manifest.py +++ b/test/unit/test_manifest.py @@ -93,6 +93,7 @@ "version", "latest_version", "constraints", + "state_relation", } ) From 50528a009d9e1ace4eb089062c5c1fbc84b854ab Mon Sep 17 00:00:00 2001 From: David Bloss Date: Wed, 17 May 2023 16:20:26 -0500 Subject: [PATCH 05/67] update used gh actions ahead of node12 deprecation (#7651) * update used gh actions ahead of node12 deprecation * replace with valid tag --------- Co-authored-by: Kshitij Aranke Co-authored-by: Emily Rockman --- .github/_README.md | 2 +- .github/actions/latest-wrangler/README.md | 2 +- .../actions/latest-wrangler/examples/example_workflow.yml | 2 +- .github/workflows/main.yml | 8 ++++---- .github/workflows/release-branch-tests.yml | 4 ++-- .github/workflows/schema-check.yml | 8 ++++---- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/_README.md b/.github/_README.md index f624fc5fec6..2ba8e7357fa 100644 --- a/.github/_README.md +++ b/.github/_README.md @@ -197,7 +197,7 @@ ___ ```yaml - name: Configure AWS credentials from Test account - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v2 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/actions/latest-wrangler/README.md b/.github/actions/latest-wrangler/README.md index 9d5033259c0..110f9085f62 100644 --- a/.github/actions/latest-wrangler/README.md +++ b/.github/actions/latest-wrangler/README.md @@ -35,7 +35,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Wrangle latest tag id: is_latest uses: ./.github/actions/latest-wrangler diff --git a/.github/actions/latest-wrangler/examples/example_workflow.yml b/.github/actions/latest-wrangler/examples/example_workflow.yml index 66b171c434b..b9ac05ad73a 100644 --- a/.github/actions/latest-wrangler/examples/example_workflow.yml +++ b/.github/actions/latest-wrangler/examples/example_workflow.yml @@ -13,7 +13,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Wrangle latest tag id: is_latest uses: ./.github/actions/latest-wrangler diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4320797dfcf..13274dbcd61 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -45,7 +45,7 @@ jobs: uses: actions/checkout@v3 - name: Set up Python - uses: actions/setup-python@v4.3.0 + uses: actions/setup-python@v4 with: python-version: '3.8' @@ -80,7 +80,7 @@ jobs: uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4.3.0 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} @@ -137,7 +137,7 @@ jobs: uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4.3.0 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} @@ -192,7 +192,7 @@ jobs: uses: actions/checkout@v3 - name: Set up Python - uses: actions/setup-python@v4.3.0 + uses: actions/setup-python@v4 with: python-version: '3.8' diff --git a/.github/workflows/release-branch-tests.yml b/.github/workflows/release-branch-tests.yml index b31a7c8c3b1..101e08a7535 100644 --- a/.github/workflows/release-branch-tests.yml +++ b/.github/workflows/release-branch-tests.yml @@ -72,14 +72,14 @@ jobs: steps: - name: Call CI workflow for ${{ matrix.branch }} branch id: trigger-step - uses: aurelien-baudet/workflow-dispatch@v2.1.1 + uses: aurelien-baudet/workflow-dispatch@v2 with: workflow: main.yml ref: ${{ matrix.branch }} token: ${{ secrets.FISHTOWN_BOT_PAT }} - name: Post failure to Slack - uses: ravsamhq/notify-slack-action@v1 + uses: ravsamhq/notify-slack-action@v2 if: ${{ always() && !contains(steps.trigger-step.outputs.workflow-conclusion,'success') }} with: status: ${{ job.status }} diff --git a/.github/workflows/schema-check.yml b/.github/workflows/schema-check.yml index 44c641c5718..9577401e3e6 100644 --- a/.github/workflows/schema-check.yml +++ b/.github/workflows/schema-check.yml @@ -37,17 +37,17 @@ jobs: steps: - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: 3.8 - name: Checkout dbt repo - uses: actions/checkout@v2.3.4 + uses: actions/checkout@v3 with: path: ${{ env.DBT_REPO_DIRECTORY }} - name: Checkout schemas.getdbt.com repo - uses: actions/checkout@v2.3.4 + uses: actions/checkout@v3 with: repository: dbt-labs/schemas.getdbt.com ref: 'main' @@ -83,7 +83,7 @@ jobs: fi - name: Upload schema diff - uses: actions/upload-artifact@v2.2.4 + uses: actions/upload-artifact@v3 if: ${{ failure() }} with: name: 'schema_schanges.txt' From af0f786f2ecb570565d26ca58b64f690f34b1d7a Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Thu, 18 May 2023 13:42:50 -0700 Subject: [PATCH 06/67] Accept PublicationArtifacts in dbtRunner.invoke (#7656) --- .../unreleased/Features-20230517-185627.yaml | 6 +++ core/dbt/cli/main.py | 1 + core/dbt/cli/requires.py | 4 +- core/dbt/contracts/publication.py | 9 ++++ core/dbt/exceptions.py | 3 +- core/dbt/parser/manifest.py | 43 ++++++++-------- core/dbt/tests/util.py | 9 +++- .../multi_project/test_publication.py | 51 ++++++++----------- 8 files changed, 68 insertions(+), 58 deletions(-) create mode 100644 .changes/unreleased/Features-20230517-185627.yaml diff --git a/.changes/unreleased/Features-20230517-185627.yaml b/.changes/unreleased/Features-20230517-185627.yaml new file mode 100644 index 00000000000..4831fa6dc76 --- /dev/null +++ b/.changes/unreleased/Features-20230517-185627.yaml @@ -0,0 +1,6 @@ +kind: Features +body: accept publications in dbt.invoke +time: 2023-05-17T18:56:27.585784-04:00 +custom: + Author: MichelleArk + Issue: "7372" diff --git a/core/dbt/cli/main.py b/core/dbt/cli/main.py index 73676b9024a..d599a7a4d5e 100644 --- a/core/dbt/cli/main.py +++ b/core/dbt/cli/main.py @@ -77,6 +77,7 @@ def invoke(self, args: List[str], **kwargs) -> dbtRunnerResult: dbt_ctx.obj = { "manifest": self.manifest, "callbacks": self.callbacks, + "_publications": kwargs.get("publications"), } for key, value in kwargs.items(): diff --git a/core/dbt/cli/requires.py b/core/dbt/cli/requires.py index 07409d9da08..5fa2f8c9256 100644 --- a/core/dbt/cli/requires.py +++ b/core/dbt/cli/requires.py @@ -240,7 +240,9 @@ def wrapper(*args, **kwargs): # a manifest has already been set on the context, so don't overwrite it if ctx.obj.get("manifest") is None: manifest = ManifestLoader.get_full_manifest( - runtime_config, write_perf_info=write_perf_info + runtime_config, + write_perf_info=write_perf_info, + publications=ctx.obj.get("_publications"), ) ctx.obj["manifest"] = manifest diff --git a/core/dbt/contracts/publication.py b/core/dbt/contracts/publication.py index 75adc11a432..2a32feb7f29 100644 --- a/core/dbt/contracts/publication.py +++ b/core/dbt/contracts/publication.py @@ -114,3 +114,12 @@ class PublicationConfig(ArtifactMixin, PublicationMandatory): # list of project name strings dependencies: List[str] = field(default_factory=list) public_node_ids: List[str] = field(default_factory=list) + + @classmethod + def from_publication(cls, publication: PublicationArtifact): + return cls( + project_name=publication.project_name, + metadata=publication.metadata, + dependencies=publication.dependencies, + public_node_ids=list(publication.public_models.keys()), + ) diff --git a/core/dbt/exceptions.py b/core/dbt/exceptions.py index fef1abff838..93d64a260cf 100644 --- a/core/dbt/exceptions.py +++ b/core/dbt/exceptions.py @@ -408,14 +408,13 @@ class DbtProfileError(DbtConfigError): class PublicationConfigNotFound(DbtConfigError): def __init__(self, project=None, file_name=None): self.project = project - self.file_name = file_name msg = self.message() super().__init__(msg, project=project) def message(self): return ( f"A dependency on project {self.project} was specified, " - f"but file {self.file_name} was not found." + f"but a publication for {self.project} was not found." ) diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index 3708c263bf1..c0d5c1c768f 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -194,10 +194,12 @@ def __init__( all_projects: Mapping[str, Project], macro_hook: Optional[Callable[[Manifest], Any]] = None, file_diff: Optional[FileDiff] = None, + publications: Optional[List[PublicationArtifact]] = None, ) -> None: self.root_project: RuntimeConfig = root_project self.all_projects: Mapping[str, Project] = all_projects self.file_diff = file_diff + self.publications = publications self.manifest: Manifest = Manifest() self.new_manifest = self.manifest self.manifest.metadata = root_project.get_metadata() @@ -235,6 +237,7 @@ def get_full_manifest( file_diff: Optional[FileDiff] = None, reset: bool = False, write_perf_info=False, + publications: Optional[List[PublicationArtifact]] = None, ) -> Manifest: adapter = get_adapter(config) # type: ignore @@ -257,7 +260,13 @@ def get_full_manifest( start_load_all = time.perf_counter() projects = config.load_dependencies() - loader = cls(config, projects, macro_hook=macro_hook, file_diff=file_diff) + loader = cls( + config, + projects, + macro_hook=macro_hook, + file_diff=file_diff, + publications=publications, + ) manifest = loader.load() @@ -458,8 +467,7 @@ def load(self): # copy the selectors from the root_project to the manifest self.manifest.selectors = self.root_project.manifest_selectors - # load the publication artifacts and create the external nodes - # This also loads manifest.dependencies + # load manifest.dependencies and associated publication artifacts to create the external nodes public_nodes_changed = self.build_public_nodes() if public_nodes_changed: self.manifest.rebuild_ref_lookup() @@ -751,28 +759,19 @@ def build_public_nodes(self) -> bool: def load_new_public_nodes(self): for project in self.manifest.project_dependencies.projects: - # look for a _publication.json file for every project in the 'publications' dir - publication_file_name = f"{project.name}_publication.json" - # TODO: eventually we'll implement publications_dir config - path = os.path.join("publications", publication_file_name) - if os.path.exists(path): - contents = load_file_contents(path) - pub_dict = load_yaml_text(contents) - PublicationArtifact.validate(pub_dict) - # separate out the public_models - public_models = pub_dict.pop("public_models") - # Create the PublicationConfig to store in internal manifest - pub_config = PublicationConfig.from_dict(pub_dict) - self.manifest.publications[project.name] = pub_config + publication = ( + next(p for p in self.publications if p.project_name == project.name) + if self.publications + else None + ) + if publication: + publication_config = PublicationConfig.from_publication(publication) + self.manifest.publications[project.name] = publication_config # Add to dictionary of public_nodes and save id in PublicationConfig - for public_model_dict in public_models.values(): - public_node = PublicModel.from_dict(public_model_dict) + for public_node in publication.public_models.values(): self.manifest.public_nodes[public_node.unique_id] = public_node - pub_config.public_node_ids.append(public_node.unique_id) else: - raise PublicationConfigNotFound( - project=project.name, file_name=publication_file_name - ) + raise PublicationConfigNotFound(project=project.name) def is_partial_parsable(self, manifest: Manifest) -> Tuple[bool, Optional[str]]: """Compare the global hashes of the read-in parse results' values to diff --git a/core/dbt/tests/util.py b/core/dbt/tests/util.py index 4969c319e2b..9f0a0a47684 100644 --- a/core/dbt/tests/util.py +++ b/core/dbt/tests/util.py @@ -20,6 +20,7 @@ ) from dbt.events.base_types import EventLevel from dbt.events.types import Note +from dbt.contracts.publication import PublicationArtifact # ============================================================================= @@ -69,7 +70,11 @@ # run_dbt(["run", "--vars", "seed_name: base"]) # If the command is expected to fail, pass in "expect_pass=False"): # run_dbt("test"], expect_pass=False) -def run_dbt(args: List[str] = None, expect_pass=True): +def run_dbt( + args: List[str] = None, + expect_pass: bool = True, + publications: List[PublicationArtifact] = None, +): # Ignore logbook warnings warnings.filterwarnings("ignore", category=DeprecationWarning, module="logbook") @@ -94,7 +99,7 @@ def run_dbt(args: List[str] = None, expect_pass=True): args.extend(["--profiles-dir", profiles_dir]) dbt = dbtRunner() - res = dbt.invoke(args) + res = dbt.invoke(args, publications=publications) # the exception is immediately raised to be caught in tests # using a pattern like `with pytest.raises(SomeException):` diff --git a/tests/functional/multi_project/test_publication.py b/tests/functional/multi_project/test_publication.py index c85efe9f4d2..abbe271c7fc 100644 --- a/tests/functional/multi_project/test_publication.py +++ b/tests/functional/multi_project/test_publication.py @@ -1,8 +1,8 @@ +import json import pytest -import pathlib import os -from dbt.tests.util import run_dbt, get_artifact, write_file, copy_file +from dbt.tests.util import run_dbt, get_artifact, write_file from dbt.contracts.publication import PublicationArtifact, PublicModel from dbt.exceptions import ( PublicationConfigNotFound, @@ -62,24 +62,24 @@ "name": "fct_one", "package_name": "marketing", "unique_id": "model.marketing.fct_one", - "relation_name": '"dbt"."test_schema"."fct_one"', + "relation_name": "\\"dbt\\".\\"test_schema\\".\\"fct_one\\"", "database": "dbt", "schema": "test_schema", "identifier": "fct_one", "version": null, "latest_version": null, "public_node_dependencies": [], - "generated_at": "2023-04-13T17:17:58.128706Z", + "generated_at": "2023-04-13T17:17:58.128706Z" }, "model.marketing.fct_two": { "name": "fct_two", "package_name": "marketing", "unique_id": "model.marketing.fct_two", - "relation_name": '"dbt"."test_schema"."fct_two"', + "relation_name": "\\"dbt\\".\\"test_schema\\".\\"fct_two\\"", "version": null, "latest_version": null, "public_node_dependencies": ["model.test.fct_one"], - "generated_at": "2023-04-13T17:17:58.128706Z", + "generated_at": "2023-04-13T17:17:58.128706Z" } }, "dependencies": [] @@ -131,12 +131,10 @@ def test_pub_artifacts(self, project): with pytest.raises(PublicationConfigNotFound): run_dbt(["parse"]) - # Write out publication file and try again + # Provide publication and try again m_pub_json = marketing_pub_json.replace("test_schema", project.test_schema) - (pathlib.Path(project.project_root) / "publications").mkdir(parents=True, exist_ok=True) - write_file(m_pub_json, project.project_root, "publications", "marketing_publication.json") - - manifest = run_dbt(["parse"]) + publications = [PublicationArtifact.from_dict(json.loads(m_pub_json))] + manifest = run_dbt(["parse"], publications=publications) assert manifest.publications assert "marketing" in manifest.publications assert "model.marketing.fct_one" in manifest.publications["marketing"].public_node_ids @@ -154,7 +152,7 @@ def test_pub_artifacts(self, project): # add new model that references external_node and parse write_file(ext_node_model_sql, project.project_root, "models", "test_model_one.sql") - manifest = run_dbt(["parse"]) + manifest = run_dbt(["parse"], publications=publications) model_id = "model.test.test_model_one" public_model_id = "model.marketing.fct_one" @@ -172,7 +170,7 @@ def test_pub_artifacts(self, project): # Create the relation for the public node (fct_one) project.run_sql(f'create table "{project.test_schema}"."fct_one" (id integer)') project.run_sql(f'insert into "{project.test_schema}"."fct_one" values (1), (2)') - results = run_dbt(["run"]) + results = run_dbt(["run"], publications=publications) assert len(results) == 4 # Test for only publication artifact has changed, no partial parsing @@ -180,17 +178,17 @@ def test_pub_artifacts(self, project): m_pub_json = m_pub_json.replace("fct_one", "fct_three") # Change generated_at field m_pub_json = m_pub_json.replace("04-13", "04-24") - write_file(m_pub_json, project.project_root, "publications", "marketing_publication.json") + publications = [PublicationArtifact.from_dict(json.loads(m_pub_json))] # test_model_one references a missing public model with pytest.raises(TargetNotFoundError): - manifest = run_dbt(["parse"]) + manifest = run_dbt(["parse"], publications=publications) # Add another public reference m_pub_json = m_pub_json.replace("fct_three", "fct_one") m_pub_json = m_pub_json.replace("04-13", "04-25") - write_file(m_pub_json, project.project_root, "publications", "marketing_publication.json") + publications = [PublicationArtifact.from_dict(json.loads(m_pub_json))] write_file(ext_node_model_sql, project.project_root, "models", "test_model_two.sql") - results = run_dbt(["run"]) + results = run_dbt(["run"], publications=publications) assert len(results) == 5 @@ -246,20 +244,12 @@ def test_multi_projects(self, project, project_alt): publication = PublicationArtifact.from_dict(publication_dict) assert len(publication.public_models) == 1 - # copy the publication artifact from test_alt to test project - (pathlib.Path(project.project_root) / "publications").mkdir(parents=True, exist_ok=True) - target_path = os.path.join(project_alt.project_root, "target") - copy_file( - target_path, - "test_alt_publication.json", - project.project_root, - ["publications", "test_alt_publication.json"], - ) - # run the base project os.chdir(project.project_root) write_file(dependencies_alt_yml, project.project_root, "dependencies.yml") - results = run_dbt(["run", "--project-dir", str(project.project_root)]) + results = run_dbt( + ["run", "--project-dir", str(project.project_root)], publications=[publication] + ) assert len(results) == 4 @@ -274,8 +264,7 @@ def test_project_cycles(self, project): write_file(dependencies_yml, "dependencies.yml") # Create a project dependency that's the same as the current project m_pub_json = marketing_pub_json.replace('"dependencies": []', '"dependencies": ["test"]') - (pathlib.Path(project.project_root) / "publications").mkdir(parents=True, exist_ok=True) - write_file(m_pub_json, project.project_root, "publications", "marketing_publication.json") + publication = PublicationArtifact.from_dict(json.loads(m_pub_json)) with pytest.raises(ProjectDependencyCycleError): - run_dbt(["parse"]) + run_dbt(["parse"], publications=[publication]) From 87ea28fe84edd65d589fd3cf658d8dd1f65c000a Mon Sep 17 00:00:00 2001 From: Mike Alfare <13974384+mikealfare@users.noreply.github.com> Date: Fri, 19 May 2023 17:04:35 -0400 Subject: [PATCH 07/67] break out a large test suite as a separate execution to avoid memory issues on windows CI runs (#7669) --- .changes/unreleased/Under the Hood-20230519-153059.yaml | 6 ++++++ tox.ini | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Under the Hood-20230519-153059.yaml diff --git a/.changes/unreleased/Under the Hood-20230519-153059.yaml b/.changes/unreleased/Under the Hood-20230519-153059.yaml new file mode 100644 index 00000000000..578cce81932 --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230519-153059.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Break up integration tests as a short term fix for Windows CI runs +time: 2023-05-19T15:30:59.138043-04:00 +custom: + Author: mikealfare + Issue: "7668" diff --git a/tox.ini b/tox.ini index e0f96bf3eda..79b072d35d4 100644 --- a/tox.ini +++ b/tox.ini @@ -25,7 +25,8 @@ passenv = POSTGRES_TEST_* PYTEST_ADDOPTS commands = - {envpython} -m pytest --cov=core {posargs} tests/functional + {envpython} -m pytest --cov=core {posargs} tests/functional -k "not tests/functional/graph_selection" + {envpython} -m pytest --cov=core {posargs} tests/functional/graph_selection {envpython} -m pytest --cov=core {posargs} tests/adapter deps = From 265e09dc93914a14caf0cb0ee778264e20cf75c8 Mon Sep 17 00:00:00 2001 From: Ian Knox <81931810+iknox-fa@users.noreply.github.com> Date: Mon, 22 May 2023 15:42:48 -0500 Subject: [PATCH 08/67] Remove `DelayedFileHandler` (#7661) * remove DelayedFileHandler * Changelog * set_path to no-op * more no-ops for rpc * Clearer comments --- .../Under the Hood-20230518-114251.yaml | 6 + core/dbt/logger.py | 115 ++---------------- 2 files changed, 15 insertions(+), 106 deletions(-) create mode 100644 .changes/unreleased/Under the Hood-20230518-114251.yaml diff --git a/.changes/unreleased/Under the Hood-20230518-114251.yaml b/.changes/unreleased/Under the Hood-20230518-114251.yaml new file mode 100644 index 00000000000..253322ebf07 --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230518-114251.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Remove legacy file logger code +time: 2023-05-18T11:42:51.825799-05:00 +custom: + Author: iknox-fa + Issue: NA diff --git a/core/dbt/logger.py b/core/dbt/logger.py index 0c7ba2fe8f2..81e0e8871e7 100644 --- a/core/dbt/logger.py +++ b/core/dbt/logger.py @@ -347,111 +347,12 @@ def make_record(self, message, exception, filename, lineno): DebugWarnings().__enter__() -class DelayedFileHandler(logbook.RotatingFileHandler, FormatterMixin): - def __init__( - self, - log_dir: Optional[str] = None, - level=logbook.DEBUG, - filter=None, - bubble=True, - max_size=10 * 1024 * 1024, # 10 mb - backup_count=5, - ) -> None: - self.disabled = False - self._msg_buffer: Optional[List[logbook.LogRecord]] = [] - # if we get 1k messages without a logfile being set, something is wrong - self._bufmax = 1000 - self._log_path: Optional[str] = None - # we need the base handler class' __init__ to run so handling works - logbook.Handler.__init__(self, level, filter, bubble) - if log_dir is not None: - self.set_path(log_dir) - self._text_format_string = None - self._max_size = max_size - self._backup_count = backup_count - - def reset(self): - if self.initialized: - self.close() - self._log_path = None - self._msg_buffer = [] - self.disabled = False - - @property - def initialized(self): - return self._log_path is not None - - def set_path(self, log_dir): - """log_dir can be the path to a log directory, or `None` to avoid - writing to a file (for `dbt debug`). - """ - if self.disabled: - return - - assert not self.initialized, "set_path called after being set" - - if log_dir is None: - self.disabled = True - return - - make_log_dir_if_missing(log_dir) - log_path = os.path.join(log_dir, "dbt.log.legacy") # TODO hack for now - self._super_init(log_path) - self._replay_buffered() - self._log_path = log_path - - def _super_init(self, log_path): - logbook.RotatingFileHandler.__init__( - self, - filename=log_path, - level=self.level, - filter=self.filter, - delay=True, - max_size=self._max_size, - backup_count=self._backup_count, - bubble=self.bubble, - format_string=DEBUG_LOG_FORMAT, - ) - FormatterMixin.__init__(self, DEBUG_LOG_FORMAT) - - def _replay_buffered(self): - assert self._msg_buffer is not None, "_msg_buffer should never be None in _replay_buffered" - for record in self._msg_buffer: - super().emit(record) - self._msg_buffer = None - - def format(self, record: logbook.LogRecord) -> str: - msg = super().format(record) - subbed = str(msg) - for escape_sequence in dbt.ui.COLORS.values(): - subbed = subbed.replace(escape_sequence, "") - return subbed - - def emit(self, record: logbook.LogRecord): - """emit is not thread-safe with set_path, but it is thread-safe with - itself - """ - if self.disabled: - return - elif self.initialized: - super().emit(record) - else: - assert ( - self._msg_buffer is not None - ), "_msg_buffer should never be None if _log_path is set" - self._msg_buffer.append(record) - assert ( - len(self._msg_buffer) < self._bufmax - ), "too many messages received before initilization!" - - class LogManager(logbook.NestedSetup): def __init__(self, stdout=sys.stdout, stderr=sys.stderr): self.stdout = stdout self.stderr = stderr self._null_handler = logbook.NullHandler() self._output_handler = OutputHandler(self.stdout) - self._file_handler = DelayedFileHandler() self._relevel_processor = Relevel(allowed=["dbt", "werkzeug"]) self._state_processor = DbtProcessState("internal") self._scrub_processor = ScrubSecrets() @@ -463,7 +364,6 @@ def __init__(self, stdout=sys.stdout, stderr=sys.stderr): [ self._null_handler, self._output_handler, - self._file_handler, self._relevel_processor, self._state_processor, self._scrub_processor, @@ -487,6 +387,15 @@ def add_handler(self, handler): """add an handler to the log manager that runs before the file handler.""" self.objects.append(handler) + def set_path(self, _): + """No-op that allows dbt-rpc to not break. See GH #7661""" + pass + + @property + def initialized(self): + """Dummy return value for dbt-rpc. See GH#7661""" + return True + # this is used by `dbt ls` to allow piping stdout to jq, etc def stderr_console(self): """Output to stderr at WARNING level instead of stdout""" @@ -502,12 +411,6 @@ def set_debug(self): self._output_handler.set_text_format(DEBUG_LOG_FORMAT) self._output_handler.level = logbook.DEBUG - def set_path(self, path): - self._file_handler.set_path(path) - - def initialized(self): - return self._file_handler.initialized - def format_json(self): for handler in self.objects: if isinstance(handler, FormatterMixin): From 4a4b7beeb971ca8f0935aacd1ac6801d40267f3f Mon Sep 17 00:00:00 2001 From: Peter Webb Date: Tue, 23 May 2023 09:30:32 -0400 Subject: [PATCH 09/67] Model Deprecation (#7562) * CT-2461: Work toward model deprecation * CT-2461: Remove unneeded conversions * CT-2461: Fix up unit tests for new fields, correct a couple oversights * CT-2461: Remaining implementation and tests for model/ref deprecation warnings * CT-2461: Changelog entry for deprecation warnings * CT-2461: Refine datetime handling and tests * CT-2461: Fix up unit test data * CT-2461: Fix some more unit test data. * CT-2461: Fix merge issues * CT-2461: Code review items. * CT-2461: Improve version -> str conversion --- .../unreleased/Features-20230509-233329.yaml | 6 + core/dbt/config/renderer.py | 7 +- core/dbt/contracts/graph/manifest.py | 17 + core/dbt/contracts/graph/nodes.py | 3 + core/dbt/contracts/graph/unparsed.py | 22 + core/dbt/contracts/publication.py | 1 + core/dbt/events/types.proto | 43 + core/dbt/events/types.py | 56 ++ core/dbt/events/types_pb2.py | 878 +++++++++--------- core/dbt/parser/manifest.py | 90 +- core/dbt/parser/schemas.py | 10 +- core/dbt/utils.py | 2 +- pytest.ini | 1 + schemas/dbt/manifest/v10.json | 10 + test/unit/test_manifest.py | 1 + .../functional/artifacts/expected_manifest.py | 8 + tests/functional/artifacts/test_artifacts.py | 1 + .../deprecations/model_deprecations.py | 78 ++ tests/unit/test_events.py | 15 + third-party-stubs/msgpack/__init__.pyi | 99 ++ third-party-stubs/msgpack/_version.pyi | 3 + third-party-stubs/msgpack/exceptions.pyi | 16 + third-party-stubs/msgpack/ext.pyi | 28 + third-party-stubs/msgpack/fallback.pyi | 78 ++ 24 files changed, 1031 insertions(+), 442 deletions(-) create mode 100644 .changes/unreleased/Features-20230509-233329.yaml create mode 100644 tests/functional/deprecations/model_deprecations.py create mode 100644 third-party-stubs/msgpack/__init__.pyi create mode 100644 third-party-stubs/msgpack/_version.pyi create mode 100644 third-party-stubs/msgpack/exceptions.pyi create mode 100644 third-party-stubs/msgpack/ext.pyi create mode 100644 third-party-stubs/msgpack/fallback.pyi diff --git a/.changes/unreleased/Features-20230509-233329.yaml b/.changes/unreleased/Features-20230509-233329.yaml new file mode 100644 index 00000000000..5ecfc1b89d3 --- /dev/null +++ b/.changes/unreleased/Features-20230509-233329.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Added warnings for model and ref deprecations +time: 2023-05-09T23:33:29.679333-04:00 +custom: + Author: peterallenwebb + Issue: "7433" diff --git a/core/dbt/config/renderer.py b/core/dbt/config/renderer.py index 69361da18b7..f41ac020662 100644 --- a/core/dbt/config/renderer.py +++ b/core/dbt/config/renderer.py @@ -1,6 +1,7 @@ from typing import Dict, Any, Tuple, Optional, Union, Callable import re import os +from datetime import date from dbt.clients.jinja import get_rendered, catch_jinja from dbt.constants import SECRET_ENV_PREFIX @@ -33,10 +34,10 @@ def render_entry(self, value: Any, keypath: Keypath) -> Any: return self.render_value(value, keypath) def render_value(self, value: Any, keypath: Optional[Keypath] = None) -> Any: - # keypath is ignored. - # if it wasn't read as a string, ignore it + # keypath is ignored (and someone who knows should explain why here) if not isinstance(value, str): - return value + return value if not isinstance(value, date) else value.isoformat() + try: with catch_jinja(): return get_rendered(value, self.context, native=True) diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index 414cf76001e..401d6924f1b 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -965,6 +965,23 @@ def analysis_lookup(self) -> AnalysisLookup: self._analysis_lookup = AnalysisLookup(self) return self._analysis_lookup + def resolve_refs( + self, source_node: GraphMemberNode, current_project: str + ) -> List[MaybeNonSource]: + resolved_refs: List[MaybeNonSource] = [] + for ref in source_node.refs: + resolved = self.resolve_ref( + source_node, + ref.name, + ref.package, + ref.version, + current_project, + source_node.package_name, + ) + resolved_refs.append(resolved) + + return resolved_refs + # Called by dbt.parser.manifest._process_refs_for_exposure, _process_refs_for_metric, # and dbt.parser.manifest._process_refs_for_node def resolve_ref( diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index b71e4694ee3..4529599b596 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -1,4 +1,5 @@ import os +from datetime import datetime import time from dataclasses import dataclass, field from enum import Enum @@ -568,6 +569,7 @@ class ModelNode(CompiledNode): constraints: List[ModelLevelConstraint] = field(default_factory=list) version: Optional[NodeVersion] = None latest_version: Optional[NodeVersion] = None + deprecation_date: Optional[datetime] = None state_relation: Optional[StateRelation] = None @property @@ -1415,6 +1417,7 @@ class ParsedNodePatch(ParsedPatch): version: Optional[NodeVersion] latest_version: Optional[NodeVersion] constraints: List[Dict[str, Any]] + deprecation_date: Optional[datetime] @dataclass diff --git a/core/dbt/contracts/graph/unparsed.py b/core/dbt/contracts/graph/unparsed.py index c305b5a4152..4730b094dfa 100644 --- a/core/dbt/contracts/graph/unparsed.py +++ b/core/dbt/contracts/graph/unparsed.py @@ -1,3 +1,4 @@ +import datetime import re from dbt import deprecations @@ -154,6 +155,7 @@ class UnparsedVersion(dbtClassMixin): columns: Sequence[Union[dbt.helper_types.IncludeExclude, UnparsedColumn]] = field( default_factory=list ) + deprecation_date: Optional[datetime.datetime] = None def __lt__(self, other): try: @@ -192,6 +194,8 @@ def __post_init__(self): else: self._unparsed_columns.append(column) + self.deprecation_date = normalize_date(self.deprecation_date) + @dataclass class UnparsedAnalysisUpdate(HasConfig, HasColumnDocs, HasColumnProps, HasYamlMetadata): @@ -210,6 +214,7 @@ class UnparsedModelUpdate(UnparsedNodeUpdate): access: Optional[str] = None latest_version: Optional[NodeVersion] = None versions: Sequence[UnparsedVersion] = field(default_factory=list) + deprecation_date: Optional[datetime.datetime] = None def __post_init__(self): if self.latest_version: @@ -229,6 +234,8 @@ def __post_init__(self): self._version_map = {version.v: version for version in self.versions} + self.deprecation_date = normalize_date(self.deprecation_date) + def get_columns_for_version(self, version: NodeVersion) -> List[UnparsedColumn]: if version not in self._version_map: raise DbtInternalError( @@ -652,3 +659,18 @@ def validate(cls, data): super(UnparsedGroup, cls).validate(data) if data["owner"].get("name") is None and data["owner"].get("email") is None: raise ValidationError("Group owner must have at least one of 'name' or 'email'.") + + +def normalize_date(d: Optional[datetime.date]) -> Optional[datetime.datetime]: + """Convert date to datetime (at midnight), and add local time zone if naive""" + if d is None: + return None + + # convert date to datetime + dt = d if type(d) == datetime.datetime else datetime.datetime(d.year, d.month, d.day) + + if not dt.tzinfo: + # date is naive, re-interpret as system time zone + dt = dt.astimezone() + + return dt diff --git a/core/dbt/contracts/publication.py b/core/dbt/contracts/publication.py index 2a32feb7f29..d6cfa67b751 100644 --- a/core/dbt/contracts/publication.py +++ b/core/dbt/contracts/publication.py @@ -45,6 +45,7 @@ class PublicModel(dbtClassMixin, ManifestOrPublicNode): # list of model unique_ids public_node_dependencies: List[str] = field(default_factory=list) generated_at: datetime = field(default_factory=datetime.utcnow) + deprecation_date: Optional[datetime] = None @property def is_latest_version(self) -> bool: diff --git a/core/dbt/events/types.proto b/core/dbt/events/types.proto index a8c3bee405a..382916a54f2 100644 --- a/core/dbt/events/types.proto +++ b/core/dbt/events/types.proto @@ -1174,6 +1174,49 @@ message UnpinnedRefNewVersionAvailableMsg { UnpinnedRefNewVersionAvailable data = 2; } +// I065 +message DeprecatedModel { + string model_name = 1; + string model_version = 2; + string deprecation_date = 3; +} + +message DeprecatedModelMsg { + EventInfo info = 1; + DeprecatedModel data = 2; +} + +// I066 +message UpcomingReferenceDeprecation { + string model_name = 1; + string ref_model_package = 2; + string ref_model_name = 3; + string ref_model_version = 4; + string ref_model_latest_version = 5; + string ref_model_deprecation_date = 6; +} + +message UpcomingReferenceDeprecationMsg { + EventInfo info = 1; + UpcomingReferenceDeprecation data = 2; +} + +// I067 +message DeprecatedReference { + string model_name = 1; + string ref_model_package = 2; + string ref_model_name = 3; + string ref_model_version = 4; + string ref_model_latest_version = 5; + string ref_model_deprecation_date = 6; +} + +message DeprecatedReferenceMsg { + EventInfo info = 1; + DeprecatedReference data = 2; +} + + // M - Deps generation // M001 diff --git a/core/dbt/events/types.py b/core/dbt/events/types.py index b5abc73aabe..51fbae31e20 100644 --- a/core/dbt/events/types.py +++ b/core/dbt/events/types.py @@ -1146,6 +1146,62 @@ def message(self) -> str: return msg +class DeprecatedModel(WarnLevel): + def code(self): + return "I065" + + def message(self) -> str: + version = ".v" + self.model_version if self.model_version else "" + return ( + f"Model {self.model_name}{version} has passed its deprecation date of {self.deprecation_date}. " + "This model should be disabled or removed." + ) + + +class UpcomingReferenceDeprecation(WarnLevel): + def code(self): + return "I066" + + def message(self) -> str: + ref_model_version = ".v" + self.ref_model_version if self.ref_model_version else "" + msg = ( + f"While compiling '{self.model_name}': Found a reference to {self.ref_model_name}{ref_model_version}, " + f"which is slated for deprecation on '{self.ref_model_deprecation_date}'. " + ) + + if self.ref_model_version and self.ref_model_version != self.ref_model_latest_version: + coda = ( + f"A new version of '{self.ref_model_name}' is available. Try it out: " + f"{{{{ ref('{self.ref_model_package}', '{self.ref_model_name}', " + f"v='{self.ref_model_latest_version}') }}}}." + ) + msg = msg + coda + + return msg + + +class DeprecatedReference(WarnLevel): + def code(self): + return "I067" + + def message(self) -> str: + ref_model_version = ".v" + self.ref_model_version if self.ref_model_version else "" + msg = ( + f"While compiling '{self.model_name}': Found a reference to {self.ref_model_name}{ref_model_version}, " + f"which was deprecated on '{self.ref_model_deprecation_date}'. " + ) + + if self.ref_model_version and self.ref_model_version != self.ref_model_latest_version: + coda = ( + f"A new version of '{self.ref_model_name}' is available. Migrate now: " + f"{{{{ ref('{self.ref_model_package}', '{self.ref_model_name}', " + f"v='{self.ref_model_latest_version}') }}}}." + ) + msg = msg + coda + + return msg + + # ======================================================= # M - Deps generation # ======================================================= diff --git a/core/dbt/events/types_pb2.py b/core/dbt/events/types_pb2.py index 39b2d854a0e..81777f268c3 100644 --- a/core/dbt/events/types_pb2.py +++ b/core/dbt/events/types_pb2.py @@ -15,7 +15,7 @@ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btypes.proto\x12\x0bproto_types\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x02\n\tEventInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\t\x12\x15\n\rinvocation_id\x18\x05 \x01(\t\x12\x0b\n\x03pid\x18\x06 \x01(\x05\x12\x0e\n\x06thread\x18\x07 \x01(\t\x12&\n\x02ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x05\x65xtra\x18\t \x03(\x0b\x32!.proto_types.EventInfo.ExtraEntry\x12\x10\n\x08\x63\x61tegory\x18\n \x01(\t\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x7f\n\rTimingInfoMsg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x0cNodeRelation\x12\x10\n\x08\x64\x61tabase\x18\n \x01(\t\x12\x0e\n\x06schema\x18\x0b \x01(\t\x12\r\n\x05\x61lias\x18\x0c \x01(\t\x12\x15\n\rrelation_name\x18\r \x01(\t\"\x91\x02\n\x08NodeInfo\x12\x11\n\tnode_path\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x11\n\tunique_id\x18\x03 \x01(\t\x12\x15\n\rresource_type\x18\x04 \x01(\t\x12\x14\n\x0cmaterialized\x18\x05 \x01(\t\x12\x13\n\x0bnode_status\x18\x06 \x01(\t\x12\x17\n\x0fnode_started_at\x18\x07 \x01(\t\x12\x18\n\x10node_finished_at\x18\x08 \x01(\t\x12%\n\x04meta\x18\t \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x30\n\rnode_relation\x18\n \x01(\x0b\x32\x19.proto_types.NodeRelation\"\xd1\x01\n\x0cRunResultMsg\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12/\n\x0btiming_info\x18\x03 \x03(\x0b\x32\x1a.proto_types.TimingInfoMsg\x12\x0e\n\x06thread\x18\x04 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x31\n\x10\x61\x64\x61pter_response\x18\x06 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"G\n\x0fReferenceKeyMsg\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x12\n\nidentifier\x18\x03 \x01(\t\"6\n\x0eGenericMessage\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\"9\n\x11MainReportVersion\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0blog_version\x18\x02 \x01(\x05\"j\n\x14MainReportVersionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.MainReportVersion\"r\n\x0eMainReportArgs\x12\x33\n\x04\x61rgs\x18\x01 \x03(\x0b\x32%.proto_types.MainReportArgs.ArgsEntry\x1a+\n\tArgsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11MainReportArgsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainReportArgs\"+\n\x15MainTrackingUserState\x12\x12\n\nuser_state\x18\x01 \x01(\t\"r\n\x18MainTrackingUserStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainTrackingUserState\"5\n\x0fMergedFromState\x12\x12\n\nnum_merged\x18\x01 \x01(\x05\x12\x0e\n\x06sample\x18\x02 \x03(\t\"f\n\x12MergedFromStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.MergedFromState\"A\n\x14MissingProfileTarget\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\"p\n\x17MissingProfileTargetMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MissingProfileTarget\"(\n\x11InvalidOptionYAML\x12\x13\n\x0boption_name\x18\x01 \x01(\t\"j\n\x14InvalidOptionYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.InvalidOptionYAML\"!\n\x12LogDbtProjectError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15LogDbtProjectErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProjectError\"3\n\x12LogDbtProfileError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08profiles\x18\x02 \x03(\t\"l\n\x15LogDbtProfileErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProfileError\"!\n\x12StarterProjectPath\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"l\n\x15StarterProjectPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StarterProjectPath\"$\n\x15\x43onfigFolderDirectory\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"r\n\x18\x43onfigFolderDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConfigFolderDirectory\"\'\n\x14NoSampleProfileFound\x12\x0f\n\x07\x61\x64\x61pter\x18\x01 \x01(\t\"p\n\x17NoSampleProfileFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NoSampleProfileFound\"6\n\x18ProfileWrittenWithSample\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"x\n\x1bProfileWrittenWithSampleMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProfileWrittenWithSample\"B\n$ProfileWrittenWithTargetTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x90\x01\n\'ProfileWrittenWithTargetTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.ProfileWrittenWithTargetTemplateYAML\"C\n%ProfileWrittenWithProjectTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x92\x01\n(ProfileWrittenWithProjectTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.ProfileWrittenWithProjectTemplateYAML\"\x12\n\x10SettingUpProfile\"h\n\x13SettingUpProfileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SettingUpProfile\"\x1c\n\x1aInvalidProfileTemplateYAML\"|\n\x1dInvalidProfileTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.InvalidProfileTemplateYAML\"(\n\x18ProjectNameAlreadyExists\x12\x0c\n\x04name\x18\x01 \x01(\t\"x\n\x1bProjectNameAlreadyExistsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProjectNameAlreadyExists\"K\n\x0eProjectCreated\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocs_url\x18\x02 \x01(\t\x12\x11\n\tslack_url\x18\x03 \x01(\t\"d\n\x11ProjectCreatedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ProjectCreated\"@\n\x1aPackageRedirectDeprecation\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1dPackageRedirectDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PackageRedirectDeprecation\"\x1f\n\x1dPackageInstallPathDeprecation\"\x82\x01\n PackageInstallPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.PackageInstallPathDeprecation\"H\n\x1b\x43onfigSourcePathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"~\n\x1e\x43onfigSourcePathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigSourcePathDeprecation\"F\n\x19\x43onfigDataPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"z\n\x1c\x43onfigDataPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConfigDataPathDeprecation\"?\n\x19\x41\x64\x61pterDeprecationWarning\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"z\n\x1c\x41\x64\x61pterDeprecationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.AdapterDeprecationWarning\".\n\x17MetricAttributesRenamed\x12\x13\n\x0bmetric_name\x18\x01 \x01(\t\"v\n\x1aMetricAttributesRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.MetricAttributesRenamed\"+\n\x17\x45xposureNameDeprecation\x12\x10\n\x08\x65xposure\x18\x01 \x01(\t\"v\n\x1a\x45xposureNameDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.ExposureNameDeprecation\"^\n\x13InternalDeprecation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x18\n\x10suggested_action\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\"n\n\x16InternalDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.InternalDeprecation\"@\n\x1a\x45nvironmentVariableRenamed\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1d\x45nvironmentVariableRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.EnvironmentVariableRenamed\"3\n\x18\x43onfigLogPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"x\n\x1b\x43onfigLogPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ConfigLogPathDeprecation\"6\n\x1b\x43onfigTargetPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"~\n\x1e\x43onfigTargetPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigTargetPathDeprecation\"!\n\x1f\x43ollectFreshnessReturnSignature\"\x86\x01\n\"CollectFreshnessReturnSignatureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.CollectFreshnessReturnSignature\"\x87\x01\n\x11\x41\x64\x61pterEventDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"j\n\x14\x41\x64\x61pterEventDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventDebug\"\x86\x01\n\x10\x41\x64\x61pterEventInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"h\n\x13\x41\x64\x61pterEventInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.AdapterEventInfo\"\x89\x01\n\x13\x41\x64\x61pterEventWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"n\n\x16\x41\x64\x61pterEventWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.AdapterEventWarning\"\x99\x01\n\x11\x41\x64\x61pterEventError\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\x12\x10\n\x08\x65xc_info\x18\x05 \x01(\t\"j\n\x14\x41\x64\x61pterEventErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventError\"_\n\rNewConnection\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"b\n\x10NewConnectionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NewConnection\"=\n\x10\x43onnectionReused\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x16\n\x0eorig_conn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionReusedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionReused\"0\n\x1b\x43onnectionLeftOpenInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"~\n\x1e\x43onnectionLeftOpenInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConnectionLeftOpenInCleanup\".\n\x19\x43onnectionClosedInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"z\n\x1c\x43onnectionClosedInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConnectionClosedInCleanup\"_\n\x0eRollbackFailed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"d\n\x11RollbackFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RollbackFailed\"O\n\x10\x43onnectionClosed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionClosedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionClosed\"Q\n\x12\x43onnectionLeftOpen\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"l\n\x15\x43onnectionLeftOpenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ConnectionLeftOpen\"G\n\x08Rollback\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"X\n\x0bRollbackMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.Rollback\"@\n\tCacheMiss\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\"Z\n\x0c\x43\x61\x63heMissMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.CacheMiss\"b\n\rListRelations\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12/\n\trelations\x18\x03 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10ListRelationsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ListRelations\"`\n\x0e\x43onnectionUsed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"d\n\x11\x43onnectionUsedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ConnectionUsed\"T\n\x08SQLQuery\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x0b\n\x03sql\x18\x03 \x01(\t\"X\n\x0bSQLQueryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.SQLQuery\"[\n\x0eSQLQueryStatus\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x03 \x01(\x02\"d\n\x11SQLQueryStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SQLQueryStatus\"H\n\tSQLCommit\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"Z\n\x0cSQLCommitMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.SQLCommit\"a\n\rColTypeChange\x12\x11\n\torig_type\x18\x01 \x01(\t\x12\x10\n\x08new_type\x18\x02 \x01(\t\x12+\n\x05table\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10\x43olTypeChangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ColTypeChange\"@\n\x0eSchemaCreation\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"d\n\x11SchemaCreationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SchemaCreation\"<\n\nSchemaDrop\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"\\\n\rSchemaDropMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SchemaDrop\"\xde\x01\n\x0b\x43\x61\x63heAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12-\n\x07ref_key\x18\x02 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_2\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_3\x18\x04 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12.\n\x08ref_list\x18\x05 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"^\n\x0e\x43\x61\x63heActionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.CacheAction\"\x98\x01\n\x0e\x43\x61\x63heDumpGraph\x12\x33\n\x04\x64ump\x18\x01 \x03(\x0b\x32%.proto_types.CacheDumpGraph.DumpEntry\x12\x14\n\x0c\x62\x65\x66ore_after\x18\x02 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\t\x1a+\n\tDumpEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11\x43\x61\x63heDumpGraphMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CacheDumpGraph\"!\n\x12\x41\x64\x61pterImportError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15\x41\x64\x61pterImportErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.AdapterImportError\"#\n\x0fPluginLoadError\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"f\n\x12PluginLoadErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.PluginLoadError\"Z\n\x14NewConnectionOpening\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x18\n\x10\x63onnection_state\x18\x02 \x01(\t\"p\n\x17NewConnectionOpeningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NewConnectionOpening\"8\n\rCodeExecution\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ode_content\x18\x02 \x01(\t\"b\n\x10\x43odeExecutionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.CodeExecution\"6\n\x13\x43odeExecutionStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x02 \x01(\x02\"n\n\x16\x43odeExecutionStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.CodeExecutionStatus\"%\n\x16\x43\x61talogGenerationError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"t\n\x19\x43\x61talogGenerationErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.CatalogGenerationError\"-\n\x13WriteCatalogFailure\x12\x16\n\x0enum_exceptions\x18\x01 \x01(\x05\"n\n\x16WriteCatalogFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.WriteCatalogFailure\"\x1e\n\x0e\x43\x61talogWritten\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43\x61talogWrittenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CatalogWritten\"\x14\n\x12\x43\x61nnotGenerateDocs\"l\n\x15\x43\x61nnotGenerateDocsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.CannotGenerateDocs\"\x11\n\x0f\x42uildingCatalog\"f\n\x12\x42uildingCatalogMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.BuildingCatalog\"-\n\x18\x44\x61tabaseErrorRunningHook\x12\x11\n\thook_type\x18\x01 \x01(\t\"x\n\x1b\x44\x61tabaseErrorRunningHookMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DatabaseErrorRunningHook\"4\n\x0cHooksRunning\x12\x11\n\tnum_hooks\x18\x01 \x01(\x05\x12\x11\n\thook_type\x18\x02 \x01(\t\"`\n\x0fHooksRunningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.HooksRunning\"T\n\x14\x46inishedRunningStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\x12\x11\n\texecution\x18\x02 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x03 \x01(\x02\"p\n\x17\x46inishedRunningStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.FinishedRunningStats\"<\n\x15\x43onstraintNotEnforced\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"r\n\x18\x43onstraintNotEnforcedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConstraintNotEnforced\"=\n\x16\x43onstraintNotSupported\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"t\n\x19\x43onstraintNotSupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.ConstraintNotSupported\"7\n\x12InputFileDiffError\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x02 \x01(\t\"l\n\x15InputFileDiffErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InputFileDiffError\"t\n\x1aPublicationArtifactChanged\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"|\n\x1dPublicationArtifactChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PublicationArtifactChanged\"?\n\x14InvalidValueForField\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x13\n\x0b\x66ield_value\x18\x02 \x01(\t\"p\n\x17InvalidValueForFieldMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.InvalidValueForField\"Q\n\x11ValidationWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x11\n\tnode_name\x18\x03 \x01(\t\"j\n\x14ValidationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ValidationWarning\"!\n\x11ParsePerfInfoPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"j\n\x14ParsePerfInfoPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ParsePerfInfoPath\"1\n!PartialParsingErrorProcessingFile\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\"\x8a\x01\n$PartialParsingErrorProcessingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.PartialParsingErrorProcessingFile\"\x86\x01\n\x13PartialParsingError\x12?\n\x08\x65xc_info\x18\x01 \x03(\x0b\x32-.proto_types.PartialParsingError.ExcInfoEntry\x1a.\n\x0c\x45xcInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"n\n\x16PartialParsingErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.PartialParsingError\"\x1b\n\x19PartialParsingSkipParsing\"z\n\x1cPartialParsingSkipParsingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.PartialParsingSkipParsing\"&\n\x14UnableToPartialParse\x12\x0e\n\x06reason\x18\x01 \x01(\t\"p\n\x17UnableToPartialParseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.UnableToPartialParse\"f\n\x12StateCheckVarsHash\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\x12\x0c\n\x04vars\x18\x02 \x01(\t\x12\x0f\n\x07profile\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\"l\n\x15StateCheckVarsHashMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StateCheckVarsHash\"\x1a\n\x18PartialParsingNotEnabled\"x\n\x1bPartialParsingNotEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.PartialParsingNotEnabled\"C\n\x14ParsedFileLoadFailed\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"p\n\x17ParsedFileLoadFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.ParsedFileLoadFailed\"H\n\x15PartialParsingEnabled\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x05\x12\r\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x05\x12\x0f\n\x07\x63hanged\x18\x03 \x01(\x05\"r\n\x18PartialParsingEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.PartialParsingEnabled\"8\n\x12PartialParsingFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\"l\n\x15PartialParsingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.PartialParsingFile\"\xaf\x01\n\x1fInvalidDisabledTargetInTestNode\x12\x1b\n\x13resource_type_title\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1a\n\x12original_file_path\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\x12\x13\n\x0btarget_name\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\"\x86\x01\n\"InvalidDisabledTargetInTestNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.InvalidDisabledTargetInTestNode\"7\n\x18UnusedResourceConfigPath\x12\x1b\n\x13unused_config_paths\x18\x01 \x03(\t\"x\n\x1bUnusedResourceConfigPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.UnusedResourceConfigPath\"3\n\rSeedIncreased\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"b\n\x10SeedIncreasedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.SeedIncreased\">\n\x18SeedExceedsLimitSamePath\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"x\n\x1bSeedExceedsLimitSamePathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.SeedExceedsLimitSamePath\"D\n\x1eSeedExceedsLimitAndPathChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x84\x01\n!SeedExceedsLimitAndPathChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.SeedExceedsLimitAndPathChanged\"\\\n\x1fSeedExceedsLimitChecksumChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rchecksum_name\x18\x03 \x01(\t\"\x86\x01\n\"SeedExceedsLimitChecksumChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.SeedExceedsLimitChecksumChanged\"%\n\x0cUnusedTables\x12\x15\n\runused_tables\x18\x01 \x03(\t\"`\n\x0fUnusedTablesMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.UnusedTables\"\x87\x01\n\x17WrongResourceSchemaFile\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x1c\n\x14plural_resource_type\x18\x03 \x01(\t\x12\x10\n\x08yaml_key\x18\x04 \x01(\t\x12\x11\n\tfile_path\x18\x05 \x01(\t\"v\n\x1aWrongResourceSchemaFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.WrongResourceSchemaFile\"K\n\x10NoNodeForYamlKey\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x10\n\x08yaml_key\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x03 \x01(\t\"h\n\x13NoNodeForYamlKeyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.NoNodeForYamlKey\"+\n\x15MacroNotFoundForPatch\x12\x12\n\npatch_name\x18\x01 \x01(\t\"r\n\x18MacroNotFoundForPatchMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MacroNotFoundForPatch\"\xb8\x01\n\x16NodeNotFoundOrDisabled\x12\x1a\n\x12original_file_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1b\n\x13resource_type_title\x18\x03 \x01(\t\x12\x13\n\x0btarget_name\x18\x04 \x01(\t\x12\x13\n\x0btarget_kind\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\x12\x10\n\x08\x64isabled\x18\x07 \x01(\t\"t\n\x19NodeNotFoundOrDisabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.NodeNotFoundOrDisabled\"H\n\x0fJinjaLogWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"f\n\x12JinjaLogWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.JinjaLogWarning\"E\n\x0cJinjaLogInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"`\n\x0fJinjaLogInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.JinjaLogInfo\"F\n\rJinjaLogDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"b\n\x10JinjaLogDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.JinjaLogDebug\"\xae\x01\n\x1eUnpinnedRefNewVersionAvailable\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rref_node_name\x18\x02 \x01(\t\x12\x18\n\x10ref_node_package\x18\x03 \x01(\t\x12\x18\n\x10ref_node_version\x18\x04 \x01(\t\x12\x17\n\x0fref_max_version\x18\x05 \x01(\t\"\x84\x01\n!UnpinnedRefNewVersionAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.UnpinnedRefNewVersionAvailable\"/\n\x1dGitSparseCheckoutSubdirectory\x12\x0e\n\x06subdir\x18\x01 \x01(\t\"\x82\x01\n GitSparseCheckoutSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.GitSparseCheckoutSubdirectory\"/\n\x1bGitProgressCheckoutRevision\x12\x10\n\x08revision\x18\x01 \x01(\t\"~\n\x1eGitProgressCheckoutRevisionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.GitProgressCheckoutRevision\"4\n%GitProgressUpdatingExistingDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x92\x01\n(GitProgressUpdatingExistingDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.GitProgressUpdatingExistingDependency\".\n\x1fGitProgressPullingNewDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x86\x01\n\"GitProgressPullingNewDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressPullingNewDependency\"\x1d\n\x0eGitNothingToDo\x12\x0b\n\x03sha\x18\x01 \x01(\t\"d\n\x11GitNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.GitNothingToDo\"E\n\x1fGitProgressUpdatedCheckoutRange\x12\x11\n\tstart_sha\x18\x01 \x01(\t\x12\x0f\n\x07\x65nd_sha\x18\x02 \x01(\t\"\x86\x01\n\"GitProgressUpdatedCheckoutRangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressUpdatedCheckoutRange\"*\n\x17GitProgressCheckedOutAt\x12\x0f\n\x07\x65nd_sha\x18\x01 \x01(\t\"v\n\x1aGitProgressCheckedOutAtMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.GitProgressCheckedOutAt\")\n\x1aRegistryProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"|\n\x1dRegistryProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.RegistryProgressGETRequest\"=\n\x1bRegistryProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"~\n\x1eRegistryProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RegistryProgressGETResponse\"_\n\x1dSelectorReportInvalidSelector\x12\x17\n\x0fvalid_selectors\x18\x01 \x01(\t\x12\x13\n\x0bspec_method\x18\x02 \x01(\t\x12\x10\n\x08raw_spec\x18\x03 \x01(\t\"\x82\x01\n SelectorReportInvalidSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.SelectorReportInvalidSelector\"\x15\n\x13\x44\x65psNoPackagesFound\"n\n\x16\x44\x65psNoPackagesFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsNoPackagesFound\"/\n\x17\x44\x65psStartPackageInstall\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\"v\n\x1a\x44\x65psStartPackageInstallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsStartPackageInstall\"\'\n\x0f\x44\x65psInstallInfo\x12\x14\n\x0cversion_name\x18\x01 \x01(\t\"f\n\x12\x44\x65psInstallInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DepsInstallInfo\"-\n\x13\x44\x65psUpdateAvailable\x12\x16\n\x0eversion_latest\x18\x01 \x01(\t\"n\n\x16\x44\x65psUpdateAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsUpdateAvailable\"\x0e\n\x0c\x44\x65psUpToDate\"`\n\x0f\x44\x65psUpToDateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUpToDate\",\n\x14\x44\x65psListSubdirectory\x12\x14\n\x0csubdirectory\x18\x01 \x01(\t\"p\n\x17\x44\x65psListSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.DepsListSubdirectory\".\n\x1a\x44\x65psNotifyUpdatesAvailable\x12\x10\n\x08packages\x18\x01 \x03(\t\"|\n\x1d\x44\x65psNotifyUpdatesAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.DepsNotifyUpdatesAvailable\"1\n\x11RetryExternalCall\x12\x0f\n\x07\x61ttempt\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"j\n\x14RetryExternalCallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.RetryExternalCall\"#\n\x14RecordRetryException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17RecordRetryExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.RecordRetryException\".\n\x1fRegistryIndexProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"\x86\x01\n\"RegistryIndexProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryIndexProgressGETRequest\"B\n RegistryIndexProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"\x88\x01\n#RegistryIndexProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12;\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32-.proto_types.RegistryIndexProgressGETResponse\"2\n\x1eRegistryResponseUnexpectedType\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseUnexpectedTypeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseUnexpectedType\"2\n\x1eRegistryResponseMissingTopKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseMissingTopKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseMissingTopKeys\"5\n!RegistryResponseMissingNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x8a\x01\n$RegistryResponseMissingNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.RegistryResponseMissingNestedKeys\"3\n\x1fRegistryResponseExtraNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x86\x01\n\"RegistryResponseExtraNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryResponseExtraNestedKeys\"(\n\x18\x44\x65psSetDownloadDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\"x\n\x1b\x44\x65psSetDownloadDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsSetDownloadDirectory\"-\n\x0c\x44\x65psUnpinned\x12\x10\n\x08revision\x18\x01 \x01(\t\x12\x0b\n\x03git\x18\x02 \x01(\t\"`\n\x0f\x44\x65psUnpinnedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUnpinned\"/\n\x1bNoNodesForSelectionCriteria\x12\x10\n\x08spec_raw\x18\x01 \x01(\t\"~\n\x1eNoNodesForSelectionCriteriaMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.NoNodesForSelectionCriteria\"*\n\x1bRunningOperationCaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"~\n\x1eRunningOperationCaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RunningOperationCaughtError\"\x11\n\x0f\x43ompileComplete\"f\n\x12\x43ompileCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.CompileComplete\"\x18\n\x16\x46reshnessCheckComplete\"t\n\x19\x46reshnessCheckCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.FreshnessCheckComplete\"\x1c\n\nSeedHeader\x12\x0e\n\x06header\x18\x01 \x01(\t\"\\\n\rSeedHeaderMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SeedHeader\"3\n\x12SQLRunnerException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x02 \x01(\t\"l\n\x15SQLRunnerExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SQLRunnerException\"\xa8\x01\n\rLogTestResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x12\n\nnum_models\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"b\n\x10LogTestResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogTestResult\"k\n\x0cLogStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"`\n\x0fLogStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.LogStartLine\"\x95\x01\n\x0eLogModelResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogModelResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogModelResult\"\xfa\x01\n\x11LogSnapshotResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x34\n\x03\x63\x66g\x18\x07 \x03(\x0b\x32\'.proto_types.LogSnapshotResult.CfgEntry\x1a*\n\x08\x43\x66gEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"j\n\x14LogSnapshotResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.LogSnapshotResult\"\xb9\x01\n\rLogSeedResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x16\n\x0eresult_message\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x10\n\x08relation\x18\x08 \x01(\t\"b\n\x10LogSeedResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogSeedResult\"\xad\x01\n\x12LogFreshnessResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12(\n\tnode_info\x18\x02 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x13\n\x0bsource_name\x18\x06 \x01(\t\x12\x12\n\ntable_name\x18\x07 \x01(\t\"l\n\x15LogFreshnessResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogFreshnessResult\"\"\n\rLogCancelLine\x12\x11\n\tconn_name\x18\x01 \x01(\t\"b\n\x10LogCancelLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogCancelLine\"\x1f\n\x0f\x44\x65\x66\x61ultSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"f\n\x12\x44\x65\x66\x61ultSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DefaultSelector\"5\n\tNodeStart\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"Z\n\x0cNodeStartMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.NodeStart\"g\n\x0cNodeFinished\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12-\n\nrun_result\x18\x02 \x01(\x0b\x32\x19.proto_types.RunResultMsg\"`\n\x0fNodeFinishedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.NodeFinished\"+\n\x1bQueryCancelationUnsupported\x12\x0c\n\x04type\x18\x01 \x01(\t\"~\n\x1eQueryCancelationUnsupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.QueryCancelationUnsupported\"O\n\x0f\x43oncurrencyLine\x12\x13\n\x0bnum_threads\x18\x01 \x01(\x05\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\x12\x12\n\nnode_count\x18\x03 \x01(\x05\"f\n\x12\x43oncurrencyLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ConcurrencyLine\"E\n\x19WritingInjectedSQLForNode\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"z\n\x1cWritingInjectedSQLForNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.WritingInjectedSQLForNode\"9\n\rNodeCompiling\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeCompilingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeCompiling\"9\n\rNodeExecuting\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeExecutingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeExecuting\"m\n\x10LogHookStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"h\n\x13LogHookStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.LogHookStartLine\"\x93\x01\n\x0eLogHookEndLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogHookEndLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogHookEndLine\"\x93\x01\n\x0fSkippingDetails\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\x12\x11\n\tnode_name\x18\x04 \x01(\t\x12\r\n\x05index\x18\x05 \x01(\x05\x12\r\n\x05total\x18\x06 \x01(\x05\"f\n\x12SkippingDetailsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SkippingDetails\"\r\n\x0bNothingToDo\"^\n\x0eNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.NothingToDo\",\n\x1dRunningOperationUncaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"\x82\x01\n RunningOperationUncaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.RunningOperationUncaughtError\"\x93\x01\n\x0c\x45ndRunResult\x12*\n\x07results\x18\x01 \x03(\x0b\x32\x19.proto_types.RunResultMsg\x12\x14\n\x0c\x65lapsed_time\x18\x02 \x01(\x02\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07success\x18\x04 \x01(\x08\"`\n\x0f\x45ndRunResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.EndRunResult\"\x11\n\x0fNoNodesSelected\"f\n\x12NoNodesSelectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.NoNodesSelected\"w\n\x10\x43ommandCompleted\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x65lapsed\x18\x04 \x01(\x02\"h\n\x13\x43ommandCompletedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.CommandCompleted\"k\n\x08ShowNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0f\n\x07preview\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"X\n\x0bShowNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.ShowNode\"p\n\x0c\x43ompiledNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x10\n\x08\x63ompiled\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"`\n\x0f\x43ompiledNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.CompiledNode\"b\n\x17\x43\x61tchableExceptionOnRun\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"v\n\x1a\x43\x61tchableExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.CatchableExceptionOnRun\"5\n\x12InternalErrorOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\"l\n\x15InternalErrorOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InternalErrorOnRun\"K\n\x15GenericExceptionOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"r\n\x18GenericExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.GenericExceptionOnRun\"N\n\x1aNodeConnectionReleaseError\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"|\n\x1dNodeConnectionReleaseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.NodeConnectionReleaseError\"\x1f\n\nFoundStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\"\\\n\rFoundStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.FoundStats\"\x17\n\x15MainKeyboardInterrupt\"r\n\x18MainKeyboardInterruptMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainKeyboardInterrupt\"#\n\x14MainEncounteredError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17MainEncounteredErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MainEncounteredError\"%\n\x0eMainStackTrace\x12\x13\n\x0bstack_trace\x18\x01 \x01(\t\"d\n\x11MainStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainStackTrace\"@\n\x13SystemCouldNotWrite\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"n\n\x16SystemCouldNotWriteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.SystemCouldNotWrite\"!\n\x12SystemExecutingCmd\x12\x0b\n\x03\x63md\x18\x01 \x03(\t\"l\n\x15SystemExecutingCmdMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SystemExecutingCmd\"\x1c\n\x0cSystemStdOut\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdOut\"\x1c\n\x0cSystemStdErr\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdErrMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdErr\",\n\x16SystemReportReturnCode\x12\x12\n\nreturncode\x18\x01 \x01(\x05\"t\n\x19SystemReportReturnCodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.SystemReportReturnCode\"p\n\x13TimingInfoCollected\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12/\n\x0btiming_info\x18\x02 \x01(\x0b\x32\x1a.proto_types.TimingInfoMsg\"n\n\x16TimingInfoCollectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.TimingInfoCollected\"&\n\x12LogDebugStackTrace\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"l\n\x15LogDebugStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDebugStackTrace\"\x1e\n\x0e\x43heckCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43heckCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CheckCleanPath\" \n\x10\x43onfirmCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"h\n\x13\x43onfirmCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConfirmCleanPath\"\"\n\x12ProtectedCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"l\n\x15ProtectedCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ProtectedCleanPath\"\x14\n\x12\x46inishedCleanPaths\"l\n\x15\x46inishedCleanPathsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FinishedCleanPaths\"5\n\x0bOpenCommand\x12\x10\n\x08open_cmd\x18\x01 \x01(\t\x12\x14\n\x0cprofiles_dir\x18\x02 \x01(\t\"^\n\x0eOpenCommandMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.OpenCommand\"\x19\n\nFormatting\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rFormattingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.Formatting\"0\n\x0fServingDocsPort\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"f\n\x12ServingDocsPortMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ServingDocsPort\"%\n\x15ServingDocsAccessInfo\x12\x0c\n\x04port\x18\x01 \x01(\t\"r\n\x18ServingDocsAccessInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ServingDocsAccessInfo\"\x15\n\x13ServingDocsExitInfo\"n\n\x16ServingDocsExitInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.ServingDocsExitInfo\"J\n\x10RunResultWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultWarning\"J\n\x10RunResultFailure\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultFailure\"k\n\tStatsLine\x12\x30\n\x05stats\x18\x01 \x03(\x0b\x32!.proto_types.StatsLine.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"Z\n\x0cStatsLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.StatsLine\"\x1d\n\x0eRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11RunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RunResultError\")\n\x17RunResultErrorNoMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"v\n\x1aRunResultErrorNoMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultErrorNoMessage\"\x1f\n\x0fSQLCompiledPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"f\n\x12SQLCompiledPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SQLCompiledPath\"-\n\x14\x43heckNodeTestFailure\x12\x15\n\rrelation_name\x18\x01 \x01(\t\"p\n\x17\x43heckNodeTestFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.CheckNodeTestFailure\"\"\n\x13\x46irstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"n\n\x16\x46irstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.FirstRunResultError\"\'\n\x18\x41\x66terFirstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"x\n\x1b\x41\x66terFirstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.AfterFirstRunResultError\"W\n\x0f\x45ndOfRunSummary\x12\x12\n\nnum_errors\x18\x01 \x01(\x05\x12\x14\n\x0cnum_warnings\x18\x02 \x01(\x05\x12\x1a\n\x12keyboard_interrupt\x18\x03 \x01(\x08\"f\n\x12\x45ndOfRunSummaryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.EndOfRunSummary\"U\n\x13LogSkipBecauseError\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12\x10\n\x08relation\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"n\n\x16LogSkipBecauseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.LogSkipBecauseError\"\x14\n\x12\x45nsureGitInstalled\"l\n\x15\x45nsureGitInstalledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.EnsureGitInstalled\"\x1a\n\x18\x44\x65psCreatingLocalSymlink\"x\n\x1b\x44\x65psCreatingLocalSymlinkMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsCreatingLocalSymlink\"\x19\n\x17\x44\x65psSymlinkNotAvailable\"v\n\x1a\x44\x65psSymlinkNotAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsSymlinkNotAvailable\"\x11\n\x0f\x44isableTracking\"f\n\x12\x44isableTrackingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DisableTracking\"\x1e\n\x0cSendingEvent\x12\x0e\n\x06kwargs\x18\x01 \x01(\t\"`\n\x0fSendingEventMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SendingEvent\"\x12\n\x10SendEventFailure\"h\n\x13SendEventFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SendEventFailure\"\r\n\x0b\x46lushEvents\"^\n\x0e\x46lushEventsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.FlushEvents\"\x14\n\x12\x46lushEventsFailure\"l\n\x15\x46lushEventsFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FlushEventsFailure\"-\n\x19TrackingInitializeFailure\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"z\n\x1cTrackingInitializeFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.TrackingInitializeFailure\"&\n\x17RunResultWarningMessage\x12\x0b\n\x03msg\x18\x01 \x01(\t\"v\n\x1aRunResultWarningMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultWarningMessage\"\x1a\n\x0b\x44\x65\x62ugCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"^\n\x0e\x44\x65\x62ugCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.DebugCmdOut\"\x1d\n\x0e\x44\x65\x62ugCmdResult\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11\x44\x65\x62ugCmdResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.DebugCmdResult\"\x19\n\nListCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rListCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.ListCmdOut\"\x13\n\x04Note\x12\x0b\n\x03msg\x18\x01 \x01(\t\"P\n\x07NoteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x1f\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x11.proto_types.Noteb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btypes.proto\x12\x0bproto_types\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x02\n\tEventInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\t\x12\x15\n\rinvocation_id\x18\x05 \x01(\t\x12\x0b\n\x03pid\x18\x06 \x01(\x05\x12\x0e\n\x06thread\x18\x07 \x01(\t\x12&\n\x02ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x05\x65xtra\x18\t \x03(\x0b\x32!.proto_types.EventInfo.ExtraEntry\x12\x10\n\x08\x63\x61tegory\x18\n \x01(\t\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x7f\n\rTimingInfoMsg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x0cNodeRelation\x12\x10\n\x08\x64\x61tabase\x18\n \x01(\t\x12\x0e\n\x06schema\x18\x0b \x01(\t\x12\r\n\x05\x61lias\x18\x0c \x01(\t\x12\x15\n\rrelation_name\x18\r \x01(\t\"\x91\x02\n\x08NodeInfo\x12\x11\n\tnode_path\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x11\n\tunique_id\x18\x03 \x01(\t\x12\x15\n\rresource_type\x18\x04 \x01(\t\x12\x14\n\x0cmaterialized\x18\x05 \x01(\t\x12\x13\n\x0bnode_status\x18\x06 \x01(\t\x12\x17\n\x0fnode_started_at\x18\x07 \x01(\t\x12\x18\n\x10node_finished_at\x18\x08 \x01(\t\x12%\n\x04meta\x18\t \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x30\n\rnode_relation\x18\n \x01(\x0b\x32\x19.proto_types.NodeRelation\"\xd1\x01\n\x0cRunResultMsg\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12/\n\x0btiming_info\x18\x03 \x03(\x0b\x32\x1a.proto_types.TimingInfoMsg\x12\x0e\n\x06thread\x18\x04 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x31\n\x10\x61\x64\x61pter_response\x18\x06 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"G\n\x0fReferenceKeyMsg\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x12\n\nidentifier\x18\x03 \x01(\t\"6\n\x0eGenericMessage\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\"9\n\x11MainReportVersion\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0blog_version\x18\x02 \x01(\x05\"j\n\x14MainReportVersionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.MainReportVersion\"r\n\x0eMainReportArgs\x12\x33\n\x04\x61rgs\x18\x01 \x03(\x0b\x32%.proto_types.MainReportArgs.ArgsEntry\x1a+\n\tArgsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11MainReportArgsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainReportArgs\"+\n\x15MainTrackingUserState\x12\x12\n\nuser_state\x18\x01 \x01(\t\"r\n\x18MainTrackingUserStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainTrackingUserState\"5\n\x0fMergedFromState\x12\x12\n\nnum_merged\x18\x01 \x01(\x05\x12\x0e\n\x06sample\x18\x02 \x03(\t\"f\n\x12MergedFromStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.MergedFromState\"A\n\x14MissingProfileTarget\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\"p\n\x17MissingProfileTargetMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MissingProfileTarget\"(\n\x11InvalidOptionYAML\x12\x13\n\x0boption_name\x18\x01 \x01(\t\"j\n\x14InvalidOptionYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.InvalidOptionYAML\"!\n\x12LogDbtProjectError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15LogDbtProjectErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProjectError\"3\n\x12LogDbtProfileError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08profiles\x18\x02 \x03(\t\"l\n\x15LogDbtProfileErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProfileError\"!\n\x12StarterProjectPath\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"l\n\x15StarterProjectPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StarterProjectPath\"$\n\x15\x43onfigFolderDirectory\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"r\n\x18\x43onfigFolderDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConfigFolderDirectory\"\'\n\x14NoSampleProfileFound\x12\x0f\n\x07\x61\x64\x61pter\x18\x01 \x01(\t\"p\n\x17NoSampleProfileFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NoSampleProfileFound\"6\n\x18ProfileWrittenWithSample\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"x\n\x1bProfileWrittenWithSampleMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProfileWrittenWithSample\"B\n$ProfileWrittenWithTargetTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x90\x01\n\'ProfileWrittenWithTargetTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.ProfileWrittenWithTargetTemplateYAML\"C\n%ProfileWrittenWithProjectTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x92\x01\n(ProfileWrittenWithProjectTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.ProfileWrittenWithProjectTemplateYAML\"\x12\n\x10SettingUpProfile\"h\n\x13SettingUpProfileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SettingUpProfile\"\x1c\n\x1aInvalidProfileTemplateYAML\"|\n\x1dInvalidProfileTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.InvalidProfileTemplateYAML\"(\n\x18ProjectNameAlreadyExists\x12\x0c\n\x04name\x18\x01 \x01(\t\"x\n\x1bProjectNameAlreadyExistsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProjectNameAlreadyExists\"K\n\x0eProjectCreated\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocs_url\x18\x02 \x01(\t\x12\x11\n\tslack_url\x18\x03 \x01(\t\"d\n\x11ProjectCreatedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ProjectCreated\"@\n\x1aPackageRedirectDeprecation\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1dPackageRedirectDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PackageRedirectDeprecation\"\x1f\n\x1dPackageInstallPathDeprecation\"\x82\x01\n PackageInstallPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.PackageInstallPathDeprecation\"H\n\x1b\x43onfigSourcePathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"~\n\x1e\x43onfigSourcePathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigSourcePathDeprecation\"F\n\x19\x43onfigDataPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"z\n\x1c\x43onfigDataPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConfigDataPathDeprecation\"?\n\x19\x41\x64\x61pterDeprecationWarning\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"z\n\x1c\x41\x64\x61pterDeprecationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.AdapterDeprecationWarning\".\n\x17MetricAttributesRenamed\x12\x13\n\x0bmetric_name\x18\x01 \x01(\t\"v\n\x1aMetricAttributesRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.MetricAttributesRenamed\"+\n\x17\x45xposureNameDeprecation\x12\x10\n\x08\x65xposure\x18\x01 \x01(\t\"v\n\x1a\x45xposureNameDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.ExposureNameDeprecation\"^\n\x13InternalDeprecation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x18\n\x10suggested_action\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\"n\n\x16InternalDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.InternalDeprecation\"@\n\x1a\x45nvironmentVariableRenamed\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1d\x45nvironmentVariableRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.EnvironmentVariableRenamed\"3\n\x18\x43onfigLogPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"x\n\x1b\x43onfigLogPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ConfigLogPathDeprecation\"6\n\x1b\x43onfigTargetPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"~\n\x1e\x43onfigTargetPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigTargetPathDeprecation\"!\n\x1f\x43ollectFreshnessReturnSignature\"\x86\x01\n\"CollectFreshnessReturnSignatureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.CollectFreshnessReturnSignature\"\x87\x01\n\x11\x41\x64\x61pterEventDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"j\n\x14\x41\x64\x61pterEventDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventDebug\"\x86\x01\n\x10\x41\x64\x61pterEventInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"h\n\x13\x41\x64\x61pterEventInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.AdapterEventInfo\"\x89\x01\n\x13\x41\x64\x61pterEventWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"n\n\x16\x41\x64\x61pterEventWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.AdapterEventWarning\"\x99\x01\n\x11\x41\x64\x61pterEventError\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\x12\x10\n\x08\x65xc_info\x18\x05 \x01(\t\"j\n\x14\x41\x64\x61pterEventErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventError\"_\n\rNewConnection\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"b\n\x10NewConnectionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NewConnection\"=\n\x10\x43onnectionReused\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x16\n\x0eorig_conn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionReusedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionReused\"0\n\x1b\x43onnectionLeftOpenInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"~\n\x1e\x43onnectionLeftOpenInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConnectionLeftOpenInCleanup\".\n\x19\x43onnectionClosedInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"z\n\x1c\x43onnectionClosedInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConnectionClosedInCleanup\"_\n\x0eRollbackFailed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"d\n\x11RollbackFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RollbackFailed\"O\n\x10\x43onnectionClosed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionClosedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionClosed\"Q\n\x12\x43onnectionLeftOpen\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"l\n\x15\x43onnectionLeftOpenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ConnectionLeftOpen\"G\n\x08Rollback\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"X\n\x0bRollbackMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.Rollback\"@\n\tCacheMiss\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\"Z\n\x0c\x43\x61\x63heMissMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.CacheMiss\"b\n\rListRelations\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12/\n\trelations\x18\x03 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10ListRelationsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ListRelations\"`\n\x0e\x43onnectionUsed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"d\n\x11\x43onnectionUsedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ConnectionUsed\"T\n\x08SQLQuery\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x0b\n\x03sql\x18\x03 \x01(\t\"X\n\x0bSQLQueryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.SQLQuery\"[\n\x0eSQLQueryStatus\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x03 \x01(\x02\"d\n\x11SQLQueryStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SQLQueryStatus\"H\n\tSQLCommit\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"Z\n\x0cSQLCommitMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.SQLCommit\"a\n\rColTypeChange\x12\x11\n\torig_type\x18\x01 \x01(\t\x12\x10\n\x08new_type\x18\x02 \x01(\t\x12+\n\x05table\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10\x43olTypeChangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ColTypeChange\"@\n\x0eSchemaCreation\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"d\n\x11SchemaCreationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SchemaCreation\"<\n\nSchemaDrop\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"\\\n\rSchemaDropMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SchemaDrop\"\xde\x01\n\x0b\x43\x61\x63heAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12-\n\x07ref_key\x18\x02 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_2\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_3\x18\x04 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12.\n\x08ref_list\x18\x05 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"^\n\x0e\x43\x61\x63heActionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.CacheAction\"\x98\x01\n\x0e\x43\x61\x63heDumpGraph\x12\x33\n\x04\x64ump\x18\x01 \x03(\x0b\x32%.proto_types.CacheDumpGraph.DumpEntry\x12\x14\n\x0c\x62\x65\x66ore_after\x18\x02 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\t\x1a+\n\tDumpEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11\x43\x61\x63heDumpGraphMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CacheDumpGraph\"!\n\x12\x41\x64\x61pterImportError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15\x41\x64\x61pterImportErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.AdapterImportError\"#\n\x0fPluginLoadError\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"f\n\x12PluginLoadErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.PluginLoadError\"Z\n\x14NewConnectionOpening\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x18\n\x10\x63onnection_state\x18\x02 \x01(\t\"p\n\x17NewConnectionOpeningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NewConnectionOpening\"8\n\rCodeExecution\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ode_content\x18\x02 \x01(\t\"b\n\x10\x43odeExecutionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.CodeExecution\"6\n\x13\x43odeExecutionStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x02 \x01(\x02\"n\n\x16\x43odeExecutionStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.CodeExecutionStatus\"%\n\x16\x43\x61talogGenerationError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"t\n\x19\x43\x61talogGenerationErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.CatalogGenerationError\"-\n\x13WriteCatalogFailure\x12\x16\n\x0enum_exceptions\x18\x01 \x01(\x05\"n\n\x16WriteCatalogFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.WriteCatalogFailure\"\x1e\n\x0e\x43\x61talogWritten\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43\x61talogWrittenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CatalogWritten\"\x14\n\x12\x43\x61nnotGenerateDocs\"l\n\x15\x43\x61nnotGenerateDocsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.CannotGenerateDocs\"\x11\n\x0f\x42uildingCatalog\"f\n\x12\x42uildingCatalogMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.BuildingCatalog\"-\n\x18\x44\x61tabaseErrorRunningHook\x12\x11\n\thook_type\x18\x01 \x01(\t\"x\n\x1b\x44\x61tabaseErrorRunningHookMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DatabaseErrorRunningHook\"4\n\x0cHooksRunning\x12\x11\n\tnum_hooks\x18\x01 \x01(\x05\x12\x11\n\thook_type\x18\x02 \x01(\t\"`\n\x0fHooksRunningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.HooksRunning\"T\n\x14\x46inishedRunningStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\x12\x11\n\texecution\x18\x02 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x03 \x01(\x02\"p\n\x17\x46inishedRunningStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.FinishedRunningStats\"<\n\x15\x43onstraintNotEnforced\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"r\n\x18\x43onstraintNotEnforcedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConstraintNotEnforced\"=\n\x16\x43onstraintNotSupported\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"t\n\x19\x43onstraintNotSupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.ConstraintNotSupported\"7\n\x12InputFileDiffError\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x02 \x01(\t\"l\n\x15InputFileDiffErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InputFileDiffError\"t\n\x1aPublicationArtifactChanged\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"|\n\x1dPublicationArtifactChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PublicationArtifactChanged\"?\n\x14InvalidValueForField\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x13\n\x0b\x66ield_value\x18\x02 \x01(\t\"p\n\x17InvalidValueForFieldMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.InvalidValueForField\"Q\n\x11ValidationWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x11\n\tnode_name\x18\x03 \x01(\t\"j\n\x14ValidationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ValidationWarning\"!\n\x11ParsePerfInfoPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"j\n\x14ParsePerfInfoPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ParsePerfInfoPath\"1\n!PartialParsingErrorProcessingFile\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\"\x8a\x01\n$PartialParsingErrorProcessingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.PartialParsingErrorProcessingFile\"\x86\x01\n\x13PartialParsingError\x12?\n\x08\x65xc_info\x18\x01 \x03(\x0b\x32-.proto_types.PartialParsingError.ExcInfoEntry\x1a.\n\x0c\x45xcInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"n\n\x16PartialParsingErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.PartialParsingError\"\x1b\n\x19PartialParsingSkipParsing\"z\n\x1cPartialParsingSkipParsingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.PartialParsingSkipParsing\"&\n\x14UnableToPartialParse\x12\x0e\n\x06reason\x18\x01 \x01(\t\"p\n\x17UnableToPartialParseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.UnableToPartialParse\"f\n\x12StateCheckVarsHash\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\x12\x0c\n\x04vars\x18\x02 \x01(\t\x12\x0f\n\x07profile\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\"l\n\x15StateCheckVarsHashMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StateCheckVarsHash\"\x1a\n\x18PartialParsingNotEnabled\"x\n\x1bPartialParsingNotEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.PartialParsingNotEnabled\"C\n\x14ParsedFileLoadFailed\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"p\n\x17ParsedFileLoadFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.ParsedFileLoadFailed\"H\n\x15PartialParsingEnabled\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x05\x12\r\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x05\x12\x0f\n\x07\x63hanged\x18\x03 \x01(\x05\"r\n\x18PartialParsingEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.PartialParsingEnabled\"8\n\x12PartialParsingFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\"l\n\x15PartialParsingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.PartialParsingFile\"\xaf\x01\n\x1fInvalidDisabledTargetInTestNode\x12\x1b\n\x13resource_type_title\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1a\n\x12original_file_path\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\x12\x13\n\x0btarget_name\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\"\x86\x01\n\"InvalidDisabledTargetInTestNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.InvalidDisabledTargetInTestNode\"7\n\x18UnusedResourceConfigPath\x12\x1b\n\x13unused_config_paths\x18\x01 \x03(\t\"x\n\x1bUnusedResourceConfigPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.UnusedResourceConfigPath\"3\n\rSeedIncreased\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"b\n\x10SeedIncreasedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.SeedIncreased\">\n\x18SeedExceedsLimitSamePath\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"x\n\x1bSeedExceedsLimitSamePathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.SeedExceedsLimitSamePath\"D\n\x1eSeedExceedsLimitAndPathChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x84\x01\n!SeedExceedsLimitAndPathChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.SeedExceedsLimitAndPathChanged\"\\\n\x1fSeedExceedsLimitChecksumChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rchecksum_name\x18\x03 \x01(\t\"\x86\x01\n\"SeedExceedsLimitChecksumChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.SeedExceedsLimitChecksumChanged\"%\n\x0cUnusedTables\x12\x15\n\runused_tables\x18\x01 \x03(\t\"`\n\x0fUnusedTablesMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.UnusedTables\"\x87\x01\n\x17WrongResourceSchemaFile\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x1c\n\x14plural_resource_type\x18\x03 \x01(\t\x12\x10\n\x08yaml_key\x18\x04 \x01(\t\x12\x11\n\tfile_path\x18\x05 \x01(\t\"v\n\x1aWrongResourceSchemaFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.WrongResourceSchemaFile\"K\n\x10NoNodeForYamlKey\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x10\n\x08yaml_key\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x03 \x01(\t\"h\n\x13NoNodeForYamlKeyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.NoNodeForYamlKey\"+\n\x15MacroNotFoundForPatch\x12\x12\n\npatch_name\x18\x01 \x01(\t\"r\n\x18MacroNotFoundForPatchMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MacroNotFoundForPatch\"\xb8\x01\n\x16NodeNotFoundOrDisabled\x12\x1a\n\x12original_file_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1b\n\x13resource_type_title\x18\x03 \x01(\t\x12\x13\n\x0btarget_name\x18\x04 \x01(\t\x12\x13\n\x0btarget_kind\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\x12\x10\n\x08\x64isabled\x18\x07 \x01(\t\"t\n\x19NodeNotFoundOrDisabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.NodeNotFoundOrDisabled\"H\n\x0fJinjaLogWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"f\n\x12JinjaLogWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.JinjaLogWarning\"E\n\x0cJinjaLogInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"`\n\x0fJinjaLogInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.JinjaLogInfo\"F\n\rJinjaLogDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"b\n\x10JinjaLogDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.JinjaLogDebug\"\xae\x01\n\x1eUnpinnedRefNewVersionAvailable\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rref_node_name\x18\x02 \x01(\t\x12\x18\n\x10ref_node_package\x18\x03 \x01(\t\x12\x18\n\x10ref_node_version\x18\x04 \x01(\t\x12\x17\n\x0fref_max_version\x18\x05 \x01(\t\"\x84\x01\n!UnpinnedRefNewVersionAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.UnpinnedRefNewVersionAvailable\"V\n\x0f\x44\x65precatedModel\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\x18\n\x10\x64\x65precation_date\x18\x03 \x01(\t\"f\n\x12\x44\x65precatedModelMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DeprecatedModel\"\xc6\x01\n\x1cUpcomingReferenceDeprecation\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"\x80\x01\n\x1fUpcomingReferenceDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.UpcomingReferenceDeprecation\"\xbd\x01\n\x13\x44\x65precatedReference\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"n\n\x16\x44\x65precatedReferenceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DeprecatedReference\"/\n\x1dGitSparseCheckoutSubdirectory\x12\x0e\n\x06subdir\x18\x01 \x01(\t\"\x82\x01\n GitSparseCheckoutSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.GitSparseCheckoutSubdirectory\"/\n\x1bGitProgressCheckoutRevision\x12\x10\n\x08revision\x18\x01 \x01(\t\"~\n\x1eGitProgressCheckoutRevisionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.GitProgressCheckoutRevision\"4\n%GitProgressUpdatingExistingDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x92\x01\n(GitProgressUpdatingExistingDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.GitProgressUpdatingExistingDependency\".\n\x1fGitProgressPullingNewDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x86\x01\n\"GitProgressPullingNewDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressPullingNewDependency\"\x1d\n\x0eGitNothingToDo\x12\x0b\n\x03sha\x18\x01 \x01(\t\"d\n\x11GitNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.GitNothingToDo\"E\n\x1fGitProgressUpdatedCheckoutRange\x12\x11\n\tstart_sha\x18\x01 \x01(\t\x12\x0f\n\x07\x65nd_sha\x18\x02 \x01(\t\"\x86\x01\n\"GitProgressUpdatedCheckoutRangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressUpdatedCheckoutRange\"*\n\x17GitProgressCheckedOutAt\x12\x0f\n\x07\x65nd_sha\x18\x01 \x01(\t\"v\n\x1aGitProgressCheckedOutAtMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.GitProgressCheckedOutAt\")\n\x1aRegistryProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"|\n\x1dRegistryProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.RegistryProgressGETRequest\"=\n\x1bRegistryProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"~\n\x1eRegistryProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RegistryProgressGETResponse\"_\n\x1dSelectorReportInvalidSelector\x12\x17\n\x0fvalid_selectors\x18\x01 \x01(\t\x12\x13\n\x0bspec_method\x18\x02 \x01(\t\x12\x10\n\x08raw_spec\x18\x03 \x01(\t\"\x82\x01\n SelectorReportInvalidSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.SelectorReportInvalidSelector\"\x15\n\x13\x44\x65psNoPackagesFound\"n\n\x16\x44\x65psNoPackagesFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsNoPackagesFound\"/\n\x17\x44\x65psStartPackageInstall\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\"v\n\x1a\x44\x65psStartPackageInstallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsStartPackageInstall\"\'\n\x0f\x44\x65psInstallInfo\x12\x14\n\x0cversion_name\x18\x01 \x01(\t\"f\n\x12\x44\x65psInstallInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DepsInstallInfo\"-\n\x13\x44\x65psUpdateAvailable\x12\x16\n\x0eversion_latest\x18\x01 \x01(\t\"n\n\x16\x44\x65psUpdateAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsUpdateAvailable\"\x0e\n\x0c\x44\x65psUpToDate\"`\n\x0f\x44\x65psUpToDateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUpToDate\",\n\x14\x44\x65psListSubdirectory\x12\x14\n\x0csubdirectory\x18\x01 \x01(\t\"p\n\x17\x44\x65psListSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.DepsListSubdirectory\".\n\x1a\x44\x65psNotifyUpdatesAvailable\x12\x10\n\x08packages\x18\x01 \x03(\t\"|\n\x1d\x44\x65psNotifyUpdatesAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.DepsNotifyUpdatesAvailable\"1\n\x11RetryExternalCall\x12\x0f\n\x07\x61ttempt\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"j\n\x14RetryExternalCallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.RetryExternalCall\"#\n\x14RecordRetryException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17RecordRetryExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.RecordRetryException\".\n\x1fRegistryIndexProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"\x86\x01\n\"RegistryIndexProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryIndexProgressGETRequest\"B\n RegistryIndexProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"\x88\x01\n#RegistryIndexProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12;\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32-.proto_types.RegistryIndexProgressGETResponse\"2\n\x1eRegistryResponseUnexpectedType\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseUnexpectedTypeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseUnexpectedType\"2\n\x1eRegistryResponseMissingTopKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseMissingTopKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseMissingTopKeys\"5\n!RegistryResponseMissingNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x8a\x01\n$RegistryResponseMissingNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.RegistryResponseMissingNestedKeys\"3\n\x1fRegistryResponseExtraNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x86\x01\n\"RegistryResponseExtraNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryResponseExtraNestedKeys\"(\n\x18\x44\x65psSetDownloadDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\"x\n\x1b\x44\x65psSetDownloadDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsSetDownloadDirectory\"-\n\x0c\x44\x65psUnpinned\x12\x10\n\x08revision\x18\x01 \x01(\t\x12\x0b\n\x03git\x18\x02 \x01(\t\"`\n\x0f\x44\x65psUnpinnedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUnpinned\"/\n\x1bNoNodesForSelectionCriteria\x12\x10\n\x08spec_raw\x18\x01 \x01(\t\"~\n\x1eNoNodesForSelectionCriteriaMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.NoNodesForSelectionCriteria\"*\n\x1bRunningOperationCaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"~\n\x1eRunningOperationCaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RunningOperationCaughtError\"\x11\n\x0f\x43ompileComplete\"f\n\x12\x43ompileCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.CompileComplete\"\x18\n\x16\x46reshnessCheckComplete\"t\n\x19\x46reshnessCheckCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.FreshnessCheckComplete\"\x1c\n\nSeedHeader\x12\x0e\n\x06header\x18\x01 \x01(\t\"\\\n\rSeedHeaderMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SeedHeader\"3\n\x12SQLRunnerException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x02 \x01(\t\"l\n\x15SQLRunnerExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SQLRunnerException\"\xa8\x01\n\rLogTestResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x12\n\nnum_models\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"b\n\x10LogTestResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogTestResult\"k\n\x0cLogStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"`\n\x0fLogStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.LogStartLine\"\x95\x01\n\x0eLogModelResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogModelResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogModelResult\"\xfa\x01\n\x11LogSnapshotResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x34\n\x03\x63\x66g\x18\x07 \x03(\x0b\x32\'.proto_types.LogSnapshotResult.CfgEntry\x1a*\n\x08\x43\x66gEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"j\n\x14LogSnapshotResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.LogSnapshotResult\"\xb9\x01\n\rLogSeedResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x16\n\x0eresult_message\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x10\n\x08relation\x18\x08 \x01(\t\"b\n\x10LogSeedResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogSeedResult\"\xad\x01\n\x12LogFreshnessResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12(\n\tnode_info\x18\x02 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x13\n\x0bsource_name\x18\x06 \x01(\t\x12\x12\n\ntable_name\x18\x07 \x01(\t\"l\n\x15LogFreshnessResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogFreshnessResult\"\"\n\rLogCancelLine\x12\x11\n\tconn_name\x18\x01 \x01(\t\"b\n\x10LogCancelLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogCancelLine\"\x1f\n\x0f\x44\x65\x66\x61ultSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"f\n\x12\x44\x65\x66\x61ultSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DefaultSelector\"5\n\tNodeStart\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"Z\n\x0cNodeStartMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.NodeStart\"g\n\x0cNodeFinished\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12-\n\nrun_result\x18\x02 \x01(\x0b\x32\x19.proto_types.RunResultMsg\"`\n\x0fNodeFinishedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.NodeFinished\"+\n\x1bQueryCancelationUnsupported\x12\x0c\n\x04type\x18\x01 \x01(\t\"~\n\x1eQueryCancelationUnsupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.QueryCancelationUnsupported\"O\n\x0f\x43oncurrencyLine\x12\x13\n\x0bnum_threads\x18\x01 \x01(\x05\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\x12\x12\n\nnode_count\x18\x03 \x01(\x05\"f\n\x12\x43oncurrencyLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ConcurrencyLine\"E\n\x19WritingInjectedSQLForNode\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"z\n\x1cWritingInjectedSQLForNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.WritingInjectedSQLForNode\"9\n\rNodeCompiling\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeCompilingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeCompiling\"9\n\rNodeExecuting\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeExecutingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeExecuting\"m\n\x10LogHookStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"h\n\x13LogHookStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.LogHookStartLine\"\x93\x01\n\x0eLogHookEndLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogHookEndLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogHookEndLine\"\x93\x01\n\x0fSkippingDetails\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\x12\x11\n\tnode_name\x18\x04 \x01(\t\x12\r\n\x05index\x18\x05 \x01(\x05\x12\r\n\x05total\x18\x06 \x01(\x05\"f\n\x12SkippingDetailsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SkippingDetails\"\r\n\x0bNothingToDo\"^\n\x0eNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.NothingToDo\",\n\x1dRunningOperationUncaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"\x82\x01\n RunningOperationUncaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.RunningOperationUncaughtError\"\x93\x01\n\x0c\x45ndRunResult\x12*\n\x07results\x18\x01 \x03(\x0b\x32\x19.proto_types.RunResultMsg\x12\x14\n\x0c\x65lapsed_time\x18\x02 \x01(\x02\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07success\x18\x04 \x01(\x08\"`\n\x0f\x45ndRunResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.EndRunResult\"\x11\n\x0fNoNodesSelected\"f\n\x12NoNodesSelectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.NoNodesSelected\"w\n\x10\x43ommandCompleted\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x65lapsed\x18\x04 \x01(\x02\"h\n\x13\x43ommandCompletedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.CommandCompleted\"k\n\x08ShowNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0f\n\x07preview\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"X\n\x0bShowNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.ShowNode\"p\n\x0c\x43ompiledNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x10\n\x08\x63ompiled\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"`\n\x0f\x43ompiledNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.CompiledNode\"b\n\x17\x43\x61tchableExceptionOnRun\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"v\n\x1a\x43\x61tchableExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.CatchableExceptionOnRun\"5\n\x12InternalErrorOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\"l\n\x15InternalErrorOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InternalErrorOnRun\"K\n\x15GenericExceptionOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"r\n\x18GenericExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.GenericExceptionOnRun\"N\n\x1aNodeConnectionReleaseError\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"|\n\x1dNodeConnectionReleaseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.NodeConnectionReleaseError\"\x1f\n\nFoundStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\"\\\n\rFoundStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.FoundStats\"\x17\n\x15MainKeyboardInterrupt\"r\n\x18MainKeyboardInterruptMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainKeyboardInterrupt\"#\n\x14MainEncounteredError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17MainEncounteredErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MainEncounteredError\"%\n\x0eMainStackTrace\x12\x13\n\x0bstack_trace\x18\x01 \x01(\t\"d\n\x11MainStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainStackTrace\"@\n\x13SystemCouldNotWrite\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"n\n\x16SystemCouldNotWriteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.SystemCouldNotWrite\"!\n\x12SystemExecutingCmd\x12\x0b\n\x03\x63md\x18\x01 \x03(\t\"l\n\x15SystemExecutingCmdMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SystemExecutingCmd\"\x1c\n\x0cSystemStdOut\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdOut\"\x1c\n\x0cSystemStdErr\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdErrMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdErr\",\n\x16SystemReportReturnCode\x12\x12\n\nreturncode\x18\x01 \x01(\x05\"t\n\x19SystemReportReturnCodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.SystemReportReturnCode\"p\n\x13TimingInfoCollected\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12/\n\x0btiming_info\x18\x02 \x01(\x0b\x32\x1a.proto_types.TimingInfoMsg\"n\n\x16TimingInfoCollectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.TimingInfoCollected\"&\n\x12LogDebugStackTrace\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"l\n\x15LogDebugStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDebugStackTrace\"\x1e\n\x0e\x43heckCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43heckCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CheckCleanPath\" \n\x10\x43onfirmCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"h\n\x13\x43onfirmCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConfirmCleanPath\"\"\n\x12ProtectedCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"l\n\x15ProtectedCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ProtectedCleanPath\"\x14\n\x12\x46inishedCleanPaths\"l\n\x15\x46inishedCleanPathsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FinishedCleanPaths\"5\n\x0bOpenCommand\x12\x10\n\x08open_cmd\x18\x01 \x01(\t\x12\x14\n\x0cprofiles_dir\x18\x02 \x01(\t\"^\n\x0eOpenCommandMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.OpenCommand\"\x19\n\nFormatting\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rFormattingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.Formatting\"0\n\x0fServingDocsPort\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"f\n\x12ServingDocsPortMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ServingDocsPort\"%\n\x15ServingDocsAccessInfo\x12\x0c\n\x04port\x18\x01 \x01(\t\"r\n\x18ServingDocsAccessInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ServingDocsAccessInfo\"\x15\n\x13ServingDocsExitInfo\"n\n\x16ServingDocsExitInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.ServingDocsExitInfo\"J\n\x10RunResultWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultWarning\"J\n\x10RunResultFailure\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultFailure\"k\n\tStatsLine\x12\x30\n\x05stats\x18\x01 \x03(\x0b\x32!.proto_types.StatsLine.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"Z\n\x0cStatsLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.StatsLine\"\x1d\n\x0eRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11RunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RunResultError\")\n\x17RunResultErrorNoMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"v\n\x1aRunResultErrorNoMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultErrorNoMessage\"\x1f\n\x0fSQLCompiledPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"f\n\x12SQLCompiledPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SQLCompiledPath\"-\n\x14\x43heckNodeTestFailure\x12\x15\n\rrelation_name\x18\x01 \x01(\t\"p\n\x17\x43heckNodeTestFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.CheckNodeTestFailure\"\"\n\x13\x46irstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"n\n\x16\x46irstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.FirstRunResultError\"\'\n\x18\x41\x66terFirstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"x\n\x1b\x41\x66terFirstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.AfterFirstRunResultError\"W\n\x0f\x45ndOfRunSummary\x12\x12\n\nnum_errors\x18\x01 \x01(\x05\x12\x14\n\x0cnum_warnings\x18\x02 \x01(\x05\x12\x1a\n\x12keyboard_interrupt\x18\x03 \x01(\x08\"f\n\x12\x45ndOfRunSummaryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.EndOfRunSummary\"U\n\x13LogSkipBecauseError\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12\x10\n\x08relation\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"n\n\x16LogSkipBecauseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.LogSkipBecauseError\"\x14\n\x12\x45nsureGitInstalled\"l\n\x15\x45nsureGitInstalledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.EnsureGitInstalled\"\x1a\n\x18\x44\x65psCreatingLocalSymlink\"x\n\x1b\x44\x65psCreatingLocalSymlinkMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsCreatingLocalSymlink\"\x19\n\x17\x44\x65psSymlinkNotAvailable\"v\n\x1a\x44\x65psSymlinkNotAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsSymlinkNotAvailable\"\x11\n\x0f\x44isableTracking\"f\n\x12\x44isableTrackingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DisableTracking\"\x1e\n\x0cSendingEvent\x12\x0e\n\x06kwargs\x18\x01 \x01(\t\"`\n\x0fSendingEventMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SendingEvent\"\x12\n\x10SendEventFailure\"h\n\x13SendEventFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SendEventFailure\"\r\n\x0b\x46lushEvents\"^\n\x0e\x46lushEventsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.FlushEvents\"\x14\n\x12\x46lushEventsFailure\"l\n\x15\x46lushEventsFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FlushEventsFailure\"-\n\x19TrackingInitializeFailure\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"z\n\x1cTrackingInitializeFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.TrackingInitializeFailure\"&\n\x17RunResultWarningMessage\x12\x0b\n\x03msg\x18\x01 \x01(\t\"v\n\x1aRunResultWarningMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultWarningMessage\"\x1a\n\x0b\x44\x65\x62ugCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"^\n\x0e\x44\x65\x62ugCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.DebugCmdOut\"\x1d\n\x0e\x44\x65\x62ugCmdResult\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11\x44\x65\x62ugCmdResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.DebugCmdResult\"\x19\n\nListCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rListCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.ListCmdOut\"\x13\n\x04Note\x12\x0b\n\x03msg\x18\x01 \x01(\t\"P\n\x07NoteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x1f\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x11.proto_types.Noteb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'types_pb2', globals()) @@ -444,436 +444,448 @@ _UNPINNEDREFNEWVERSIONAVAILABLE._serialized_end=19090 _UNPINNEDREFNEWVERSIONAVAILABLEMSG._serialized_start=19093 _UNPINNEDREFNEWVERSIONAVAILABLEMSG._serialized_end=19225 - _GITSPARSECHECKOUTSUBDIRECTORY._serialized_start=19227 - _GITSPARSECHECKOUTSUBDIRECTORY._serialized_end=19274 - _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_start=19277 - _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_end=19407 - _GITPROGRESSCHECKOUTREVISION._serialized_start=19409 - _GITPROGRESSCHECKOUTREVISION._serialized_end=19456 - _GITPROGRESSCHECKOUTREVISIONMSG._serialized_start=19458 - _GITPROGRESSCHECKOUTREVISIONMSG._serialized_end=19584 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_start=19586 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_end=19638 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_start=19641 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_end=19787 - _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_start=19789 - _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_end=19835 - _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_start=19838 - _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_end=19972 - _GITNOTHINGTODO._serialized_start=19974 - _GITNOTHINGTODO._serialized_end=20003 - _GITNOTHINGTODOMSG._serialized_start=20005 - _GITNOTHINGTODOMSG._serialized_end=20105 - _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_start=20107 - _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_end=20176 - _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_start=20179 - _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_end=20313 - _GITPROGRESSCHECKEDOUTAT._serialized_start=20315 - _GITPROGRESSCHECKEDOUTAT._serialized_end=20357 - _GITPROGRESSCHECKEDOUTATMSG._serialized_start=20359 - _GITPROGRESSCHECKEDOUTATMSG._serialized_end=20477 - _REGISTRYPROGRESSGETREQUEST._serialized_start=20479 - _REGISTRYPROGRESSGETREQUEST._serialized_end=20520 - _REGISTRYPROGRESSGETREQUESTMSG._serialized_start=20522 - _REGISTRYPROGRESSGETREQUESTMSG._serialized_end=20646 - _REGISTRYPROGRESSGETRESPONSE._serialized_start=20648 - _REGISTRYPROGRESSGETRESPONSE._serialized_end=20709 - _REGISTRYPROGRESSGETRESPONSEMSG._serialized_start=20711 - _REGISTRYPROGRESSGETRESPONSEMSG._serialized_end=20837 - _SELECTORREPORTINVALIDSELECTOR._serialized_start=20839 - _SELECTORREPORTINVALIDSELECTOR._serialized_end=20934 - _SELECTORREPORTINVALIDSELECTORMSG._serialized_start=20937 - _SELECTORREPORTINVALIDSELECTORMSG._serialized_end=21067 - _DEPSNOPACKAGESFOUND._serialized_start=21069 - _DEPSNOPACKAGESFOUND._serialized_end=21090 - _DEPSNOPACKAGESFOUNDMSG._serialized_start=21092 - _DEPSNOPACKAGESFOUNDMSG._serialized_end=21202 - _DEPSSTARTPACKAGEINSTALL._serialized_start=21204 - _DEPSSTARTPACKAGEINSTALL._serialized_end=21251 - _DEPSSTARTPACKAGEINSTALLMSG._serialized_start=21253 - _DEPSSTARTPACKAGEINSTALLMSG._serialized_end=21371 - _DEPSINSTALLINFO._serialized_start=21373 - _DEPSINSTALLINFO._serialized_end=21412 - _DEPSINSTALLINFOMSG._serialized_start=21414 - _DEPSINSTALLINFOMSG._serialized_end=21516 - _DEPSUPDATEAVAILABLE._serialized_start=21518 - _DEPSUPDATEAVAILABLE._serialized_end=21563 - _DEPSUPDATEAVAILABLEMSG._serialized_start=21565 - _DEPSUPDATEAVAILABLEMSG._serialized_end=21675 - _DEPSUPTODATE._serialized_start=21677 - _DEPSUPTODATE._serialized_end=21691 - _DEPSUPTODATEMSG._serialized_start=21693 - _DEPSUPTODATEMSG._serialized_end=21789 - _DEPSLISTSUBDIRECTORY._serialized_start=21791 - _DEPSLISTSUBDIRECTORY._serialized_end=21835 - _DEPSLISTSUBDIRECTORYMSG._serialized_start=21837 - _DEPSLISTSUBDIRECTORYMSG._serialized_end=21949 - _DEPSNOTIFYUPDATESAVAILABLE._serialized_start=21951 - _DEPSNOTIFYUPDATESAVAILABLE._serialized_end=21997 - _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_start=21999 - _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_end=22123 - _RETRYEXTERNALCALL._serialized_start=22125 - _RETRYEXTERNALCALL._serialized_end=22174 - _RETRYEXTERNALCALLMSG._serialized_start=22176 - _RETRYEXTERNALCALLMSG._serialized_end=22282 - _RECORDRETRYEXCEPTION._serialized_start=22284 - _RECORDRETRYEXCEPTION._serialized_end=22319 - _RECORDRETRYEXCEPTIONMSG._serialized_start=22321 - _RECORDRETRYEXCEPTIONMSG._serialized_end=22433 - _REGISTRYINDEXPROGRESSGETREQUEST._serialized_start=22435 - _REGISTRYINDEXPROGRESSGETREQUEST._serialized_end=22481 - _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_start=22484 - _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_end=22618 - _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_start=22620 - _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_end=22686 - _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_start=22689 - _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_end=22825 - _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_start=22827 - _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_end=22877 - _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_start=22880 - _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_end=23012 - _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_start=23014 - _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_end=23064 - _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_start=23067 - _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_end=23199 - _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_start=23201 - _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_end=23254 - _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_start=23257 - _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_end=23395 - _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_start=23397 - _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_end=23448 - _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_start=23451 - _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_end=23585 - _DEPSSETDOWNLOADDIRECTORY._serialized_start=23587 - _DEPSSETDOWNLOADDIRECTORY._serialized_end=23627 - _DEPSSETDOWNLOADDIRECTORYMSG._serialized_start=23629 - _DEPSSETDOWNLOADDIRECTORYMSG._serialized_end=23749 - _DEPSUNPINNED._serialized_start=23751 - _DEPSUNPINNED._serialized_end=23796 - _DEPSUNPINNEDMSG._serialized_start=23798 - _DEPSUNPINNEDMSG._serialized_end=23894 - _NONODESFORSELECTIONCRITERIA._serialized_start=23896 - _NONODESFORSELECTIONCRITERIA._serialized_end=23943 - _NONODESFORSELECTIONCRITERIAMSG._serialized_start=23945 - _NONODESFORSELECTIONCRITERIAMSG._serialized_end=24071 - _RUNNINGOPERATIONCAUGHTERROR._serialized_start=24073 - _RUNNINGOPERATIONCAUGHTERROR._serialized_end=24115 - _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_start=24117 - _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_end=24243 - _COMPILECOMPLETE._serialized_start=24245 - _COMPILECOMPLETE._serialized_end=24262 - _COMPILECOMPLETEMSG._serialized_start=24264 - _COMPILECOMPLETEMSG._serialized_end=24366 - _FRESHNESSCHECKCOMPLETE._serialized_start=24368 - _FRESHNESSCHECKCOMPLETE._serialized_end=24392 - _FRESHNESSCHECKCOMPLETEMSG._serialized_start=24394 - _FRESHNESSCHECKCOMPLETEMSG._serialized_end=24510 - _SEEDHEADER._serialized_start=24512 - _SEEDHEADER._serialized_end=24540 - _SEEDHEADERMSG._serialized_start=24542 - _SEEDHEADERMSG._serialized_end=24634 - _SQLRUNNEREXCEPTION._serialized_start=24636 - _SQLRUNNEREXCEPTION._serialized_end=24687 - _SQLRUNNEREXCEPTIONMSG._serialized_start=24689 - _SQLRUNNEREXCEPTIONMSG._serialized_end=24797 - _LOGTESTRESULT._serialized_start=24800 - _LOGTESTRESULT._serialized_end=24968 - _LOGTESTRESULTMSG._serialized_start=24970 - _LOGTESTRESULTMSG._serialized_end=25068 - _LOGSTARTLINE._serialized_start=25070 - _LOGSTARTLINE._serialized_end=25177 - _LOGSTARTLINEMSG._serialized_start=25179 - _LOGSTARTLINEMSG._serialized_end=25275 - _LOGMODELRESULT._serialized_start=25278 - _LOGMODELRESULT._serialized_end=25427 - _LOGMODELRESULTMSG._serialized_start=25429 - _LOGMODELRESULTMSG._serialized_end=25529 - _LOGSNAPSHOTRESULT._serialized_start=25532 - _LOGSNAPSHOTRESULT._serialized_end=25782 - _LOGSNAPSHOTRESULT_CFGENTRY._serialized_start=25740 - _LOGSNAPSHOTRESULT_CFGENTRY._serialized_end=25782 - _LOGSNAPSHOTRESULTMSG._serialized_start=25784 - _LOGSNAPSHOTRESULTMSG._serialized_end=25890 - _LOGSEEDRESULT._serialized_start=25893 - _LOGSEEDRESULT._serialized_end=26078 - _LOGSEEDRESULTMSG._serialized_start=26080 - _LOGSEEDRESULTMSG._serialized_end=26178 - _LOGFRESHNESSRESULT._serialized_start=26181 - _LOGFRESHNESSRESULT._serialized_end=26354 - _LOGFRESHNESSRESULTMSG._serialized_start=26356 - _LOGFRESHNESSRESULTMSG._serialized_end=26464 - _LOGCANCELLINE._serialized_start=26466 - _LOGCANCELLINE._serialized_end=26500 - _LOGCANCELLINEMSG._serialized_start=26502 - _LOGCANCELLINEMSG._serialized_end=26600 - _DEFAULTSELECTOR._serialized_start=26602 - _DEFAULTSELECTOR._serialized_end=26633 - _DEFAULTSELECTORMSG._serialized_start=26635 - _DEFAULTSELECTORMSG._serialized_end=26737 - _NODESTART._serialized_start=26739 - _NODESTART._serialized_end=26792 - _NODESTARTMSG._serialized_start=26794 - _NODESTARTMSG._serialized_end=26884 - _NODEFINISHED._serialized_start=26886 - _NODEFINISHED._serialized_end=26989 - _NODEFINISHEDMSG._serialized_start=26991 - _NODEFINISHEDMSG._serialized_end=27087 - _QUERYCANCELATIONUNSUPPORTED._serialized_start=27089 - _QUERYCANCELATIONUNSUPPORTED._serialized_end=27132 - _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_start=27134 - _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_end=27260 - _CONCURRENCYLINE._serialized_start=27262 - _CONCURRENCYLINE._serialized_end=27341 - _CONCURRENCYLINEMSG._serialized_start=27343 - _CONCURRENCYLINEMSG._serialized_end=27445 - _WRITINGINJECTEDSQLFORNODE._serialized_start=27447 - _WRITINGINJECTEDSQLFORNODE._serialized_end=27516 - _WRITINGINJECTEDSQLFORNODEMSG._serialized_start=27518 - _WRITINGINJECTEDSQLFORNODEMSG._serialized_end=27640 - _NODECOMPILING._serialized_start=27642 - _NODECOMPILING._serialized_end=27699 - _NODECOMPILINGMSG._serialized_start=27701 - _NODECOMPILINGMSG._serialized_end=27799 - _NODEEXECUTING._serialized_start=27801 - _NODEEXECUTING._serialized_end=27858 - _NODEEXECUTINGMSG._serialized_start=27860 - _NODEEXECUTINGMSG._serialized_end=27958 - _LOGHOOKSTARTLINE._serialized_start=27960 - _LOGHOOKSTARTLINE._serialized_end=28069 - _LOGHOOKSTARTLINEMSG._serialized_start=28071 - _LOGHOOKSTARTLINEMSG._serialized_end=28175 - _LOGHOOKENDLINE._serialized_start=28178 - _LOGHOOKENDLINE._serialized_end=28325 - _LOGHOOKENDLINEMSG._serialized_start=28327 - _LOGHOOKENDLINEMSG._serialized_end=28427 - _SKIPPINGDETAILS._serialized_start=28430 - _SKIPPINGDETAILS._serialized_end=28577 - _SKIPPINGDETAILSMSG._serialized_start=28579 - _SKIPPINGDETAILSMSG._serialized_end=28681 - _NOTHINGTODO._serialized_start=28683 - _NOTHINGTODO._serialized_end=28696 - _NOTHINGTODOMSG._serialized_start=28698 - _NOTHINGTODOMSG._serialized_end=28792 - _RUNNINGOPERATIONUNCAUGHTERROR._serialized_start=28794 - _RUNNINGOPERATIONUNCAUGHTERROR._serialized_end=28838 - _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_start=28841 - _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_end=28971 - _ENDRUNRESULT._serialized_start=28974 - _ENDRUNRESULT._serialized_end=29121 - _ENDRUNRESULTMSG._serialized_start=29123 - _ENDRUNRESULTMSG._serialized_end=29219 - _NONODESSELECTED._serialized_start=29221 - _NONODESSELECTED._serialized_end=29238 - _NONODESSELECTEDMSG._serialized_start=29240 - _NONODESSELECTEDMSG._serialized_end=29342 - _COMMANDCOMPLETED._serialized_start=29344 - _COMMANDCOMPLETED._serialized_end=29463 - _COMMANDCOMPLETEDMSG._serialized_start=29465 - _COMMANDCOMPLETEDMSG._serialized_end=29569 - _SHOWNODE._serialized_start=29571 - _SHOWNODE._serialized_end=29678 - _SHOWNODEMSG._serialized_start=29680 - _SHOWNODEMSG._serialized_end=29768 - _COMPILEDNODE._serialized_start=29770 - _COMPILEDNODE._serialized_end=29882 - _COMPILEDNODEMSG._serialized_start=29884 - _COMPILEDNODEMSG._serialized_end=29980 - _CATCHABLEEXCEPTIONONRUN._serialized_start=29982 - _CATCHABLEEXCEPTIONONRUN._serialized_end=30080 - _CATCHABLEEXCEPTIONONRUNMSG._serialized_start=30082 - _CATCHABLEEXCEPTIONONRUNMSG._serialized_end=30200 - _INTERNALERRORONRUN._serialized_start=30202 - _INTERNALERRORONRUN._serialized_end=30255 - _INTERNALERRORONRUNMSG._serialized_start=30257 - _INTERNALERRORONRUNMSG._serialized_end=30365 - _GENERICEXCEPTIONONRUN._serialized_start=30367 - _GENERICEXCEPTIONONRUN._serialized_end=30442 - _GENERICEXCEPTIONONRUNMSG._serialized_start=30444 - _GENERICEXCEPTIONONRUNMSG._serialized_end=30558 - _NODECONNECTIONRELEASEERROR._serialized_start=30560 - _NODECONNECTIONRELEASEERROR._serialized_end=30638 - _NODECONNECTIONRELEASEERRORMSG._serialized_start=30640 - _NODECONNECTIONRELEASEERRORMSG._serialized_end=30764 - _FOUNDSTATS._serialized_start=30766 - _FOUNDSTATS._serialized_end=30797 - _FOUNDSTATSMSG._serialized_start=30799 - _FOUNDSTATSMSG._serialized_end=30891 - _MAINKEYBOARDINTERRUPT._serialized_start=30893 - _MAINKEYBOARDINTERRUPT._serialized_end=30916 - _MAINKEYBOARDINTERRUPTMSG._serialized_start=30918 - _MAINKEYBOARDINTERRUPTMSG._serialized_end=31032 - _MAINENCOUNTEREDERROR._serialized_start=31034 - _MAINENCOUNTEREDERROR._serialized_end=31069 - _MAINENCOUNTEREDERRORMSG._serialized_start=31071 - _MAINENCOUNTEREDERRORMSG._serialized_end=31183 - _MAINSTACKTRACE._serialized_start=31185 - _MAINSTACKTRACE._serialized_end=31222 - _MAINSTACKTRACEMSG._serialized_start=31224 - _MAINSTACKTRACEMSG._serialized_end=31324 - _SYSTEMCOULDNOTWRITE._serialized_start=31326 - _SYSTEMCOULDNOTWRITE._serialized_end=31390 - _SYSTEMCOULDNOTWRITEMSG._serialized_start=31392 - _SYSTEMCOULDNOTWRITEMSG._serialized_end=31502 - _SYSTEMEXECUTINGCMD._serialized_start=31504 - _SYSTEMEXECUTINGCMD._serialized_end=31537 - _SYSTEMEXECUTINGCMDMSG._serialized_start=31539 - _SYSTEMEXECUTINGCMDMSG._serialized_end=31647 - _SYSTEMSTDOUT._serialized_start=31649 - _SYSTEMSTDOUT._serialized_end=31677 - _SYSTEMSTDOUTMSG._serialized_start=31679 - _SYSTEMSTDOUTMSG._serialized_end=31775 - _SYSTEMSTDERR._serialized_start=31777 - _SYSTEMSTDERR._serialized_end=31805 - _SYSTEMSTDERRMSG._serialized_start=31807 - _SYSTEMSTDERRMSG._serialized_end=31903 - _SYSTEMREPORTRETURNCODE._serialized_start=31905 - _SYSTEMREPORTRETURNCODE._serialized_end=31949 - _SYSTEMREPORTRETURNCODEMSG._serialized_start=31951 - _SYSTEMREPORTRETURNCODEMSG._serialized_end=32067 - _TIMINGINFOCOLLECTED._serialized_start=32069 - _TIMINGINFOCOLLECTED._serialized_end=32181 - _TIMINGINFOCOLLECTEDMSG._serialized_start=32183 - _TIMINGINFOCOLLECTEDMSG._serialized_end=32293 - _LOGDEBUGSTACKTRACE._serialized_start=32295 - _LOGDEBUGSTACKTRACE._serialized_end=32333 - _LOGDEBUGSTACKTRACEMSG._serialized_start=32335 - _LOGDEBUGSTACKTRACEMSG._serialized_end=32443 - _CHECKCLEANPATH._serialized_start=32445 - _CHECKCLEANPATH._serialized_end=32475 - _CHECKCLEANPATHMSG._serialized_start=32477 - _CHECKCLEANPATHMSG._serialized_end=32577 - _CONFIRMCLEANPATH._serialized_start=32579 - _CONFIRMCLEANPATH._serialized_end=32611 - _CONFIRMCLEANPATHMSG._serialized_start=32613 - _CONFIRMCLEANPATHMSG._serialized_end=32717 - _PROTECTEDCLEANPATH._serialized_start=32719 - _PROTECTEDCLEANPATH._serialized_end=32753 - _PROTECTEDCLEANPATHMSG._serialized_start=32755 - _PROTECTEDCLEANPATHMSG._serialized_end=32863 - _FINISHEDCLEANPATHS._serialized_start=32865 - _FINISHEDCLEANPATHS._serialized_end=32885 - _FINISHEDCLEANPATHSMSG._serialized_start=32887 - _FINISHEDCLEANPATHSMSG._serialized_end=32995 - _OPENCOMMAND._serialized_start=32997 - _OPENCOMMAND._serialized_end=33050 - _OPENCOMMANDMSG._serialized_start=33052 - _OPENCOMMANDMSG._serialized_end=33146 - _FORMATTING._serialized_start=33148 - _FORMATTING._serialized_end=33173 - _FORMATTINGMSG._serialized_start=33175 - _FORMATTINGMSG._serialized_end=33267 - _SERVINGDOCSPORT._serialized_start=33269 - _SERVINGDOCSPORT._serialized_end=33317 - _SERVINGDOCSPORTMSG._serialized_start=33319 - _SERVINGDOCSPORTMSG._serialized_end=33421 - _SERVINGDOCSACCESSINFO._serialized_start=33423 - _SERVINGDOCSACCESSINFO._serialized_end=33460 - _SERVINGDOCSACCESSINFOMSG._serialized_start=33462 - _SERVINGDOCSACCESSINFOMSG._serialized_end=33576 - _SERVINGDOCSEXITINFO._serialized_start=33578 - _SERVINGDOCSEXITINFO._serialized_end=33599 - _SERVINGDOCSEXITINFOMSG._serialized_start=33601 - _SERVINGDOCSEXITINFOMSG._serialized_end=33711 - _RUNRESULTWARNING._serialized_start=33713 - _RUNRESULTWARNING._serialized_end=33787 - _RUNRESULTWARNINGMSG._serialized_start=33789 - _RUNRESULTWARNINGMSG._serialized_end=33893 - _RUNRESULTFAILURE._serialized_start=33895 - _RUNRESULTFAILURE._serialized_end=33969 - _RUNRESULTFAILUREMSG._serialized_start=33971 - _RUNRESULTFAILUREMSG._serialized_end=34075 - _STATSLINE._serialized_start=34077 - _STATSLINE._serialized_end=34184 - _STATSLINE_STATSENTRY._serialized_start=34140 - _STATSLINE_STATSENTRY._serialized_end=34184 - _STATSLINEMSG._serialized_start=34186 - _STATSLINEMSG._serialized_end=34276 - _RUNRESULTERROR._serialized_start=34278 - _RUNRESULTERROR._serialized_end=34307 - _RUNRESULTERRORMSG._serialized_start=34309 - _RUNRESULTERRORMSG._serialized_end=34409 - _RUNRESULTERRORNOMESSAGE._serialized_start=34411 - _RUNRESULTERRORNOMESSAGE._serialized_end=34452 - _RUNRESULTERRORNOMESSAGEMSG._serialized_start=34454 - _RUNRESULTERRORNOMESSAGEMSG._serialized_end=34572 - _SQLCOMPILEDPATH._serialized_start=34574 - _SQLCOMPILEDPATH._serialized_end=34605 - _SQLCOMPILEDPATHMSG._serialized_start=34607 - _SQLCOMPILEDPATHMSG._serialized_end=34709 - _CHECKNODETESTFAILURE._serialized_start=34711 - _CHECKNODETESTFAILURE._serialized_end=34756 - _CHECKNODETESTFAILUREMSG._serialized_start=34758 - _CHECKNODETESTFAILUREMSG._serialized_end=34870 - _FIRSTRUNRESULTERROR._serialized_start=34872 - _FIRSTRUNRESULTERROR._serialized_end=34906 - _FIRSTRUNRESULTERRORMSG._serialized_start=34908 - _FIRSTRUNRESULTERRORMSG._serialized_end=35018 - _AFTERFIRSTRUNRESULTERROR._serialized_start=35020 - _AFTERFIRSTRUNRESULTERROR._serialized_end=35059 - _AFTERFIRSTRUNRESULTERRORMSG._serialized_start=35061 - _AFTERFIRSTRUNRESULTERRORMSG._serialized_end=35181 - _ENDOFRUNSUMMARY._serialized_start=35183 - _ENDOFRUNSUMMARY._serialized_end=35270 - _ENDOFRUNSUMMARYMSG._serialized_start=35272 - _ENDOFRUNSUMMARYMSG._serialized_end=35374 - _LOGSKIPBECAUSEERROR._serialized_start=35376 - _LOGSKIPBECAUSEERROR._serialized_end=35461 - _LOGSKIPBECAUSEERRORMSG._serialized_start=35463 - _LOGSKIPBECAUSEERRORMSG._serialized_end=35573 - _ENSUREGITINSTALLED._serialized_start=35575 - _ENSUREGITINSTALLED._serialized_end=35595 - _ENSUREGITINSTALLEDMSG._serialized_start=35597 - _ENSUREGITINSTALLEDMSG._serialized_end=35705 - _DEPSCREATINGLOCALSYMLINK._serialized_start=35707 - _DEPSCREATINGLOCALSYMLINK._serialized_end=35733 - _DEPSCREATINGLOCALSYMLINKMSG._serialized_start=35735 - _DEPSCREATINGLOCALSYMLINKMSG._serialized_end=35855 - _DEPSSYMLINKNOTAVAILABLE._serialized_start=35857 - _DEPSSYMLINKNOTAVAILABLE._serialized_end=35882 - _DEPSSYMLINKNOTAVAILABLEMSG._serialized_start=35884 - _DEPSSYMLINKNOTAVAILABLEMSG._serialized_end=36002 - _DISABLETRACKING._serialized_start=36004 - _DISABLETRACKING._serialized_end=36021 - _DISABLETRACKINGMSG._serialized_start=36023 - _DISABLETRACKINGMSG._serialized_end=36125 - _SENDINGEVENT._serialized_start=36127 - _SENDINGEVENT._serialized_end=36157 - _SENDINGEVENTMSG._serialized_start=36159 - _SENDINGEVENTMSG._serialized_end=36255 - _SENDEVENTFAILURE._serialized_start=36257 - _SENDEVENTFAILURE._serialized_end=36275 - _SENDEVENTFAILUREMSG._serialized_start=36277 - _SENDEVENTFAILUREMSG._serialized_end=36381 - _FLUSHEVENTS._serialized_start=36383 - _FLUSHEVENTS._serialized_end=36396 - _FLUSHEVENTSMSG._serialized_start=36398 - _FLUSHEVENTSMSG._serialized_end=36492 - _FLUSHEVENTSFAILURE._serialized_start=36494 - _FLUSHEVENTSFAILURE._serialized_end=36514 - _FLUSHEVENTSFAILUREMSG._serialized_start=36516 - _FLUSHEVENTSFAILUREMSG._serialized_end=36624 - _TRACKINGINITIALIZEFAILURE._serialized_start=36626 - _TRACKINGINITIALIZEFAILURE._serialized_end=36671 - _TRACKINGINITIALIZEFAILUREMSG._serialized_start=36673 - _TRACKINGINITIALIZEFAILUREMSG._serialized_end=36795 - _RUNRESULTWARNINGMESSAGE._serialized_start=36797 - _RUNRESULTWARNINGMESSAGE._serialized_end=36835 - _RUNRESULTWARNINGMESSAGEMSG._serialized_start=36837 - _RUNRESULTWARNINGMESSAGEMSG._serialized_end=36955 - _DEBUGCMDOUT._serialized_start=36957 - _DEBUGCMDOUT._serialized_end=36983 - _DEBUGCMDOUTMSG._serialized_start=36985 - _DEBUGCMDOUTMSG._serialized_end=37079 - _DEBUGCMDRESULT._serialized_start=37081 - _DEBUGCMDRESULT._serialized_end=37110 - _DEBUGCMDRESULTMSG._serialized_start=37112 - _DEBUGCMDRESULTMSG._serialized_end=37212 - _LISTCMDOUT._serialized_start=37214 - _LISTCMDOUT._serialized_end=37239 - _LISTCMDOUTMSG._serialized_start=37241 - _LISTCMDOUTMSG._serialized_end=37333 - _NOTE._serialized_start=37335 - _NOTE._serialized_end=37354 - _NOTEMSG._serialized_start=37356 - _NOTEMSG._serialized_end=37436 + _DEPRECATEDMODEL._serialized_start=19227 + _DEPRECATEDMODEL._serialized_end=19313 + _DEPRECATEDMODELMSG._serialized_start=19315 + _DEPRECATEDMODELMSG._serialized_end=19417 + _UPCOMINGREFERENCEDEPRECATION._serialized_start=19420 + _UPCOMINGREFERENCEDEPRECATION._serialized_end=19618 + _UPCOMINGREFERENCEDEPRECATIONMSG._serialized_start=19621 + _UPCOMINGREFERENCEDEPRECATIONMSG._serialized_end=19749 + _DEPRECATEDREFERENCE._serialized_start=19752 + _DEPRECATEDREFERENCE._serialized_end=19941 + _DEPRECATEDREFERENCEMSG._serialized_start=19943 + _DEPRECATEDREFERENCEMSG._serialized_end=20053 + _GITSPARSECHECKOUTSUBDIRECTORY._serialized_start=20055 + _GITSPARSECHECKOUTSUBDIRECTORY._serialized_end=20102 + _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_start=20105 + _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_end=20235 + _GITPROGRESSCHECKOUTREVISION._serialized_start=20237 + _GITPROGRESSCHECKOUTREVISION._serialized_end=20284 + _GITPROGRESSCHECKOUTREVISIONMSG._serialized_start=20286 + _GITPROGRESSCHECKOUTREVISIONMSG._serialized_end=20412 + _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_start=20414 + _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_end=20466 + _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_start=20469 + _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_end=20615 + _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_start=20617 + _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_end=20663 + _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_start=20666 + _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_end=20800 + _GITNOTHINGTODO._serialized_start=20802 + _GITNOTHINGTODO._serialized_end=20831 + _GITNOTHINGTODOMSG._serialized_start=20833 + _GITNOTHINGTODOMSG._serialized_end=20933 + _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_start=20935 + _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_end=21004 + _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_start=21007 + _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_end=21141 + _GITPROGRESSCHECKEDOUTAT._serialized_start=21143 + _GITPROGRESSCHECKEDOUTAT._serialized_end=21185 + _GITPROGRESSCHECKEDOUTATMSG._serialized_start=21187 + _GITPROGRESSCHECKEDOUTATMSG._serialized_end=21305 + _REGISTRYPROGRESSGETREQUEST._serialized_start=21307 + _REGISTRYPROGRESSGETREQUEST._serialized_end=21348 + _REGISTRYPROGRESSGETREQUESTMSG._serialized_start=21350 + _REGISTRYPROGRESSGETREQUESTMSG._serialized_end=21474 + _REGISTRYPROGRESSGETRESPONSE._serialized_start=21476 + _REGISTRYPROGRESSGETRESPONSE._serialized_end=21537 + _REGISTRYPROGRESSGETRESPONSEMSG._serialized_start=21539 + _REGISTRYPROGRESSGETRESPONSEMSG._serialized_end=21665 + _SELECTORREPORTINVALIDSELECTOR._serialized_start=21667 + _SELECTORREPORTINVALIDSELECTOR._serialized_end=21762 + _SELECTORREPORTINVALIDSELECTORMSG._serialized_start=21765 + _SELECTORREPORTINVALIDSELECTORMSG._serialized_end=21895 + _DEPSNOPACKAGESFOUND._serialized_start=21897 + _DEPSNOPACKAGESFOUND._serialized_end=21918 + _DEPSNOPACKAGESFOUNDMSG._serialized_start=21920 + _DEPSNOPACKAGESFOUNDMSG._serialized_end=22030 + _DEPSSTARTPACKAGEINSTALL._serialized_start=22032 + _DEPSSTARTPACKAGEINSTALL._serialized_end=22079 + _DEPSSTARTPACKAGEINSTALLMSG._serialized_start=22081 + _DEPSSTARTPACKAGEINSTALLMSG._serialized_end=22199 + _DEPSINSTALLINFO._serialized_start=22201 + _DEPSINSTALLINFO._serialized_end=22240 + _DEPSINSTALLINFOMSG._serialized_start=22242 + _DEPSINSTALLINFOMSG._serialized_end=22344 + _DEPSUPDATEAVAILABLE._serialized_start=22346 + _DEPSUPDATEAVAILABLE._serialized_end=22391 + _DEPSUPDATEAVAILABLEMSG._serialized_start=22393 + _DEPSUPDATEAVAILABLEMSG._serialized_end=22503 + _DEPSUPTODATE._serialized_start=22505 + _DEPSUPTODATE._serialized_end=22519 + _DEPSUPTODATEMSG._serialized_start=22521 + _DEPSUPTODATEMSG._serialized_end=22617 + _DEPSLISTSUBDIRECTORY._serialized_start=22619 + _DEPSLISTSUBDIRECTORY._serialized_end=22663 + _DEPSLISTSUBDIRECTORYMSG._serialized_start=22665 + _DEPSLISTSUBDIRECTORYMSG._serialized_end=22777 + _DEPSNOTIFYUPDATESAVAILABLE._serialized_start=22779 + _DEPSNOTIFYUPDATESAVAILABLE._serialized_end=22825 + _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_start=22827 + _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_end=22951 + _RETRYEXTERNALCALL._serialized_start=22953 + _RETRYEXTERNALCALL._serialized_end=23002 + _RETRYEXTERNALCALLMSG._serialized_start=23004 + _RETRYEXTERNALCALLMSG._serialized_end=23110 + _RECORDRETRYEXCEPTION._serialized_start=23112 + _RECORDRETRYEXCEPTION._serialized_end=23147 + _RECORDRETRYEXCEPTIONMSG._serialized_start=23149 + _RECORDRETRYEXCEPTIONMSG._serialized_end=23261 + _REGISTRYINDEXPROGRESSGETREQUEST._serialized_start=23263 + _REGISTRYINDEXPROGRESSGETREQUEST._serialized_end=23309 + _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_start=23312 + _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_end=23446 + _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_start=23448 + _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_end=23514 + _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_start=23517 + _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_end=23653 + _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_start=23655 + _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_end=23705 + _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_start=23708 + _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_end=23840 + _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_start=23842 + _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_end=23892 + _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_start=23895 + _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_end=24027 + _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_start=24029 + _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_end=24082 + _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_start=24085 + _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_end=24223 + _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_start=24225 + _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_end=24276 + _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_start=24279 + _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_end=24413 + _DEPSSETDOWNLOADDIRECTORY._serialized_start=24415 + _DEPSSETDOWNLOADDIRECTORY._serialized_end=24455 + _DEPSSETDOWNLOADDIRECTORYMSG._serialized_start=24457 + _DEPSSETDOWNLOADDIRECTORYMSG._serialized_end=24577 + _DEPSUNPINNED._serialized_start=24579 + _DEPSUNPINNED._serialized_end=24624 + _DEPSUNPINNEDMSG._serialized_start=24626 + _DEPSUNPINNEDMSG._serialized_end=24722 + _NONODESFORSELECTIONCRITERIA._serialized_start=24724 + _NONODESFORSELECTIONCRITERIA._serialized_end=24771 + _NONODESFORSELECTIONCRITERIAMSG._serialized_start=24773 + _NONODESFORSELECTIONCRITERIAMSG._serialized_end=24899 + _RUNNINGOPERATIONCAUGHTERROR._serialized_start=24901 + _RUNNINGOPERATIONCAUGHTERROR._serialized_end=24943 + _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_start=24945 + _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_end=25071 + _COMPILECOMPLETE._serialized_start=25073 + _COMPILECOMPLETE._serialized_end=25090 + _COMPILECOMPLETEMSG._serialized_start=25092 + _COMPILECOMPLETEMSG._serialized_end=25194 + _FRESHNESSCHECKCOMPLETE._serialized_start=25196 + _FRESHNESSCHECKCOMPLETE._serialized_end=25220 + _FRESHNESSCHECKCOMPLETEMSG._serialized_start=25222 + _FRESHNESSCHECKCOMPLETEMSG._serialized_end=25338 + _SEEDHEADER._serialized_start=25340 + _SEEDHEADER._serialized_end=25368 + _SEEDHEADERMSG._serialized_start=25370 + _SEEDHEADERMSG._serialized_end=25462 + _SQLRUNNEREXCEPTION._serialized_start=25464 + _SQLRUNNEREXCEPTION._serialized_end=25515 + _SQLRUNNEREXCEPTIONMSG._serialized_start=25517 + _SQLRUNNEREXCEPTIONMSG._serialized_end=25625 + _LOGTESTRESULT._serialized_start=25628 + _LOGTESTRESULT._serialized_end=25796 + _LOGTESTRESULTMSG._serialized_start=25798 + _LOGTESTRESULTMSG._serialized_end=25896 + _LOGSTARTLINE._serialized_start=25898 + _LOGSTARTLINE._serialized_end=26005 + _LOGSTARTLINEMSG._serialized_start=26007 + _LOGSTARTLINEMSG._serialized_end=26103 + _LOGMODELRESULT._serialized_start=26106 + _LOGMODELRESULT._serialized_end=26255 + _LOGMODELRESULTMSG._serialized_start=26257 + _LOGMODELRESULTMSG._serialized_end=26357 + _LOGSNAPSHOTRESULT._serialized_start=26360 + _LOGSNAPSHOTRESULT._serialized_end=26610 + _LOGSNAPSHOTRESULT_CFGENTRY._serialized_start=26568 + _LOGSNAPSHOTRESULT_CFGENTRY._serialized_end=26610 + _LOGSNAPSHOTRESULTMSG._serialized_start=26612 + _LOGSNAPSHOTRESULTMSG._serialized_end=26718 + _LOGSEEDRESULT._serialized_start=26721 + _LOGSEEDRESULT._serialized_end=26906 + _LOGSEEDRESULTMSG._serialized_start=26908 + _LOGSEEDRESULTMSG._serialized_end=27006 + _LOGFRESHNESSRESULT._serialized_start=27009 + _LOGFRESHNESSRESULT._serialized_end=27182 + _LOGFRESHNESSRESULTMSG._serialized_start=27184 + _LOGFRESHNESSRESULTMSG._serialized_end=27292 + _LOGCANCELLINE._serialized_start=27294 + _LOGCANCELLINE._serialized_end=27328 + _LOGCANCELLINEMSG._serialized_start=27330 + _LOGCANCELLINEMSG._serialized_end=27428 + _DEFAULTSELECTOR._serialized_start=27430 + _DEFAULTSELECTOR._serialized_end=27461 + _DEFAULTSELECTORMSG._serialized_start=27463 + _DEFAULTSELECTORMSG._serialized_end=27565 + _NODESTART._serialized_start=27567 + _NODESTART._serialized_end=27620 + _NODESTARTMSG._serialized_start=27622 + _NODESTARTMSG._serialized_end=27712 + _NODEFINISHED._serialized_start=27714 + _NODEFINISHED._serialized_end=27817 + _NODEFINISHEDMSG._serialized_start=27819 + _NODEFINISHEDMSG._serialized_end=27915 + _QUERYCANCELATIONUNSUPPORTED._serialized_start=27917 + _QUERYCANCELATIONUNSUPPORTED._serialized_end=27960 + _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_start=27962 + _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_end=28088 + _CONCURRENCYLINE._serialized_start=28090 + _CONCURRENCYLINE._serialized_end=28169 + _CONCURRENCYLINEMSG._serialized_start=28171 + _CONCURRENCYLINEMSG._serialized_end=28273 + _WRITINGINJECTEDSQLFORNODE._serialized_start=28275 + _WRITINGINJECTEDSQLFORNODE._serialized_end=28344 + _WRITINGINJECTEDSQLFORNODEMSG._serialized_start=28346 + _WRITINGINJECTEDSQLFORNODEMSG._serialized_end=28468 + _NODECOMPILING._serialized_start=28470 + _NODECOMPILING._serialized_end=28527 + _NODECOMPILINGMSG._serialized_start=28529 + _NODECOMPILINGMSG._serialized_end=28627 + _NODEEXECUTING._serialized_start=28629 + _NODEEXECUTING._serialized_end=28686 + _NODEEXECUTINGMSG._serialized_start=28688 + _NODEEXECUTINGMSG._serialized_end=28786 + _LOGHOOKSTARTLINE._serialized_start=28788 + _LOGHOOKSTARTLINE._serialized_end=28897 + _LOGHOOKSTARTLINEMSG._serialized_start=28899 + _LOGHOOKSTARTLINEMSG._serialized_end=29003 + _LOGHOOKENDLINE._serialized_start=29006 + _LOGHOOKENDLINE._serialized_end=29153 + _LOGHOOKENDLINEMSG._serialized_start=29155 + _LOGHOOKENDLINEMSG._serialized_end=29255 + _SKIPPINGDETAILS._serialized_start=29258 + _SKIPPINGDETAILS._serialized_end=29405 + _SKIPPINGDETAILSMSG._serialized_start=29407 + _SKIPPINGDETAILSMSG._serialized_end=29509 + _NOTHINGTODO._serialized_start=29511 + _NOTHINGTODO._serialized_end=29524 + _NOTHINGTODOMSG._serialized_start=29526 + _NOTHINGTODOMSG._serialized_end=29620 + _RUNNINGOPERATIONUNCAUGHTERROR._serialized_start=29622 + _RUNNINGOPERATIONUNCAUGHTERROR._serialized_end=29666 + _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_start=29669 + _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_end=29799 + _ENDRUNRESULT._serialized_start=29802 + _ENDRUNRESULT._serialized_end=29949 + _ENDRUNRESULTMSG._serialized_start=29951 + _ENDRUNRESULTMSG._serialized_end=30047 + _NONODESSELECTED._serialized_start=30049 + _NONODESSELECTED._serialized_end=30066 + _NONODESSELECTEDMSG._serialized_start=30068 + _NONODESSELECTEDMSG._serialized_end=30170 + _COMMANDCOMPLETED._serialized_start=30172 + _COMMANDCOMPLETED._serialized_end=30291 + _COMMANDCOMPLETEDMSG._serialized_start=30293 + _COMMANDCOMPLETEDMSG._serialized_end=30397 + _SHOWNODE._serialized_start=30399 + _SHOWNODE._serialized_end=30506 + _SHOWNODEMSG._serialized_start=30508 + _SHOWNODEMSG._serialized_end=30596 + _COMPILEDNODE._serialized_start=30598 + _COMPILEDNODE._serialized_end=30710 + _COMPILEDNODEMSG._serialized_start=30712 + _COMPILEDNODEMSG._serialized_end=30808 + _CATCHABLEEXCEPTIONONRUN._serialized_start=30810 + _CATCHABLEEXCEPTIONONRUN._serialized_end=30908 + _CATCHABLEEXCEPTIONONRUNMSG._serialized_start=30910 + _CATCHABLEEXCEPTIONONRUNMSG._serialized_end=31028 + _INTERNALERRORONRUN._serialized_start=31030 + _INTERNALERRORONRUN._serialized_end=31083 + _INTERNALERRORONRUNMSG._serialized_start=31085 + _INTERNALERRORONRUNMSG._serialized_end=31193 + _GENERICEXCEPTIONONRUN._serialized_start=31195 + _GENERICEXCEPTIONONRUN._serialized_end=31270 + _GENERICEXCEPTIONONRUNMSG._serialized_start=31272 + _GENERICEXCEPTIONONRUNMSG._serialized_end=31386 + _NODECONNECTIONRELEASEERROR._serialized_start=31388 + _NODECONNECTIONRELEASEERROR._serialized_end=31466 + _NODECONNECTIONRELEASEERRORMSG._serialized_start=31468 + _NODECONNECTIONRELEASEERRORMSG._serialized_end=31592 + _FOUNDSTATS._serialized_start=31594 + _FOUNDSTATS._serialized_end=31625 + _FOUNDSTATSMSG._serialized_start=31627 + _FOUNDSTATSMSG._serialized_end=31719 + _MAINKEYBOARDINTERRUPT._serialized_start=31721 + _MAINKEYBOARDINTERRUPT._serialized_end=31744 + _MAINKEYBOARDINTERRUPTMSG._serialized_start=31746 + _MAINKEYBOARDINTERRUPTMSG._serialized_end=31860 + _MAINENCOUNTEREDERROR._serialized_start=31862 + _MAINENCOUNTEREDERROR._serialized_end=31897 + _MAINENCOUNTEREDERRORMSG._serialized_start=31899 + _MAINENCOUNTEREDERRORMSG._serialized_end=32011 + _MAINSTACKTRACE._serialized_start=32013 + _MAINSTACKTRACE._serialized_end=32050 + _MAINSTACKTRACEMSG._serialized_start=32052 + _MAINSTACKTRACEMSG._serialized_end=32152 + _SYSTEMCOULDNOTWRITE._serialized_start=32154 + _SYSTEMCOULDNOTWRITE._serialized_end=32218 + _SYSTEMCOULDNOTWRITEMSG._serialized_start=32220 + _SYSTEMCOULDNOTWRITEMSG._serialized_end=32330 + _SYSTEMEXECUTINGCMD._serialized_start=32332 + _SYSTEMEXECUTINGCMD._serialized_end=32365 + _SYSTEMEXECUTINGCMDMSG._serialized_start=32367 + _SYSTEMEXECUTINGCMDMSG._serialized_end=32475 + _SYSTEMSTDOUT._serialized_start=32477 + _SYSTEMSTDOUT._serialized_end=32505 + _SYSTEMSTDOUTMSG._serialized_start=32507 + _SYSTEMSTDOUTMSG._serialized_end=32603 + _SYSTEMSTDERR._serialized_start=32605 + _SYSTEMSTDERR._serialized_end=32633 + _SYSTEMSTDERRMSG._serialized_start=32635 + _SYSTEMSTDERRMSG._serialized_end=32731 + _SYSTEMREPORTRETURNCODE._serialized_start=32733 + _SYSTEMREPORTRETURNCODE._serialized_end=32777 + _SYSTEMREPORTRETURNCODEMSG._serialized_start=32779 + _SYSTEMREPORTRETURNCODEMSG._serialized_end=32895 + _TIMINGINFOCOLLECTED._serialized_start=32897 + _TIMINGINFOCOLLECTED._serialized_end=33009 + _TIMINGINFOCOLLECTEDMSG._serialized_start=33011 + _TIMINGINFOCOLLECTEDMSG._serialized_end=33121 + _LOGDEBUGSTACKTRACE._serialized_start=33123 + _LOGDEBUGSTACKTRACE._serialized_end=33161 + _LOGDEBUGSTACKTRACEMSG._serialized_start=33163 + _LOGDEBUGSTACKTRACEMSG._serialized_end=33271 + _CHECKCLEANPATH._serialized_start=33273 + _CHECKCLEANPATH._serialized_end=33303 + _CHECKCLEANPATHMSG._serialized_start=33305 + _CHECKCLEANPATHMSG._serialized_end=33405 + _CONFIRMCLEANPATH._serialized_start=33407 + _CONFIRMCLEANPATH._serialized_end=33439 + _CONFIRMCLEANPATHMSG._serialized_start=33441 + _CONFIRMCLEANPATHMSG._serialized_end=33545 + _PROTECTEDCLEANPATH._serialized_start=33547 + _PROTECTEDCLEANPATH._serialized_end=33581 + _PROTECTEDCLEANPATHMSG._serialized_start=33583 + _PROTECTEDCLEANPATHMSG._serialized_end=33691 + _FINISHEDCLEANPATHS._serialized_start=33693 + _FINISHEDCLEANPATHS._serialized_end=33713 + _FINISHEDCLEANPATHSMSG._serialized_start=33715 + _FINISHEDCLEANPATHSMSG._serialized_end=33823 + _OPENCOMMAND._serialized_start=33825 + _OPENCOMMAND._serialized_end=33878 + _OPENCOMMANDMSG._serialized_start=33880 + _OPENCOMMANDMSG._serialized_end=33974 + _FORMATTING._serialized_start=33976 + _FORMATTING._serialized_end=34001 + _FORMATTINGMSG._serialized_start=34003 + _FORMATTINGMSG._serialized_end=34095 + _SERVINGDOCSPORT._serialized_start=34097 + _SERVINGDOCSPORT._serialized_end=34145 + _SERVINGDOCSPORTMSG._serialized_start=34147 + _SERVINGDOCSPORTMSG._serialized_end=34249 + _SERVINGDOCSACCESSINFO._serialized_start=34251 + _SERVINGDOCSACCESSINFO._serialized_end=34288 + _SERVINGDOCSACCESSINFOMSG._serialized_start=34290 + _SERVINGDOCSACCESSINFOMSG._serialized_end=34404 + _SERVINGDOCSEXITINFO._serialized_start=34406 + _SERVINGDOCSEXITINFO._serialized_end=34427 + _SERVINGDOCSEXITINFOMSG._serialized_start=34429 + _SERVINGDOCSEXITINFOMSG._serialized_end=34539 + _RUNRESULTWARNING._serialized_start=34541 + _RUNRESULTWARNING._serialized_end=34615 + _RUNRESULTWARNINGMSG._serialized_start=34617 + _RUNRESULTWARNINGMSG._serialized_end=34721 + _RUNRESULTFAILURE._serialized_start=34723 + _RUNRESULTFAILURE._serialized_end=34797 + _RUNRESULTFAILUREMSG._serialized_start=34799 + _RUNRESULTFAILUREMSG._serialized_end=34903 + _STATSLINE._serialized_start=34905 + _STATSLINE._serialized_end=35012 + _STATSLINE_STATSENTRY._serialized_start=34968 + _STATSLINE_STATSENTRY._serialized_end=35012 + _STATSLINEMSG._serialized_start=35014 + _STATSLINEMSG._serialized_end=35104 + _RUNRESULTERROR._serialized_start=35106 + _RUNRESULTERROR._serialized_end=35135 + _RUNRESULTERRORMSG._serialized_start=35137 + _RUNRESULTERRORMSG._serialized_end=35237 + _RUNRESULTERRORNOMESSAGE._serialized_start=35239 + _RUNRESULTERRORNOMESSAGE._serialized_end=35280 + _RUNRESULTERRORNOMESSAGEMSG._serialized_start=35282 + _RUNRESULTERRORNOMESSAGEMSG._serialized_end=35400 + _SQLCOMPILEDPATH._serialized_start=35402 + _SQLCOMPILEDPATH._serialized_end=35433 + _SQLCOMPILEDPATHMSG._serialized_start=35435 + _SQLCOMPILEDPATHMSG._serialized_end=35537 + _CHECKNODETESTFAILURE._serialized_start=35539 + _CHECKNODETESTFAILURE._serialized_end=35584 + _CHECKNODETESTFAILUREMSG._serialized_start=35586 + _CHECKNODETESTFAILUREMSG._serialized_end=35698 + _FIRSTRUNRESULTERROR._serialized_start=35700 + _FIRSTRUNRESULTERROR._serialized_end=35734 + _FIRSTRUNRESULTERRORMSG._serialized_start=35736 + _FIRSTRUNRESULTERRORMSG._serialized_end=35846 + _AFTERFIRSTRUNRESULTERROR._serialized_start=35848 + _AFTERFIRSTRUNRESULTERROR._serialized_end=35887 + _AFTERFIRSTRUNRESULTERRORMSG._serialized_start=35889 + _AFTERFIRSTRUNRESULTERRORMSG._serialized_end=36009 + _ENDOFRUNSUMMARY._serialized_start=36011 + _ENDOFRUNSUMMARY._serialized_end=36098 + _ENDOFRUNSUMMARYMSG._serialized_start=36100 + _ENDOFRUNSUMMARYMSG._serialized_end=36202 + _LOGSKIPBECAUSEERROR._serialized_start=36204 + _LOGSKIPBECAUSEERROR._serialized_end=36289 + _LOGSKIPBECAUSEERRORMSG._serialized_start=36291 + _LOGSKIPBECAUSEERRORMSG._serialized_end=36401 + _ENSUREGITINSTALLED._serialized_start=36403 + _ENSUREGITINSTALLED._serialized_end=36423 + _ENSUREGITINSTALLEDMSG._serialized_start=36425 + _ENSUREGITINSTALLEDMSG._serialized_end=36533 + _DEPSCREATINGLOCALSYMLINK._serialized_start=36535 + _DEPSCREATINGLOCALSYMLINK._serialized_end=36561 + _DEPSCREATINGLOCALSYMLINKMSG._serialized_start=36563 + _DEPSCREATINGLOCALSYMLINKMSG._serialized_end=36683 + _DEPSSYMLINKNOTAVAILABLE._serialized_start=36685 + _DEPSSYMLINKNOTAVAILABLE._serialized_end=36710 + _DEPSSYMLINKNOTAVAILABLEMSG._serialized_start=36712 + _DEPSSYMLINKNOTAVAILABLEMSG._serialized_end=36830 + _DISABLETRACKING._serialized_start=36832 + _DISABLETRACKING._serialized_end=36849 + _DISABLETRACKINGMSG._serialized_start=36851 + _DISABLETRACKINGMSG._serialized_end=36953 + _SENDINGEVENT._serialized_start=36955 + _SENDINGEVENT._serialized_end=36985 + _SENDINGEVENTMSG._serialized_start=36987 + _SENDINGEVENTMSG._serialized_end=37083 + _SENDEVENTFAILURE._serialized_start=37085 + _SENDEVENTFAILURE._serialized_end=37103 + _SENDEVENTFAILUREMSG._serialized_start=37105 + _SENDEVENTFAILUREMSG._serialized_end=37209 + _FLUSHEVENTS._serialized_start=37211 + _FLUSHEVENTS._serialized_end=37224 + _FLUSHEVENTSMSG._serialized_start=37226 + _FLUSHEVENTSMSG._serialized_end=37320 + _FLUSHEVENTSFAILURE._serialized_start=37322 + _FLUSHEVENTSFAILURE._serialized_end=37342 + _FLUSHEVENTSFAILUREMSG._serialized_start=37344 + _FLUSHEVENTSFAILUREMSG._serialized_end=37452 + _TRACKINGINITIALIZEFAILURE._serialized_start=37454 + _TRACKINGINITIALIZEFAILURE._serialized_end=37499 + _TRACKINGINITIALIZEFAILUREMSG._serialized_start=37501 + _TRACKINGINITIALIZEFAILUREMSG._serialized_end=37623 + _RUNRESULTWARNINGMESSAGE._serialized_start=37625 + _RUNRESULTWARNINGMESSAGE._serialized_end=37663 + _RUNRESULTWARNINGMESSAGEMSG._serialized_start=37665 + _RUNRESULTWARNINGMESSAGEMSG._serialized_end=37783 + _DEBUGCMDOUT._serialized_start=37785 + _DEBUGCMDOUT._serialized_end=37811 + _DEBUGCMDOUTMSG._serialized_start=37813 + _DEBUGCMDOUTMSG._serialized_end=37907 + _DEBUGCMDRESULT._serialized_start=37909 + _DEBUGCMDRESULT._serialized_end=37938 + _DEBUGCMDRESULTMSG._serialized_start=37940 + _DEBUGCMDRESULTMSG._serialized_end=38040 + _LISTCMDOUT._serialized_start=38042 + _LISTCMDOUT._serialized_end=38067 + _LISTCMDOUTMSG._serialized_start=38069 + _LISTCMDOUTMSG._serialized_end=38161 + _NOTE._serialized_start=38163 + _NOTE._serialized_end=38182 + _NOTEMSG._serialized_start=38184 + _NOTEMSG._serialized_end=38264 # @@protoc_insertion_point(module_scope) diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index c0d5c1c768f..4fa9b21bd90 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -1,7 +1,7 @@ from copy import deepcopy from dataclasses import dataclass from dataclasses import field -from datetime import datetime +import datetime import os import traceback from typing import ( @@ -22,6 +22,7 @@ from dbt.events.base_types import EventLevel import json import pprint +import msgpack import dbt.exceptions import dbt.tracking @@ -51,6 +52,9 @@ StateCheckVarsHash, Note, PublicationArtifactChanged, + DeprecatedModel, + DeprecatedReference, + UpcomingReferenceDeprecation, ) from dbt.logger import DbtProcessState from dbt.node_types import NodeType, AccessType @@ -131,6 +135,45 @@ PERF_INFO_FILE_NAME = "perf_info.json" +def extended_mashumaro_encoder(data): + return msgpack.packb(data, default=extended_msgpack_encoder, use_bin_type=True) + + +def extended_msgpack_encoder(obj): + if type(obj) is datetime.date: + date_bytes = msgpack.ExtType(1, obj.isoformat().encode()) + return date_bytes + elif type(obj) is datetime.datetime: + datetime_bytes = msgpack.ExtType(2, obj.isoformat().encode()) + return datetime_bytes + + return obj + + +def extended_mashumuro_decoder(data): + return msgpack.unpackb(data, ext_hook=extended_msgpack_decoder, raw=False) + + +def extended_msgpack_decoder(code, data): + if code == 1: + d = datetime.date.fromisoformat(data.decode()) + return d + elif code == 2: + dt = datetime.datetime.fromisoformat(data.decode()) + return dt + else: + return msgpack.ExtType(code, data) + + +def version_to_str(version: Optional[Union[str, int]]) -> str: + if isinstance(version, int): + return str(version) + elif isinstance(version, str): + return version + + return "" + + class ReparseReason(StrEnum): version_mismatch = "01_version_mismatch" file_not_found = "02_file_not_found" @@ -511,8 +554,46 @@ def load(self): # write out the fully parsed manifest self.write_manifest_for_partial_parse() + self.check_for_model_deprecations() + return self.manifest + def check_for_model_deprecations(self): + for node in self.manifest.nodes.values(): + if isinstance(node, ModelNode): + if ( + node.deprecation_date + and node.deprecation_date < datetime.datetime.now().astimezone() + ): + fire_event( + DeprecatedModel( + model_name=node.name, + model_version=version_to_str(node.version), + deprecation_date=node.deprecation_date.isoformat(), + ) + ) + + resolved_refs = self.manifest.resolve_refs(node, self.root_project.project_name) + resolved_model_refs = [r for r in resolved_refs if isinstance(r, ModelNode)] + for resolved_ref in resolved_model_refs: + if resolved_ref.deprecation_date: + + if resolved_ref.deprecation_date < datetime.datetime.now().astimezone(): + event_cls = DeprecatedReference + else: + event_cls = UpcomingReferenceDeprecation + + fire_event( + event_cls( + model_name=node.name, + ref_model_package=resolved_ref.package_name, + ref_model_name=resolved_ref.name, + ref_model_version=version_to_str(resolved_ref.version), + ref_model_latest_version=str(resolved_ref.latest_version), + ref_model_deprecation_date=resolved_ref.deprecation_date.isoformat(), + ) + ) + def load_and_parse_macros(self, project_parser_files): for project in self.all_projects.values(): if project.project_name not in project_parser_files: @@ -658,7 +739,7 @@ def write_manifest_for_partial_parse(self): UnableToPartialParse(reason="saved manifest contained the wrong version") ) self.manifest.metadata.dbt_version = __version__ - manifest_msgpack = self.manifest.to_msgpack() + manifest_msgpack = self.manifest.to_msgpack(extended_mashumaro_encoder) make_directory(os.path.dirname(path)) with open(path, "wb") as fp: fp.write(manifest_msgpack) @@ -872,14 +953,14 @@ def read_manifest_for_partial_parse(self) -> Optional[Manifest]: try: with open(path, "rb") as fp: manifest_mp = fp.read() - manifest: Manifest = Manifest.from_msgpack(manifest_mp) # type: ignore + manifest: Manifest = Manifest.from_msgpack(manifest_mp, decoder=extended_mashumuro_decoder) # type: ignore # keep this check inside the try/except in case something about # the file has changed in weird ways, perhaps due to being a # different version of dbt is_partial_parsable, reparse_reason = self.is_partial_parsable(manifest) if is_partial_parsable: # We don't want to have stale generated_at dates - manifest.metadata.generated_at = datetime.utcnow() + manifest.metadata.generated_at = datetime.datetime.utcnow() # or invocation_ids manifest.metadata.invocation_id = get_invocation_id() return manifest @@ -1718,6 +1799,7 @@ def write_publication_artifact(root_project: RuntimeConfig, manifest: Manifest): latest_version=model.latest_version, public_node_dependencies=list(public_node_dependencies), generated_at=metadata.generated_at, + deprecation_date=model.deprecation_date, ) public_models[unique_id] = public_model diff --git a/core/dbt/parser/schemas.py b/core/dbt/parser/schemas.py index 0d187735f29..ba83212101f 100644 --- a/core/dbt/parser/schemas.py +++ b/core/dbt/parser/schemas.py @@ -1,7 +1,8 @@ +import datetime import time from abc import ABCMeta, abstractmethod -from typing import Iterable, Dict, Any, List, Generic, TypeVar, Type, Callable +from typing import Any, Callable, Dict, Generic, Iterable, List, Optional, Type, TypeVar from dataclasses import dataclass, field from dbt.dataclass_schema import ValidationError, dbtClassMixin @@ -515,6 +516,10 @@ def parse_patch(self, block: TargetBlock[NodeTarget], refs: ParserRef) -> None: # We're not passing the ParsedNodePatch around anymore, so we # could possibly skip creating one. Leaving here for now for # code consistency. + deprecation_date: Optional[datetime.datetime] = None + if isinstance(block.target, UnparsedModelUpdate): + deprecation_date = block.target.deprecation_date + patch = ParsedNodePatch( name=block.target.name, original_file_path=block.target.original_file_path, @@ -529,6 +534,7 @@ def parse_patch(self, block: TargetBlock[NodeTarget], refs: ParserRef) -> None: version=None, latest_version=None, constraints=block.target.constraints, + deprecation_date=deprecation_date, ) assert isinstance(self.yaml.file, SchemaSourceFile) source_file: SchemaSourceFile = self.yaml.file @@ -761,6 +767,7 @@ def parse_patch(self, block: TargetBlock[UnparsedModelUpdate], refs: ParserRef) version=unparsed_version.v, latest_version=latest_version, constraints=unparsed_version.constraints or target.constraints, + deprecation_date=unparsed_version.deprecation_date, ) # Node patched before config because config patching depends on model name, # which may have been updated in the version patch @@ -782,6 +789,7 @@ def patch_node_properties(self, node, patch: "ParsedNodePatch"): super().patch_node_properties(node, patch) node.version = patch.version node.latest_version = patch.latest_version + node.deprecation_date = patch.deprecation_date if patch.access: if AccessType.is_valid(patch.access): node.access = AccessType(patch.access) diff --git a/core/dbt/utils.py b/core/dbt/utils.py index 4a546a5ab34..9ddebcaf71a 100644 --- a/core/dbt/utils.py +++ b/core/dbt/utils.py @@ -185,7 +185,7 @@ def _deep_map_render( value: Any, keypath: Tuple[Union[str, int], ...], ) -> Any: - atomic_types: Tuple[Type[Any], ...] = (int, float, str, type(None), bool) + atomic_types: Tuple[Type[Any], ...] = (int, float, str, type(None), bool, datetime.date) ret: Any diff --git a/pytest.ini b/pytest.ini index 26ae97594fe..fb950db7c9c 100644 --- a/pytest.ini +++ b/pytest.ini @@ -7,3 +7,4 @@ env_files = testpaths = test/unit tests/functional + tests/unit diff --git a/schemas/dbt/manifest/v10.json b/schemas/dbt/manifest/v10.json index c4e2cbf83c2..7ea2441e02b 100644 --- a/schemas/dbt/manifest/v10.json +++ b/schemas/dbt/manifest/v10.json @@ -1977,6 +1977,16 @@ "type": "null" } ] + }, + "deprecation_date": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] } }, "additionalProperties": false, diff --git a/test/unit/test_manifest.py b/test/unit/test_manifest.py index 640db1002e5..3138dba2e85 100644 --- a/test/unit/test_manifest.py +++ b/test/unit/test_manifest.py @@ -93,6 +93,7 @@ "version", "latest_version", "constraints", + "deprecation_date", "state_relation", } ) diff --git a/tests/functional/artifacts/expected_manifest.py b/tests/functional/artifacts/expected_manifest.py index 003bb69211d..7805294a65f 100644 --- a/tests/functional/artifacts/expected_manifest.py +++ b/tests/functional/artifacts/expected_manifest.py @@ -263,6 +263,7 @@ def expected_seeded_manifest(project, model_database=None, quote_model=False): "refs": [{"name": "seed", "package": None, "version": None}], "sources": [], "depends_on": {"nodes": ["seed.test.seed"], "macros": [], "public_nodes": []}, + "deprecation_date": None, "unique_id": "model.test.model", "fqn": ["test", "model"], "metrics": [], @@ -355,6 +356,7 @@ def expected_seeded_manifest(project, model_database=None, quote_model=False): "refs": [{"name": "seed", "package": None, "version": None}], "sources": [], "depends_on": {"nodes": ["seed.test.seed"], "macros": [], "public_nodes": []}, + "deprecation_date": None, "unique_id": "model.test.second_model", "fqn": ["test", "second_model"], "metrics": [], @@ -925,6 +927,7 @@ def expected_references_manifest(project): "nodes": ["source.test.my_source.my_table"], "public_nodes": [], }, + "deprecation_date": None, "deferred": False, "description": "", "docs": {"node_color": None, "show": True}, @@ -991,6 +994,7 @@ def expected_references_manifest(project): "nodes": ["model.test.ephemeral_copy"], "public_nodes": [], }, + "deprecation_date": None, "deferred": False, "description": "A summmary table of the ephemeral copy of the seed data", "docs": {"node_color": None, "show": True}, @@ -1060,6 +1064,7 @@ def expected_references_manifest(project): "nodes": ["model.test.ephemeral_summary"], "public_nodes": [], }, + "deprecation_date": None, "deferred": False, "description": "A view of the summary of the ephemeral copy of the seed data", "docs": {"node_color": None, "show": True}, @@ -1509,6 +1514,7 @@ def expected_versions_manifest(project): "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "deferred": False, "description": "A versioned model", + "deprecation_date": ANY, "docs": {"node_color": None, "show": True}, "fqn": ["test", "versioned_model", "v1"], "group": "test_group", @@ -1579,6 +1585,7 @@ def expected_versions_manifest(project): "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "deferred": False, "description": "A versioned model", + "deprecation_date": None, "docs": {"node_color": None, "show": True}, "fqn": ["test", "versioned_model", "v2"], "group": "test_group", @@ -1630,6 +1637,7 @@ def expected_versions_manifest(project): ], "public_nodes": [], }, + "deprecation_date": None, "deferred": False, "description": "", "docs": {"node_color": None, "show": True}, diff --git a/tests/functional/artifacts/test_artifacts.py b/tests/functional/artifacts/test_artifacts.py index c16766b250d..8d64e9121fe 100644 --- a/tests/functional/artifacts/test_artifacts.py +++ b/tests/functional/artifacts/test_artifacts.py @@ -360,6 +360,7 @@ versions: - v: 1 defined_in: arbitrary_file_name + deprecation_date: 2022-07-11 - v: 2 config: materialized: view diff --git a/tests/functional/deprecations/model_deprecations.py b/tests/functional/deprecations/model_deprecations.py new file mode 100644 index 00000000000..f57f790624b --- /dev/null +++ b/tests/functional/deprecations/model_deprecations.py @@ -0,0 +1,78 @@ +import pytest + +from dbt.cli.main import dbtRunner + +deprecated_model__yml = """ +version: 2 + +models: + - name: my_model + description: deprecated + deprecation_date: 1999-01-01 +""" + +deprecating_model__yml = """ +version: 2 + +models: + - name: my_model + description: deprecating in the future + deprecation_date: 2999-01-01 +""" + +model__sql = """ +select 1 as Id +""" + +dependant_model__sql = """ +select * from {{ ref("my_model") }} +""" + + +class TestModelDeprecationWarning: + @pytest.fixture(scope="class") + def models(self): + return {"my_model.sql": model__sql, "my_schema.yml": deprecated_model__yml} + + def test_deprecation_warning(self, project): + events = [] + dbtRunner(callbacks=[events.append]).invoke(["parse"]) + matches = list([e for e in events if e.info.name == "DeprecatedModel"]) + assert len(matches) == 1 + assert matches[0].data.model_name == "my_model" + + +class TestReferenceDeprecatingWarning: + @pytest.fixture(scope="class") + def models(self): + return { + "my_model.sql": model__sql, + "my_dependant_model.sql": dependant_model__sql, + "my_schema.yml": deprecating_model__yml, + } + + def test_deprecation_warning(self, project): + events = [] + dbtRunner(callbacks=[events.append]).invoke(["parse"]) + matches = list([e for e in events if e.info.name == "UpcomingReferenceDeprecation"]) + assert len(matches) == 1 + assert matches[0].data.model_name == "my_dependant_model" + assert matches[0].data.ref_model_name == "my_model" + + +class TestReferenceDeprecatedWarning: + @pytest.fixture(scope="class") + def models(self): + return { + "my_model.sql": model__sql, + "my_dependant_model.sql": dependant_model__sql, + "my_schema.yml": deprecated_model__yml, + } + + def test_deprecation_warning(self, project): + events = [] + dbtRunner(callbacks=[events.append]).invoke(["parse"]) + matches = list([e for e in events if e.info.name == "DeprecatedReference"]) + assert len(matches) == 1 + assert matches[0].data.model_name == "my_dependant_model" + assert matches[0].data.ref_model_name == "my_model" diff --git a/tests/unit/test_events.py b/tests/unit/test_events.py index d921ee87d5f..b61ff9d939e 100644 --- a/tests/unit/test_events.py +++ b/tests/unit/test_events.py @@ -233,6 +233,21 @@ def test_event_codes(self): types.UnpinnedRefNewVersionAvailable( ref_node_name="", ref_node_package="", ref_node_version="", ref_max_version="" ), + types.DeprecatedModel(model_name="", model_version="", deprecation_date=""), + types.DeprecatedReference( + model_name="", + ref_model_name="", + ref_model_package="", + ref_model_deprecation_date="", + ref_model_latest_version="", + ), + types.UpcomingReferenceDeprecation( + model_name="", + ref_model_name="", + ref_model_package="", + ref_model_deprecation_date="", + ref_model_latest_version="", + ), # M - Deps generation ====================== types.GitSparseCheckoutSubdirectory(subdir=""), types.GitProgressCheckoutRevision(revision=""), diff --git a/third-party-stubs/msgpack/__init__.pyi b/third-party-stubs/msgpack/__init__.pyi new file mode 100644 index 00000000000..7f85cda9020 --- /dev/null +++ b/third-party-stubs/msgpack/__init__.pyi @@ -0,0 +1,99 @@ +from __future__ import annotations +from typing import Any, Callable, Dict, List, Optional, Tuple +from msgpack.exceptions import ( + BufferFull, + ExtraData, + FormatError, + OutOfData, + PackException, + PackOverflowError, + PackValueError, + StackError, + UnpackException, + UnpackValueError, +) +from typing_extensions import Protocol +from msgpack.fallback import Packer, Unpacker, unpackb +from msgpack import exceptions +from msgpack.ext import ExtType +from msgpack import ext + +class _Stream(Protocol): + def read(self) -> bytes: ... + +class _FileLike(Protocol): + def read(self, n: int) -> bytes: ... + +def pack( + o: Any, + stream: _Stream, + default: Optional[Callable[[Any], Any]] = ..., + use_single_float: bool = ..., + autoreset: bool = ..., + use_bin_type: bool = ..., + strict_types: bool = ..., + datetime: bool = ..., + unicode_errors: Optional[str] = ..., +) -> None: ... +def packb( + o: Any, + default: Optional[Callable[[Any], Any]] = ..., + use_single_float: bool = ..., + autoreset: bool = ..., + use_bin_type: bool = ..., + strict_types: bool = ..., + datetime: bool = ..., + unicode_errors: Optional[str] = ..., +) -> bytes: ... +def unpack( + stream: _Stream, + file_like: Optional[_FileLike] = ..., + read_size: int = ..., + use_list: bool = ..., + raw: bool = ..., + timestamp: int = ..., + strict_map_key: bool = ..., + object_hook: Optional[Callable[[Dict[Any, Any]], Any]] = ..., + object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ..., + list_hook: Optional[Callable[[List[Any]], Any]] = ..., + unicode_errors: Optional[str] = ..., + max_buffer_size: int = ..., + ext_hook: Callable[[int, bytes], Any] = ..., + max_str_len: int = ..., + max_bin_len: int = ..., + max_array_len: int = ..., + max_map_len: int = ..., + max_ext_len: int = ..., +) -> Any: ... + +load = unpack +loads = unpackb + +dump = pack +dumps = packb + +__all__ = [ + "BufferFull", + "ExtType", + "ExtraData", + "FormatError", + "OutOfData", + "PackException", + "PackOverflowError", + "PackValueError", + "Packer", + "StackError", + "UnpackException", + "UnpackValueError", + "Unpacker", + "dump", + "dumps", + "exceptions", + "ext", + "load", + "loads", + "pack", + "packb", + "unpack", + "unpackb", +] diff --git a/third-party-stubs/msgpack/_version.pyi b/third-party-stubs/msgpack/_version.pyi new file mode 100644 index 00000000000..52211a76a7a --- /dev/null +++ b/third-party-stubs/msgpack/_version.pyi @@ -0,0 +1,3 @@ +from typing import Tuple + +version: Tuple[int, int, int] diff --git a/third-party-stubs/msgpack/exceptions.pyi b/third-party-stubs/msgpack/exceptions.pyi new file mode 100644 index 00000000000..ac5befd3c2a --- /dev/null +++ b/third-party-stubs/msgpack/exceptions.pyi @@ -0,0 +1,16 @@ +from typing import Any + +class UnpackException(Exception): ... +class BufferFull(UnpackException): ... +class OutOfData(UnpackException): ... +class FormatError(ValueError, UnpackException): ... +class StackError(ValueError, UnpackException): ... + +UnpackValueError = ValueError + +class ExtraData(UnpackValueError): + def __init__(self, unpacked: Any, exta: Any) -> None: ... + +PackException = Exception +PackValueError = ValueError +PackOverflowError = OverflowError diff --git a/third-party-stubs/msgpack/ext.pyi b/third-party-stubs/msgpack/ext.pyi new file mode 100644 index 00000000000..54e2903c179 --- /dev/null +++ b/third-party-stubs/msgpack/ext.pyi @@ -0,0 +1,28 @@ +from __future__ import annotations +from typing import NamedTuple +import datetime + +class _ExtType(NamedTuple): + code: int + data: bytes + +class ExtType(_ExtType): ... + +class TimeStamp: + def __init__(self, seconds: int, nanoseconds: int = ...) -> None: ... + def __eq__(self, o: object) -> bool: ... + def __ne__(self, o: object) -> bool: ... + @staticmethod + def from_bytes(b: bytes) -> TimeStamp: ... + @staticmethod + def to_bytes(self) -> bytes: ... + @staticmethod + def from_unix(self, unix_sec: float) -> TimeStamp: ... + def to_unix(self) -> float: ... + @staticmethod + def from_unix_nano(unix_ns: int) -> TimeStamp: ... + @staticmethod + def to_unix_nano(self) -> int: ... + def to_datetime(self) -> datetime.datetime: ... + @staticmethod + def from_datetime(dt: datetime.datetime) -> TimeStamp: ... diff --git a/third-party-stubs/msgpack/fallback.pyi b/third-party-stubs/msgpack/fallback.pyi new file mode 100644 index 00000000000..35ef24b598f --- /dev/null +++ b/third-party-stubs/msgpack/fallback.pyi @@ -0,0 +1,78 @@ +from __future__ import annotations +from typing import Any, Callable, Dict, List, Optional, Tuple + +from typing_extensions import Protocol + +class _FileLike(Protocol): + def read(self, n: int) -> bytes: ... + +def unpackb( + packed: bytes, + file_like: Optional[_FileLike] = ..., + read_size: int = ..., + use_list: bool = ..., + raw: bool = ..., + timestamp: int = ..., + strict_map_key: bool = ..., + object_hook: Optional[Callable[[Dict[Any, Any]], Any]] = ..., + object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ..., + unicode_errors: Optional[str] = ..., + max_buffer_size: int = ..., + ext_hook: Callable[[int, bytes], Any] = ..., + max_str_len: int = ..., + max_bin_len: int = ..., + max_array_len: int = ..., + max_map_len: int = ..., + max_ext_len: int = ..., +) -> Any: ... + +class Unpacker: + def __init__( + self, + file_like: Optional[_FileLike] = ..., + read_size: int = ..., + use_list: bool = ..., + raw: bool = ..., + timestamp: int = ..., + strict_map_key: bool = ..., + object_hook: Optional[Callable[[Dict[Any, Any]], Any]] = ..., + object_pairs_hook: Optional[Callable[[List[Tuple[Any, Any]]], Any]] = ..., + unicode_errors: Optional[str] = ..., + max_buffer_size: int = ..., + ext_hook: Callable[[int, bytes], Any] = ..., + max_str_len: int = ..., + max_bin_len: int = ..., + max_array_len: int = ..., + max_map_len: int = ..., + max_ext_len: int = ..., + ): ... + def feed(self, next_bytes: bytes) -> None: ... + def read_bytes(self, n: int) -> bytearray: ... + def __iter__(self) -> Unpacker: ... + def __next__(self) -> Any: ... + def next(self) -> Any: ... + def skip(self) -> None: ... + def unpack(self) -> Any: ... + def read_array_header(self) -> Any: ... + def read_map_header(self) -> Any: ... + def tell(self) -> int: ... + +class Packer: + def __init__( + self, + default: Optional[Callable[[Any], Any]] = ..., + use_single_float: bool = ..., + autoreset: bool = ..., + use_bin_type: bool = ..., + strict_types: bool = ..., + datetime: bool = ..., + unicode_errors: Optional[str] = ..., + ): ... + def pack(self, obj: Any) -> bytes: ... + def pack_map_pairs(self, pairs: Any) -> bytes: ... + def pack_array_header(self, n: int) -> bytes: ... + def pack_map_header(self, n: int) -> bytes: ... + def pack_ext_type(self, typecode: int, data: bytes) -> None: ... + def bytes(self) -> bytes: ... + def reset(self) -> None: ... + def getbuffer(self) -> memoryview: ... From c25d0c9f9c3cbaf8a4aba53f8386a73dfc9c183b Mon Sep 17 00:00:00 2001 From: Kshitij Aranke Date: Tue, 23 May 2023 14:56:23 -0700 Subject: [PATCH 10/67] fix #7502: write run_results.json for run operation (#7655) --- .../unreleased/Fixes-20230522-132924.yaml | 6 ++ core/dbt/cli/main.py | 4 +- core/dbt/contracts/results.py | 34 ---------- core/dbt/task/run_operation.py | 64 ++++++++++++++++--- tests/functional/artifacts/test_artifacts.py | 56 ++++++++++++++-- tests/functional/run_query/test_types.py | 3 +- 6 files changed, 116 insertions(+), 51 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230522-132924.yaml diff --git a/.changes/unreleased/Fixes-20230522-132924.yaml b/.changes/unreleased/Fixes-20230522-132924.yaml new file mode 100644 index 00000000000..17dee141e00 --- /dev/null +++ b/.changes/unreleased/Fixes-20230522-132924.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: write run_results.json for run operation +time: 2023-05-22T13:29:24.182612-07:00 +custom: + Author: aranke + Issue: "7502" diff --git a/core/dbt/cli/main.py b/core/dbt/cli/main.py index d599a7a4d5e..56ad5599a1b 100644 --- a/core/dbt/cli/main.py +++ b/core/dbt/cli/main.py @@ -19,7 +19,6 @@ from dbt.contracts.results import ( CatalogArtifact, RunExecutionResult, - RunOperationResultsArtifact, ) from dbt.events.base_types import EventMsg from dbt.task.build import BuildTask @@ -53,8 +52,7 @@ class dbtRunnerResult: List[str], # list/ls Manifest, # parse None, # clean, deps, init, source - RunExecutionResult, # build, compile, run, seed, snapshot, test - RunOperationResultsArtifact, # run-operation + RunExecutionResult, # build, compile, run, seed, snapshot, test, run-operation ] = None diff --git a/core/dbt/contracts/results.py b/core/dbt/contracts/results.py index 00a95b573fb..fea3bb30e28 100644 --- a/core/dbt/contracts/results.py +++ b/core/dbt/contracts/results.py @@ -247,40 +247,6 @@ def write(self, path: str): write_json(path, self.to_dict(omit_none=False)) -@dataclass -class RunOperationResult(ExecutionResult): - success: bool - - -@dataclass -class RunOperationResultMetadata(BaseArtifactMetadata): - dbt_schema_version: str = field( - default_factory=lambda: str(RunOperationResultsArtifact.dbt_schema_version) - ) - - -@dataclass -@schema_version("run-operation-result", 1) -class RunOperationResultsArtifact(RunOperationResult, ArtifactMixin): - @classmethod - def from_success( - cls, - success: bool, - elapsed_time: float, - generated_at: datetime, - ): - meta = RunOperationResultMetadata( - dbt_schema_version=str(cls.dbt_schema_version), - generated_at=generated_at, - ) - return cls( - metadata=meta, - results=[], - elapsed_time=elapsed_time, - success=success, - ) - - # due to issues with typing.Union collapsing subclasses, this can't subclass # PartialResult diff --git a/core/dbt/task/run_operation.py b/core/dbt/task/run_operation.py index 70bf39042f7..beac272de9a 100644 --- a/core/dbt/task/run_operation.py +++ b/core/dbt/task/run_operation.py @@ -1,19 +1,25 @@ -from datetime import datetime +import os +import threading import traceback +from datetime import datetime import agate -from .base import ConfiguredTask - import dbt.exceptions from dbt.adapters.factory import get_adapter -from dbt.contracts.results import RunOperationResultsArtifact +from dbt.contracts.files import FileHash +from dbt.contracts.graph.nodes import HookNode +from dbt.contracts.results import RunResultsArtifact, RunResult, RunStatus, TimingInfo from dbt.events.functions import fire_event from dbt.events.types import ( RunningOperationCaughtError, RunningOperationUncaughtError, LogDebugStackTrace, ) +from dbt.node_types import NodeType +from dbt.task.base import ConfiguredTask + +RESULT_FILE_NAME = "run_results.json" class RunOperationTask(ConfiguredTask): @@ -22,7 +28,7 @@ def _get_macro_parts(self): if "." in macro_name: package_name, macro_name = macro_name.split(".", 1) else: - package_name = None + package_name = self.config.project_name return package_name, macro_name @@ -40,7 +46,7 @@ def _run_unsafe(self) -> agate.Table: return res - def run(self) -> RunOperationResultsArtifact: + def run(self) -> RunResultsArtifact: start = datetime.utcnow() self.compile_manifest() try: @@ -56,11 +62,51 @@ def run(self) -> RunOperationResultsArtifact: else: success = True end = datetime.utcnow() - return RunOperationResultsArtifact.from_success( + + package_name, macro_name = self._get_macro_parts() + fqn = [NodeType.Operation, package_name, macro_name] + unique_id = ".".join(fqn) + + run_result = RunResult( + adapter_response={}, + status=RunStatus.Success if success else RunStatus.Error, + execution_time=(end - start).total_seconds(), + failures=0 if success else 1, + message=None, + node=HookNode( + alias=macro_name, + checksum=FileHash.from_contents(unique_id), + database=self.config.credentials.database, + schema=self.config.credentials.schema, + resource_type=NodeType.Operation, + fqn=fqn, + name=macro_name, + unique_id=unique_id, + package_name=package_name, + path="", + original_file_path="", + ), + thread_id=threading.current_thread().name, + timing=[TimingInfo(name=macro_name, started_at=start, completed_at=end)], + ) + + results = RunResultsArtifact.from_execution_results( generated_at=end, elapsed_time=(end - start).total_seconds(), - success=success, + args={ + k: v + for k, v in self.args.__dict__.items() + if k.islower() and type(v) in (str, int, float, bool, list, dict) + }, + results=[run_result], ) + result_path = os.path.join(self.config.target_path, RESULT_FILE_NAME) + + if self.args.write_json: + results.write(result_path) + + return results + def interpret_results(self, results): - return results.success + return results.results[0].status == RunStatus.Success diff --git a/tests/functional/artifacts/test_artifacts.py b/tests/functional/artifacts/test_artifacts.py index 8d64e9121fe..1ccc4c75309 100644 --- a/tests/functional/artifacts/test_artifacts.py +++ b/tests/functional/artifacts/test_artifacts.py @@ -4,7 +4,7 @@ import dbt import jsonschema -from dbt.tests.util import run_dbt, get_artifact, check_datetime_between +from dbt.tests.util import run_dbt, get_artifact, check_datetime_between, run_dbt_and_capture from tests.functional.artifacts.expected_manifest import ( expected_seeded_manifest, expected_references_manifest, @@ -17,7 +17,7 @@ ) from dbt.contracts.graph.manifest import WritableManifest -from dbt.contracts.results import RunResultsArtifact +from dbt.contracts.results import RunResultsArtifact, RunStatus models__schema_yml = """ version: 2 @@ -129,6 +129,17 @@ select * from {{ ref('seed') }} """ +models__model_with_pre_hook_sql = """ +{{ + config( + pre_hook={ + "sql": "{{ alter_timezone(timezone='Etc/UTC') }}" + } + ) +}} +select current_setting('timezone') as timezone +""" + seed__schema_yml = """ version: 2 seeds: @@ -184,6 +195,17 @@ {% endtest %} """ +macros__alter_timezone_sql = """ +{% macro alter_timezone(timezone='America/Los_Angeles') %} +{% set sql %} + SET TimeZone='{{ timezone }}'; +{% endset %} + +{% do run_query(sql) %} +{% do log("Timezone set to: " + timezone, info=True) %} +{% endmacro %} +""" + snapshot__snapshot_seed_sql = """ {% snapshot snapshot_seed %} {{ @@ -328,7 +350,6 @@ """ - versioned_models__schema_yml = """ version: 2 @@ -509,7 +530,7 @@ def verify_run_results(project, expected_run_results, start_time, run_results_sc # sort the results so we can make reasonable assertions run_results["results"].sort(key=lambda r: r["unique_id"]) assert run_results["results"] == expected_run_results - set(run_results) == {"elapsed_time", "results", "metadata"} + assert set(run_results) == {"elapsed_time", "results", "metadata", "args"} class BaseVerifyProject: @@ -650,3 +671,30 @@ def test_versions(self, project, manifest_schema_path, run_results_schema_path): verify_run_results( project, expected_versions_run_results(), start_time, run_results_schema_path ) + + +class TestVerifyRunOperation(BaseVerifyProject): + @pytest.fixture(scope="class") + def macros(self): + return {"alter_timezone.sql": macros__alter_timezone_sql} + + @pytest.fixture(scope="class") + def models(self): + return { + "model_with_pre_hook.sql": models__model_with_pre_hook_sql, + } + + def test_run_operation(self, project): + results, log_output = run_dbt_and_capture(["run-operation", "alter_timezone"]) + assert len(results) == 1 + assert results[0].status == RunStatus.Success + assert results[0].unique_id == "operation.test.alter_timezone" + assert "Timezone set to: America/Los_Angeles" in log_output + + def test_run_model_with_operation(self, project): + # pre-hooks are not included in run_results since they are an attribute of the node and not a node in their + # own right + results, log_output = run_dbt_and_capture(["run", "--select", "model_with_pre_hook"]) + assert len(results) == 1 + assert results[0].status == RunStatus.Success + assert "Timezone set to: Etc/UTC" in log_output diff --git a/tests/functional/run_query/test_types.py b/tests/functional/run_query/test_types.py index 825d3793895..4c5effa0dd5 100644 --- a/tests/functional/run_query/test_types.py +++ b/tests/functional/run_query/test_types.py @@ -1,5 +1,6 @@ import pytest +from dbt.contracts.results import NodeStatus from dbt.tests.util import run_dbt macros_sql = """ @@ -30,4 +31,4 @@ def macros(self): def test_nested_types(self, project): result = run_dbt(["run-operation", "test_array_results"]) - assert result.success + assert result.results[0].status == NodeStatus.Success From 0f223663bbd7c84190c4ce78593bfae045bad388 Mon Sep 17 00:00:00 2001 From: Doug Beatty <44704949+dbeatty10@users.noreply.github.com> Date: Tue, 23 May 2023 17:56:54 -0600 Subject: [PATCH 11/67] Honor `--skip-profile-setup` parameter when inside an existing project (#7609) * Honor `--skip-profile-setup` parameter when inside an existing project * Use project name as the profile name * Use separate file connections for reading and writing * Raise a custom exception when no adapters are installed * Test skipping interactive profile setup when inside a dbt project * Replace `assert_not_called()` since it does not work * Verbose CLI argument for skipping profile setup * Use separate file connections for reading and writing * Check empty list in a Pythonic manner --- .../unreleased/Fixes-20230511-140441.yaml | 6 ++ core/dbt/exceptions.py | 9 ++ core/dbt/task/init.py | 86 +++++++++---------- tests/functional/init/test_init.py | 32 ++++++- 4 files changed, 84 insertions(+), 49 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230511-140441.yaml diff --git a/.changes/unreleased/Fixes-20230511-140441.yaml b/.changes/unreleased/Fixes-20230511-140441.yaml new file mode 100644 index 00000000000..a42f1158552 --- /dev/null +++ b/.changes/unreleased/Fixes-20230511-140441.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Honor `--skip-profile-setup` parameter when inside an existing project +time: 2023-05-11T14:04:41.382181-06:00 +custom: + Author: dbeatty10 + Issue: "7594" diff --git a/core/dbt/exceptions.py b/core/dbt/exceptions.py index 93d64a260cf..130ec4284cd 100644 --- a/core/dbt/exceptions.py +++ b/core/dbt/exceptions.py @@ -698,6 +698,15 @@ def get_message(self) -> str: return msg +class NoAdaptersAvailableError(DbtRuntimeError): + def __init__(self): + super().__init__(msg=self.get_message()) + + def get_message(self) -> str: + msg = "No adapters available. Learn how to install an adapter by going to https://docs.getdbt.com/docs/supported-data-platforms#adapter-installation" + return msg + + class BadSpecError(DbtInternalError): def __init__(self, repo, revision, error): self.repo = repo diff --git a/core/dbt/task/init.py b/core/dbt/task/init.py index dcc37d859bf..4f7509bc708 100644 --- a/core/dbt/task/init.py +++ b/core/dbt/task/init.py @@ -3,7 +3,6 @@ from pathlib import Path import re import shutil -import sys from typing import Optional import yaml @@ -145,17 +144,17 @@ def write_profile(self, profile: dict, profile_name: str): This will overwrite any profile with a matching name.""" # Create the profile directory if it doesn't exist profiles_filepath = Path(get_flags().PROFILES_DIR) / Path("profiles.yml") + + profiles = {profile_name: profile} + if profiles_filepath.exists(): - with open(profiles_filepath, "r+") as f: + with open(profiles_filepath, "r") as f: profiles = yaml.safe_load(f) or {} profiles[profile_name] = profile - f.seek(0) - yaml.dump(profiles, f) - f.truncate() - else: - profiles = {profile_name: profile} - with open(profiles_filepath, "w") as f: - yaml.dump(profiles, f) + + # Write the profiles dictionary to a brand-new or pre-existing file + with open(profiles_filepath, "w") as f: + yaml.dump(profiles, f) def create_profile_from_profile_template(self, profile_template: dict, profile_name: str): """Create and write a profile using the supplied profile_template.""" @@ -221,6 +220,10 @@ def create_profile_using_project_profile_template(self, profile_name): def ask_for_adapter_choice(self) -> str: """Ask the user which adapter (database) they'd like to use.""" available_adapters = list(_get_adapter_plugin_names()) + + if not available_adapters: + raise dbt.exceptions.NoAdaptersAvailableError() + prompt_msg = ( "Which database would you like to use?\n" + "\n".join([f"[{n+1}] {v}" for n, v in enumerate(available_adapters)]) @@ -244,6 +247,21 @@ def get_valid_project_name(self) -> str: return name + def create_new_project(self, project_name: str): + self.copy_starter_repo(project_name) + os.chdir(project_name) + with open("dbt_project.yml", "r") as f: + content = f"{f.read()}".format(project_name=project_name, profile_name=project_name) + with open("dbt_project.yml", "w") as f: + f.write(content) + fire_event( + ProjectCreated( + project_name=project_name, + docs_url=DOCS_URL, + slack_url=SLACK_URL, + ) + ) + def run(self): """Entry point for the init task.""" profiles_dir = get_flags().PROFILES_DIR @@ -258,8 +276,21 @@ def run(self): if in_project: # When dbt init is run inside an existing project, # just setup the user's profile. - fire_event(SettingUpProfile()) profile_name = self.get_profile_name_from_current_project() + else: + # When dbt init is run outside of an existing project, + # create a new project and set up the user's profile. + project_name = self.get_valid_project_name() + project_path = Path(project_name) + if project_path.exists(): + fire_event(ProjectNameAlreadyExists(name=project_name)) + return + self.create_new_project(project_name) + profile_name = project_name + + # Ask for adapter only if skip_profile_setup flag is not provided. + if not self.args.skip_profile_setup: + fire_event(SettingUpProfile()) if not self.check_if_can_write_profile(profile_name=profile_name): return # If a profile_template.yml exists in the project root, that effectively @@ -275,38 +306,3 @@ def run(self): fire_event(InvalidProfileTemplateYAML()) adapter = self.ask_for_adapter_choice() self.create_profile_from_target(adapter, profile_name=profile_name) - return - - # When dbt init is run outside of an existing project, - # create a new project and set up the user's profile. - available_adapters = list(_get_adapter_plugin_names()) - if not len(available_adapters): - print("No adapters available. Go to https://docs.getdbt.com/docs/available-adapters") - sys.exit(1) - project_name = self.get_valid_project_name() - project_path = Path(project_name) - if project_path.exists(): - fire_event(ProjectNameAlreadyExists(name=project_name)) - return - - self.copy_starter_repo(project_name) - os.chdir(project_name) - with open("dbt_project.yml", "r+") as f: - content = f"{f.read()}".format(project_name=project_name, profile_name=project_name) - f.seek(0) - f.write(content) - f.truncate() - - # Ask for adapter only if skip_profile_setup flag is not provided. - if not self.args.skip_profile_setup: - if not self.check_if_can_write_profile(profile_name=project_name): - return - adapter = self.ask_for_adapter_choice() - self.create_profile_from_target(adapter, profile_name=project_name) - fire_event( - ProjectCreated( - project_name=project_name, - docs_url=DOCS_URL, - slack_url=SLACK_URL, - ) - ) diff --git a/tests/functional/init/test_init.py b/tests/functional/init/test_init.py index 4e48eeeffb5..8c0444bd0b2 100644 --- a/tests/functional/init/test_init.py +++ b/tests/functional/init/test_init.py @@ -387,6 +387,12 @@ def test_init_task_in_project_with_invalid_profile_template( ) +class TestInitInsideOfProjectBase: + @pytest.fixture(scope="class") + def project_name(self, unique_schema): + return f"my_project_{unique_schema}" + + class TestInitOutsideOfProjectBase: @pytest.fixture(scope="class") def project_name(self, unique_schema): @@ -583,7 +589,7 @@ def test_init_invalid_project_name_cli( manager.prompt.side_effect = [valid_name] mock_get_adapter.return_value = [project.adapter.type()] - run_dbt(["init", invalid_name, "-s"]) + run_dbt(["init", invalid_name, "--skip-profile-setup"]) manager.assert_has_calls( [ call.prompt("Enter a name for your project (letters, digits, underscore)"), @@ -607,7 +613,7 @@ def test_init_invalid_project_name_prompt( manager.prompt.side_effect = [invalid_name, valid_name] mock_get_adapter.return_value = [project.adapter.type()] - run_dbt(["init", "-s"]) + run_dbt(["init", "--skip-profile-setup"]) manager.assert_has_calls( [ call.prompt("Enter a name for your project (letters, digits, underscore)"), @@ -639,8 +645,8 @@ def test_init_provided_project_name_and_skip_profile_setup( mock_get.return_value = [project.adapter.type()] # provide project name through the init command - run_dbt(["init", project_name, "-s"]) - manager.assert_not_called() + run_dbt(["init", project_name, "--skip-profile-setup"]) + assert len(manager.mock_calls) == 0 with open(os.path.join(project.project_root, project_name, "dbt_project.yml"), "r") as f: assert ( @@ -684,3 +690,21 @@ def test_init_provided_project_name_and_skip_profile_setup( +materialized: view """ ) + + +class TestInitInsideProjectAndSkipProfileSetup(TestInitInsideOfProjectBase): + @mock.patch("dbt.task.init._get_adapter_plugin_names") + @mock.patch("click.confirm") + @mock.patch("click.prompt") + def test_init_inside_project_and_skip_profile_setup( + self, mock_prompt, mock_confirm, mock_get, project, project_name + ): + manager = mock.Mock() + manager.attach_mock(mock_prompt, "prompt") + manager.attach_mock(mock_confirm, "confirm") + + assert Path("dbt_project.yml").exists() + + # skip interactive profile setup + run_dbt(["init", "--skip-profile-setup"]) + assert len(manager.mock_calls) == 0 From 0d71a32aa2f446e7b125b9c88f497634a134c3b1 Mon Sep 17 00:00:00 2001 From: Sam Debruyn Date: Wed, 24 May 2023 04:49:48 +0200 Subject: [PATCH 12/67] Include null checks in utils test base (#7672) * Include null checks in utils test base * Add tests for the schema test * Add tests for this macro --------- Co-authored-by: Mila Page --- .../Under the Hood-20230521-125720.yaml | 6 +++ .../dbt/tests/adapter/utils/base_utils.py | 16 ++++++-- .../adapter/utils/fixture_null_compare.py | 34 ++++++++++++++++ .../tests/adapter/utils/test_null_compare.py | 40 +++++++++++++++++++ 4 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 .changes/unreleased/Under the Hood-20230521-125720.yaml create mode 100644 tests/adapter/dbt/tests/adapter/utils/fixture_null_compare.py create mode 100644 tests/adapter/dbt/tests/adapter/utils/test_null_compare.py diff --git a/.changes/unreleased/Under the Hood-20230521-125720.yaml b/.changes/unreleased/Under the Hood-20230521-125720.yaml new file mode 100644 index 00000000000..06707aacbb9 --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230521-125720.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Include null checks in utils test base +time: 2023-05-21T12:57:20.659726+02:00 +custom: + Author: sdebruyn + Issue: "7670" diff --git a/tests/adapter/dbt/tests/adapter/utils/base_utils.py b/tests/adapter/dbt/tests/adapter/utils/base_utils.py index 9e0df09aa39..75d621c2bf9 100644 --- a/tests/adapter/dbt/tests/adapter/utils/base_utils.py +++ b/tests/adapter/dbt/tests/adapter/utils/base_utils.py @@ -1,10 +1,17 @@ import pytest from dbt.tests.util import run_dbt +macros__equals_sql = """ +{% macro equals(actual, expected) %} +{# -- actual is not distinct from expected #} +(({{ actual }} = {{ expected }}) or ({{ actual }} is null and {{ expected }} is null)) +{% endmacro %} +""" + macros__test_assert_equal_sql = """ {% test assert_equal(model, actual, expected) %} -select * from {{ model }} where {{ actual }} != {{ expected }} - +select * from {{ model }} +where not {{ equals(actual, expected) }} {% endtest %} """ @@ -13,7 +20,10 @@ class BaseUtils: # setup @pytest.fixture(scope="class") def macros(self): - return {"test_assert_equal.sql": macros__test_assert_equal_sql} + return { + "equals.sql": macros__equals_sql, + "test_assert_equal.sql": macros__test_assert_equal_sql, + } # make it possible to dynamically update the macro call with a namespace # (e.g.) 'dateadd', 'dbt.dateadd', 'dbt_utils.dateadd' diff --git a/tests/adapter/dbt/tests/adapter/utils/fixture_null_compare.py b/tests/adapter/dbt/tests/adapter/utils/fixture_null_compare.py new file mode 100644 index 00000000000..8a524010082 --- /dev/null +++ b/tests/adapter/dbt/tests/adapter/utils/fixture_null_compare.py @@ -0,0 +1,34 @@ +MODELS__TEST_MIXED_NULL_COMPARE_SQL = """ +select + 1 as actual, + null as expected +""" + + +MODELS__TEST_MIXED_NULL_COMPARE_YML = """ +version: 2 +models: + - name: test_null_compare + tests: + - assert_equal: + actual: actual + expected: expected +""" + + +MODELS__TEST_NULL_COMPARE_SQL = """ +select + null as actual, + null as expected +""" + + +MODELS__TEST_NULL_COMPARE_YML = """ +version: 2 +models: + - name: test_null_compare + tests: + - assert_equal: + actual: actual + expected: expected +""" diff --git a/tests/adapter/dbt/tests/adapter/utils/test_null_compare.py b/tests/adapter/dbt/tests/adapter/utils/test_null_compare.py new file mode 100644 index 00000000000..58a1c9daaf9 --- /dev/null +++ b/tests/adapter/dbt/tests/adapter/utils/test_null_compare.py @@ -0,0 +1,40 @@ +import pytest + +from dbt.tests.adapter.utils.base_utils import BaseUtils +from dbt.tests.adapter.utils.fixture_null_compare import ( + MODELS__TEST_MIXED_NULL_COMPARE_SQL, + MODELS__TEST_MIXED_NULL_COMPARE_YML, + MODELS__TEST_NULL_COMPARE_SQL, + MODELS__TEST_NULL_COMPARE_YML, +) +from dbt.tests.util import run_dbt + + +class BaseMixedNullCompare(BaseUtils): + @pytest.fixture(scope="class") + def models(self): + return { + "test_mixed_null_compare.yml": MODELS__TEST_MIXED_NULL_COMPARE_SQL, + "test_mixed_null_compare.sql": MODELS__TEST_MIXED_NULL_COMPARE_YML, + } + + def test_build_assert_equal(self, project): + run_dbt() + run_dbt(["test"], expect_pass=False) + + +class BaseNullCompare(BaseUtils): + @pytest.fixture(scope="class") + def models(self): + return { + "test_null_compare.yml": MODELS__TEST_NULL_COMPARE_YML, + "test_null_compare.sql": MODELS__TEST_NULL_COMPARE_SQL, + } + + +class TestMixedNullCompare(BaseNullCompare): + pass + + +class TestNullCompare(BaseNullCompare): + pass From 0fe3ee8eca478ede01d1fd882e68a523b39edaa8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 08:01:10 -0400 Subject: [PATCH 13/67] Bump ubuntu from 23.04 to 23.10 (#7675) * Bump ubuntu from 23.04 to 23.10 Bumps ubuntu from 23.04 to 23.10. --- updated-dependencies: - dependency-name: ubuntu dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Add automated changelog yaml from template for bot PR --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Github Build Bot --- .changes/unreleased/Dependencies-20230522-005948.yaml | 6 ++++++ Dockerfile.test | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Dependencies-20230522-005948.yaml diff --git a/.changes/unreleased/Dependencies-20230522-005948.yaml b/.changes/unreleased/Dependencies-20230522-005948.yaml new file mode 100644 index 00000000000..afb75c147b6 --- /dev/null +++ b/.changes/unreleased/Dependencies-20230522-005948.yaml @@ -0,0 +1,6 @@ +kind: "Dependencies" +body: "Bump ubuntu from 23.04 to 23.10" +time: 2023-05-22T00:59:48.00000Z +custom: + Author: dependabot[bot] + PR: 7675 diff --git a/Dockerfile.test b/Dockerfile.test index 46effbf3c47..da175a1ee37 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -3,7 +3,7 @@ # See `/docker` for a generic and production-ready docker file ## -FROM ubuntu:23.04 +FROM ubuntu:23.10 ENV DEBIAN_FRONTEND noninteractive From 9373c4d1e42ac927a72b93278ea82eb0acfdb6d3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 08:15:26 -0400 Subject: [PATCH 14/67] Adding performance modeling for 1.3.4 to refs/heads/main (#7525) * adding performance baseline for 1.3.4 * Add newline --------- Co-authored-by: Github Build Bot Co-authored-by: leahwicz <60146280+leahwicz@users.noreply.github.com> --- performance/baselines/1.3.4/parse___01_2000_simple_models.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 performance/baselines/1.3.4/parse___01_2000_simple_models.json diff --git a/performance/baselines/1.3.4/parse___01_2000_simple_models.json b/performance/baselines/1.3.4/parse___01_2000_simple_models.json new file mode 100644 index 00000000000..c5431f868ba --- /dev/null +++ b/performance/baselines/1.3.4/parse___01_2000_simple_models.json @@ -0,0 +1 @@ +{"version":"1.3.4","metric":{"name":"parse","project_name":"01_2000_simple_models"},"ts":"2023-05-05T21:21:13.216166358Z","measurement":{"command":"dbt parse --no-version-check --profiles-dir ../../project_config/","mean":43.251824134715,"stddev":0.2626902769638351,"median":43.195683199465,"user":42.82592822,"system":0.444670655,"min":42.988474644965,"max":44.268850566965,"times":[43.117288670965,43.276664016965,44.268850566965,43.175714899965,43.069990564965,43.353031152965,43.064902203965,43.104385867965,43.228237677965,43.151709868965,43.410496816965,43.139105498965,43.112643799965,43.19391977696501,43.303759563965,43.312242193965,43.197446621965,43.297804568965,42.988474644965,43.269813715965]}} From b88e60f8dd36961d1c7c8557025acede6210b7db Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 08:16:02 -0400 Subject: [PATCH 15/67] Adding performance modeling for 1.4.1 to refs/heads/main (#7527) * adding performance baseline for 1.4.1 * Add newline --------- Co-authored-by: Github Build Bot Co-authored-by: leahwicz <60146280+leahwicz@users.noreply.github.com> --- performance/baselines/1.4.1/parse___01_2000_simple_models.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 performance/baselines/1.4.1/parse___01_2000_simple_models.json diff --git a/performance/baselines/1.4.1/parse___01_2000_simple_models.json b/performance/baselines/1.4.1/parse___01_2000_simple_models.json new file mode 100644 index 00000000000..30790656fe7 --- /dev/null +++ b/performance/baselines/1.4.1/parse___01_2000_simple_models.json @@ -0,0 +1 @@ +{"version":"1.4.1","metric":{"name":"parse","project_name":"01_2000_simple_models"},"ts":"2023-05-05T21:23:11.574110714Z","measurement":{"command":"dbt parse --no-version-check --profiles-dir ../../project_config/","mean":51.81799889823499,"stddev":0.49021827459557155,"median":51.877185231885,"user":50.937133405,"system":0.66050657,"min":50.713426685384995,"max":52.451290474385,"times":[51.868264556385,51.967490942385,52.321507218385,51.886105907385,52.451290474385,52.283930937385,51.818989812385,51.978303421385,51.213362656385,50.713426685384995,52.258454610385,51.758877730384995,51.082508232384995,51.128473688385,51.631421367384995,52.194084467385,52.240100726384995,51.64952270338499,51.49970049638499,52.414161330385]}} From 3b6222e5165c77757072f9ba311f487a3cb09e9f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 08:16:30 -0400 Subject: [PATCH 16/67] Adding performance modeling for 1.3.0 to refs/heads/main (#7530) * adding performance baseline for 1.3.0 * Add newline --------- Co-authored-by: Github Build Bot Co-authored-by: leahwicz <60146280+leahwicz@users.noreply.github.com> --- performance/baselines/1.3.0/parse___01_2000_simple_models.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 performance/baselines/1.3.0/parse___01_2000_simple_models.json diff --git a/performance/baselines/1.3.0/parse___01_2000_simple_models.json b/performance/baselines/1.3.0/parse___01_2000_simple_models.json new file mode 100644 index 00000000000..fc0c5ba58c7 --- /dev/null +++ b/performance/baselines/1.3.0/parse___01_2000_simple_models.json @@ -0,0 +1 @@ +{"version":"1.3.0","metric":{"name":"parse","project_name":"01_2000_simple_models"},"ts":"2023-05-05T21:26:14.178981105Z","measurement":{"command":"dbt parse --no-version-check --profiles-dir ../../project_config/","mean":57.34703829679,"stddev":1.264070714183875,"median":57.16122855003999,"user":56.124171495,"system":0.6879409899999999,"min":56.03876437454,"max":62.15960342254,"times":[56.45744564454,56.27775436354,56.50617413654,57.34027474654,57.38757627154,57.17093026654,56.29133183054,56.89527107354,57.48466258854,56.87484084654,57.14306217354,57.13537045454,58.00688797954,57.15152683354,57.65667721054,56.03876437454,57.68217591654,58.03524921154,62.15960342254,57.24518659054]}} From f99be58217ec95f47fd434177c44acdd2e433e7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 08:17:19 -0400 Subject: [PATCH 17/67] Adding performance modeling for 1.4.6 to refs/heads/main (#7532) * adding performance baseline for 1.4.6 * Add newline --------- Co-authored-by: Github Build Bot Co-authored-by: leahwicz <60146280+leahwicz@users.noreply.github.com> --- performance/baselines/1.4.6/parse___01_2000_simple_models.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 performance/baselines/1.4.6/parse___01_2000_simple_models.json diff --git a/performance/baselines/1.4.6/parse___01_2000_simple_models.json b/performance/baselines/1.4.6/parse___01_2000_simple_models.json new file mode 100644 index 00000000000..57bef215385 --- /dev/null +++ b/performance/baselines/1.4.6/parse___01_2000_simple_models.json @@ -0,0 +1 @@ +{"version":"1.4.6","metric":{"name":"parse","project_name":"01_2000_simple_models"},"ts":"2023-05-05T21:31:07.688350571Z","measurement":{"command":"dbt parse --no-version-check --profiles-dir ../../project_config/","mean":71.63662348534498,"stddev":1.0486666901040516,"median":71.48043032754501,"user":70.594864785,"system":0.7236668199999998,"min":70.179068043545,"max":73.74777047454499,"times":[70.885587350545,71.733729563545,71.902222862545,70.362755346545,70.179068043545,70.902001253545,72.798824228545,73.209881293545,70.520832511545,71.143232155545,71.623572279545,71.337288375545,71.763221403545,70.426712498545,70.82376365454499,72.50315140754499,71.161477365545,72.747252973545,73.74777047454499,72.96012466454499]}} From 0516192d6915a376edeb9d524ccb6989499d65a6 Mon Sep 17 00:00:00 2001 From: Gerda Shank Date: Wed, 24 May 2023 08:24:36 -0400 Subject: [PATCH 18/67] CT 2516 ensure that paths in Jinja context flags object are strings (#7678) --- .changes/unreleased/Fixes-20230522-135007.yaml | 6 ++++++ core/dbt/flags.py | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 .changes/unreleased/Fixes-20230522-135007.yaml diff --git a/.changes/unreleased/Fixes-20230522-135007.yaml b/.changes/unreleased/Fixes-20230522-135007.yaml new file mode 100644 index 00000000000..bef33d2fa30 --- /dev/null +++ b/.changes/unreleased/Fixes-20230522-135007.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Stringify flag paths for Jinja context +time: 2023-05-22T13:50:07.897354-04:00 +custom: + Author: gshank + Issue: "7495" diff --git a/core/dbt/flags.py b/core/dbt/flags.py index a87c9e8d37e..37462659c97 100644 --- a/core/dbt/flags.py +++ b/core/dbt/flags.py @@ -3,6 +3,7 @@ from argparse import Namespace from multiprocessing import get_context from typing import Optional +from pathlib import Path # for setting up logger for legacy logger @@ -95,6 +96,8 @@ def get_flag_dict(): def get_flag_obj(): new_flags = Namespace() for key, val in get_flag_dict().items(): + if isinstance(val, Path): + val = str(val) setattr(new_flags, key.upper(), val) # The following 3 are CLI arguments only so they're not full-fledged flags, # but we put in flags for users. From 1fdebc660b8900a7ff03d2dce9830b1d51725734 Mon Sep 17 00:00:00 2001 From: Anis Nasir Date: Wed, 24 May 2023 14:41:38 +0200 Subject: [PATCH 19/67] Relaxed the pyyaml dependency to >=5.3. (#7681) --- .changes/unreleased/Dependencies-20230522-212201.yaml | 5 +++++ core/setup.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Dependencies-20230522-212201.yaml diff --git a/.changes/unreleased/Dependencies-20230522-212201.yaml b/.changes/unreleased/Dependencies-20230522-212201.yaml new file mode 100644 index 00000000000..7346ff849c5 --- /dev/null +++ b/.changes/unreleased/Dependencies-20230522-212201.yaml @@ -0,0 +1,5 @@ +kind: Dependencies +time: 2023-05-22T21:22:01.336704+02:00 +custom: + Author: dradnan89@hotmail.com + PR: "7681" diff --git a/core/setup.py b/core/setup.py index 060befac620..049a8e0a950 100644 --- a/core/setup.py +++ b/core/setup.py @@ -69,7 +69,7 @@ "requests<3.0.0", "idna>=2.5,<4", "cffi>=1.9,<2.0.0", - "pyyaml>=6.0", + "pyyaml>=5.3", "urllib3~=1.0", ], zip_safe=False, From 70a132d05935eebbe421d943211af104b4746678 Mon Sep 17 00:00:00 2001 From: leahwicz <60146280+leahwicz@users.noreply.github.com> Date: Wed, 24 May 2023 06:12:25 -0700 Subject: [PATCH 20/67] Updating CODEOWNERS to consolidate (#7693) Consolidating to remove Language and Execution and instead default to the `core-team` --- .github/CODEOWNERS | 36 +----------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cf51e4f2812..b301d321511 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,7 +11,7 @@ # As a default for areas with no assignment, # the core team as a whole will be assigned -* @dbt-labs/core +* @dbt-labs/core-team ### OSS Tooling Guild @@ -31,40 +31,6 @@ dev_requirements.txt @dbt-labs/guild-oss-tooling /core/setup.py @dbt-labs/guild-oss-tooling /core/MANIFEST.in @dbt-labs/guild-oss-tooling -### LANGUAGE - -# Language core modules -/core/dbt/config/ @dbt-labs/core-language -/core/dbt/context/ @dbt-labs/core-language -/core/dbt/contracts/ @dbt-labs/core-language -/core/dbt/deps/ @dbt-labs/core-language -/core/dbt/events/ @dbt-labs/core-language # structured logging -/core/dbt/parser/ @dbt-labs/core-language - -# Language misc files -/core/dbt/dataclass_schema.py @dbt-labs/core-language -/core/dbt/hooks.py @dbt-labs/core-language -/core/dbt/node_types.py @dbt-labs/core-language -/core/dbt/semver.py @dbt-labs/core-language - - -### EXECUTION - -# Execution core modules -/core/dbt/graph/ @dbt-labs/core-execution -/core/dbt/task/ @dbt-labs/core-execution - -# Execution misc files -/core/dbt/compilation.py @dbt-labs/core-execution -/core/dbt/flags.py @dbt-labs/core-execution -/core/dbt/lib.py @dbt-labs/core-execution -/core/dbt/main.py @dbt-labs/core-execution -/core/dbt/profiler.py @dbt-labs/core-execution -/core/dbt/selected_resources.py @dbt-labs/core-execution -/core/dbt/tracking.py @dbt-labs/core-execution -/core/dbt/version.py @dbt-labs/core-execution - - ### ADAPTERS # Adapter interface ("base" + "sql" adapter defaults, cache) From 7c1bd91d0ae3ecea12c7f755cd0b8bb44037f319 Mon Sep 17 00:00:00 2001 From: Gerda Shank Date: Wed, 24 May 2023 13:54:58 -0400 Subject: [PATCH 21/67] CT 2590 write pub artifact to log (#7686) --- .../Under the Hood-20230523-122137.yaml | 6 + core/dbt/events/types.proto | 12 + core/dbt/events/types.py | 14 + core/dbt/events/types_pb2.py | 646 +++++++++--------- core/dbt/parser/manifest.py | 11 +- core/dbt/tests/util.py | 29 +- .../multi_project/test_publication.py | 28 +- tests/unit/test_events.py | 2 + 8 files changed, 405 insertions(+), 343 deletions(-) create mode 100644 .changes/unreleased/Under the Hood-20230523-122137.yaml diff --git a/.changes/unreleased/Under the Hood-20230523-122137.yaml b/.changes/unreleased/Under the Hood-20230523-122137.yaml new file mode 100644 index 00000000000..3810df75437 --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230523-122137.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Write pub artifact to log +time: 2023-05-23T12:21:37.235938-04:00 +custom: + Author: gshank + Issue: "7372" diff --git a/core/dbt/events/types.proto b/core/dbt/events/types.proto index 382916a54f2..e91168e1ba9 100644 --- a/core/dbt/events/types.proto +++ b/core/dbt/events/types.proto @@ -1506,6 +1506,18 @@ message NoNodesForSelectionCriteriaMsg { NoNodesForSelectionCriteria data = 2; } +// P - Artifacts + +// P001 +message PublicationArtifactAvailable { + google.protobuf.Struct pub_artifact = 1; +} + +message PublicationArtifactAvailableMsg { + EventInfo info = 1; + PublicationArtifactAvailable data = 2; +} + // Q - Node execution // Q001 diff --git a/core/dbt/events/types.py b/core/dbt/events/types.py index 51fbae31e20..ab86dce9b19 100644 --- a/core/dbt/events/types.py +++ b/core/dbt/events/types.py @@ -31,6 +31,7 @@ # | E | DB adapter | # | I | Project parsing | # | M | Deps generation | +# | P | Artifacts | # | Q | Node execution | # | W | Node testing | # | Z | Misc | @@ -1454,6 +1455,19 @@ def message(self) -> str: # ======================================================= +class PublicationArtifactAvailable(DebugLevel): + def code(self): + return "P001" + + def message(self) -> str: + return "Publication artifact available" + + +# ======================================================= +# Q - Node execution +# ======================================================= + + class RunningOperationCaughtError(ErrorLevel): def code(self): return "Q001" diff --git a/core/dbt/events/types_pb2.py b/core/dbt/events/types_pb2.py index 81777f268c3..769d6187420 100644 --- a/core/dbt/events/types_pb2.py +++ b/core/dbt/events/types_pb2.py @@ -15,7 +15,7 @@ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btypes.proto\x12\x0bproto_types\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x02\n\tEventInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\t\x12\x15\n\rinvocation_id\x18\x05 \x01(\t\x12\x0b\n\x03pid\x18\x06 \x01(\x05\x12\x0e\n\x06thread\x18\x07 \x01(\t\x12&\n\x02ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x05\x65xtra\x18\t \x03(\x0b\x32!.proto_types.EventInfo.ExtraEntry\x12\x10\n\x08\x63\x61tegory\x18\n \x01(\t\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x7f\n\rTimingInfoMsg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x0cNodeRelation\x12\x10\n\x08\x64\x61tabase\x18\n \x01(\t\x12\x0e\n\x06schema\x18\x0b \x01(\t\x12\r\n\x05\x61lias\x18\x0c \x01(\t\x12\x15\n\rrelation_name\x18\r \x01(\t\"\x91\x02\n\x08NodeInfo\x12\x11\n\tnode_path\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x11\n\tunique_id\x18\x03 \x01(\t\x12\x15\n\rresource_type\x18\x04 \x01(\t\x12\x14\n\x0cmaterialized\x18\x05 \x01(\t\x12\x13\n\x0bnode_status\x18\x06 \x01(\t\x12\x17\n\x0fnode_started_at\x18\x07 \x01(\t\x12\x18\n\x10node_finished_at\x18\x08 \x01(\t\x12%\n\x04meta\x18\t \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x30\n\rnode_relation\x18\n \x01(\x0b\x32\x19.proto_types.NodeRelation\"\xd1\x01\n\x0cRunResultMsg\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12/\n\x0btiming_info\x18\x03 \x03(\x0b\x32\x1a.proto_types.TimingInfoMsg\x12\x0e\n\x06thread\x18\x04 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x31\n\x10\x61\x64\x61pter_response\x18\x06 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"G\n\x0fReferenceKeyMsg\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x12\n\nidentifier\x18\x03 \x01(\t\"6\n\x0eGenericMessage\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\"9\n\x11MainReportVersion\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0blog_version\x18\x02 \x01(\x05\"j\n\x14MainReportVersionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.MainReportVersion\"r\n\x0eMainReportArgs\x12\x33\n\x04\x61rgs\x18\x01 \x03(\x0b\x32%.proto_types.MainReportArgs.ArgsEntry\x1a+\n\tArgsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11MainReportArgsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainReportArgs\"+\n\x15MainTrackingUserState\x12\x12\n\nuser_state\x18\x01 \x01(\t\"r\n\x18MainTrackingUserStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainTrackingUserState\"5\n\x0fMergedFromState\x12\x12\n\nnum_merged\x18\x01 \x01(\x05\x12\x0e\n\x06sample\x18\x02 \x03(\t\"f\n\x12MergedFromStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.MergedFromState\"A\n\x14MissingProfileTarget\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\"p\n\x17MissingProfileTargetMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MissingProfileTarget\"(\n\x11InvalidOptionYAML\x12\x13\n\x0boption_name\x18\x01 \x01(\t\"j\n\x14InvalidOptionYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.InvalidOptionYAML\"!\n\x12LogDbtProjectError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15LogDbtProjectErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProjectError\"3\n\x12LogDbtProfileError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08profiles\x18\x02 \x03(\t\"l\n\x15LogDbtProfileErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProfileError\"!\n\x12StarterProjectPath\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"l\n\x15StarterProjectPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StarterProjectPath\"$\n\x15\x43onfigFolderDirectory\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"r\n\x18\x43onfigFolderDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConfigFolderDirectory\"\'\n\x14NoSampleProfileFound\x12\x0f\n\x07\x61\x64\x61pter\x18\x01 \x01(\t\"p\n\x17NoSampleProfileFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NoSampleProfileFound\"6\n\x18ProfileWrittenWithSample\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"x\n\x1bProfileWrittenWithSampleMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProfileWrittenWithSample\"B\n$ProfileWrittenWithTargetTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x90\x01\n\'ProfileWrittenWithTargetTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.ProfileWrittenWithTargetTemplateYAML\"C\n%ProfileWrittenWithProjectTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x92\x01\n(ProfileWrittenWithProjectTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.ProfileWrittenWithProjectTemplateYAML\"\x12\n\x10SettingUpProfile\"h\n\x13SettingUpProfileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SettingUpProfile\"\x1c\n\x1aInvalidProfileTemplateYAML\"|\n\x1dInvalidProfileTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.InvalidProfileTemplateYAML\"(\n\x18ProjectNameAlreadyExists\x12\x0c\n\x04name\x18\x01 \x01(\t\"x\n\x1bProjectNameAlreadyExistsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProjectNameAlreadyExists\"K\n\x0eProjectCreated\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocs_url\x18\x02 \x01(\t\x12\x11\n\tslack_url\x18\x03 \x01(\t\"d\n\x11ProjectCreatedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ProjectCreated\"@\n\x1aPackageRedirectDeprecation\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1dPackageRedirectDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PackageRedirectDeprecation\"\x1f\n\x1dPackageInstallPathDeprecation\"\x82\x01\n PackageInstallPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.PackageInstallPathDeprecation\"H\n\x1b\x43onfigSourcePathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"~\n\x1e\x43onfigSourcePathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigSourcePathDeprecation\"F\n\x19\x43onfigDataPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"z\n\x1c\x43onfigDataPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConfigDataPathDeprecation\"?\n\x19\x41\x64\x61pterDeprecationWarning\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"z\n\x1c\x41\x64\x61pterDeprecationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.AdapterDeprecationWarning\".\n\x17MetricAttributesRenamed\x12\x13\n\x0bmetric_name\x18\x01 \x01(\t\"v\n\x1aMetricAttributesRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.MetricAttributesRenamed\"+\n\x17\x45xposureNameDeprecation\x12\x10\n\x08\x65xposure\x18\x01 \x01(\t\"v\n\x1a\x45xposureNameDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.ExposureNameDeprecation\"^\n\x13InternalDeprecation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x18\n\x10suggested_action\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\"n\n\x16InternalDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.InternalDeprecation\"@\n\x1a\x45nvironmentVariableRenamed\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1d\x45nvironmentVariableRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.EnvironmentVariableRenamed\"3\n\x18\x43onfigLogPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"x\n\x1b\x43onfigLogPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ConfigLogPathDeprecation\"6\n\x1b\x43onfigTargetPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"~\n\x1e\x43onfigTargetPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigTargetPathDeprecation\"!\n\x1f\x43ollectFreshnessReturnSignature\"\x86\x01\n\"CollectFreshnessReturnSignatureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.CollectFreshnessReturnSignature\"\x87\x01\n\x11\x41\x64\x61pterEventDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"j\n\x14\x41\x64\x61pterEventDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventDebug\"\x86\x01\n\x10\x41\x64\x61pterEventInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"h\n\x13\x41\x64\x61pterEventInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.AdapterEventInfo\"\x89\x01\n\x13\x41\x64\x61pterEventWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"n\n\x16\x41\x64\x61pterEventWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.AdapterEventWarning\"\x99\x01\n\x11\x41\x64\x61pterEventError\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\x12\x10\n\x08\x65xc_info\x18\x05 \x01(\t\"j\n\x14\x41\x64\x61pterEventErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventError\"_\n\rNewConnection\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"b\n\x10NewConnectionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NewConnection\"=\n\x10\x43onnectionReused\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x16\n\x0eorig_conn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionReusedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionReused\"0\n\x1b\x43onnectionLeftOpenInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"~\n\x1e\x43onnectionLeftOpenInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConnectionLeftOpenInCleanup\".\n\x19\x43onnectionClosedInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"z\n\x1c\x43onnectionClosedInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConnectionClosedInCleanup\"_\n\x0eRollbackFailed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"d\n\x11RollbackFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RollbackFailed\"O\n\x10\x43onnectionClosed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionClosedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionClosed\"Q\n\x12\x43onnectionLeftOpen\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"l\n\x15\x43onnectionLeftOpenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ConnectionLeftOpen\"G\n\x08Rollback\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"X\n\x0bRollbackMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.Rollback\"@\n\tCacheMiss\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\"Z\n\x0c\x43\x61\x63heMissMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.CacheMiss\"b\n\rListRelations\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12/\n\trelations\x18\x03 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10ListRelationsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ListRelations\"`\n\x0e\x43onnectionUsed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"d\n\x11\x43onnectionUsedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ConnectionUsed\"T\n\x08SQLQuery\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x0b\n\x03sql\x18\x03 \x01(\t\"X\n\x0bSQLQueryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.SQLQuery\"[\n\x0eSQLQueryStatus\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x03 \x01(\x02\"d\n\x11SQLQueryStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SQLQueryStatus\"H\n\tSQLCommit\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"Z\n\x0cSQLCommitMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.SQLCommit\"a\n\rColTypeChange\x12\x11\n\torig_type\x18\x01 \x01(\t\x12\x10\n\x08new_type\x18\x02 \x01(\t\x12+\n\x05table\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10\x43olTypeChangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ColTypeChange\"@\n\x0eSchemaCreation\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"d\n\x11SchemaCreationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SchemaCreation\"<\n\nSchemaDrop\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"\\\n\rSchemaDropMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SchemaDrop\"\xde\x01\n\x0b\x43\x61\x63heAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12-\n\x07ref_key\x18\x02 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_2\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_3\x18\x04 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12.\n\x08ref_list\x18\x05 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"^\n\x0e\x43\x61\x63heActionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.CacheAction\"\x98\x01\n\x0e\x43\x61\x63heDumpGraph\x12\x33\n\x04\x64ump\x18\x01 \x03(\x0b\x32%.proto_types.CacheDumpGraph.DumpEntry\x12\x14\n\x0c\x62\x65\x66ore_after\x18\x02 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\t\x1a+\n\tDumpEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11\x43\x61\x63heDumpGraphMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CacheDumpGraph\"!\n\x12\x41\x64\x61pterImportError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15\x41\x64\x61pterImportErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.AdapterImportError\"#\n\x0fPluginLoadError\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"f\n\x12PluginLoadErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.PluginLoadError\"Z\n\x14NewConnectionOpening\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x18\n\x10\x63onnection_state\x18\x02 \x01(\t\"p\n\x17NewConnectionOpeningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NewConnectionOpening\"8\n\rCodeExecution\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ode_content\x18\x02 \x01(\t\"b\n\x10\x43odeExecutionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.CodeExecution\"6\n\x13\x43odeExecutionStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x02 \x01(\x02\"n\n\x16\x43odeExecutionStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.CodeExecutionStatus\"%\n\x16\x43\x61talogGenerationError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"t\n\x19\x43\x61talogGenerationErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.CatalogGenerationError\"-\n\x13WriteCatalogFailure\x12\x16\n\x0enum_exceptions\x18\x01 \x01(\x05\"n\n\x16WriteCatalogFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.WriteCatalogFailure\"\x1e\n\x0e\x43\x61talogWritten\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43\x61talogWrittenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CatalogWritten\"\x14\n\x12\x43\x61nnotGenerateDocs\"l\n\x15\x43\x61nnotGenerateDocsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.CannotGenerateDocs\"\x11\n\x0f\x42uildingCatalog\"f\n\x12\x42uildingCatalogMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.BuildingCatalog\"-\n\x18\x44\x61tabaseErrorRunningHook\x12\x11\n\thook_type\x18\x01 \x01(\t\"x\n\x1b\x44\x61tabaseErrorRunningHookMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DatabaseErrorRunningHook\"4\n\x0cHooksRunning\x12\x11\n\tnum_hooks\x18\x01 \x01(\x05\x12\x11\n\thook_type\x18\x02 \x01(\t\"`\n\x0fHooksRunningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.HooksRunning\"T\n\x14\x46inishedRunningStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\x12\x11\n\texecution\x18\x02 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x03 \x01(\x02\"p\n\x17\x46inishedRunningStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.FinishedRunningStats\"<\n\x15\x43onstraintNotEnforced\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"r\n\x18\x43onstraintNotEnforcedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConstraintNotEnforced\"=\n\x16\x43onstraintNotSupported\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"t\n\x19\x43onstraintNotSupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.ConstraintNotSupported\"7\n\x12InputFileDiffError\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x02 \x01(\t\"l\n\x15InputFileDiffErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InputFileDiffError\"t\n\x1aPublicationArtifactChanged\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"|\n\x1dPublicationArtifactChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PublicationArtifactChanged\"?\n\x14InvalidValueForField\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x13\n\x0b\x66ield_value\x18\x02 \x01(\t\"p\n\x17InvalidValueForFieldMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.InvalidValueForField\"Q\n\x11ValidationWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x11\n\tnode_name\x18\x03 \x01(\t\"j\n\x14ValidationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ValidationWarning\"!\n\x11ParsePerfInfoPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"j\n\x14ParsePerfInfoPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ParsePerfInfoPath\"1\n!PartialParsingErrorProcessingFile\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\"\x8a\x01\n$PartialParsingErrorProcessingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.PartialParsingErrorProcessingFile\"\x86\x01\n\x13PartialParsingError\x12?\n\x08\x65xc_info\x18\x01 \x03(\x0b\x32-.proto_types.PartialParsingError.ExcInfoEntry\x1a.\n\x0c\x45xcInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"n\n\x16PartialParsingErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.PartialParsingError\"\x1b\n\x19PartialParsingSkipParsing\"z\n\x1cPartialParsingSkipParsingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.PartialParsingSkipParsing\"&\n\x14UnableToPartialParse\x12\x0e\n\x06reason\x18\x01 \x01(\t\"p\n\x17UnableToPartialParseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.UnableToPartialParse\"f\n\x12StateCheckVarsHash\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\x12\x0c\n\x04vars\x18\x02 \x01(\t\x12\x0f\n\x07profile\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\"l\n\x15StateCheckVarsHashMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StateCheckVarsHash\"\x1a\n\x18PartialParsingNotEnabled\"x\n\x1bPartialParsingNotEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.PartialParsingNotEnabled\"C\n\x14ParsedFileLoadFailed\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"p\n\x17ParsedFileLoadFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.ParsedFileLoadFailed\"H\n\x15PartialParsingEnabled\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x05\x12\r\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x05\x12\x0f\n\x07\x63hanged\x18\x03 \x01(\x05\"r\n\x18PartialParsingEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.PartialParsingEnabled\"8\n\x12PartialParsingFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\"l\n\x15PartialParsingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.PartialParsingFile\"\xaf\x01\n\x1fInvalidDisabledTargetInTestNode\x12\x1b\n\x13resource_type_title\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1a\n\x12original_file_path\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\x12\x13\n\x0btarget_name\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\"\x86\x01\n\"InvalidDisabledTargetInTestNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.InvalidDisabledTargetInTestNode\"7\n\x18UnusedResourceConfigPath\x12\x1b\n\x13unused_config_paths\x18\x01 \x03(\t\"x\n\x1bUnusedResourceConfigPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.UnusedResourceConfigPath\"3\n\rSeedIncreased\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"b\n\x10SeedIncreasedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.SeedIncreased\">\n\x18SeedExceedsLimitSamePath\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"x\n\x1bSeedExceedsLimitSamePathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.SeedExceedsLimitSamePath\"D\n\x1eSeedExceedsLimitAndPathChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x84\x01\n!SeedExceedsLimitAndPathChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.SeedExceedsLimitAndPathChanged\"\\\n\x1fSeedExceedsLimitChecksumChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rchecksum_name\x18\x03 \x01(\t\"\x86\x01\n\"SeedExceedsLimitChecksumChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.SeedExceedsLimitChecksumChanged\"%\n\x0cUnusedTables\x12\x15\n\runused_tables\x18\x01 \x03(\t\"`\n\x0fUnusedTablesMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.UnusedTables\"\x87\x01\n\x17WrongResourceSchemaFile\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x1c\n\x14plural_resource_type\x18\x03 \x01(\t\x12\x10\n\x08yaml_key\x18\x04 \x01(\t\x12\x11\n\tfile_path\x18\x05 \x01(\t\"v\n\x1aWrongResourceSchemaFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.WrongResourceSchemaFile\"K\n\x10NoNodeForYamlKey\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x10\n\x08yaml_key\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x03 \x01(\t\"h\n\x13NoNodeForYamlKeyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.NoNodeForYamlKey\"+\n\x15MacroNotFoundForPatch\x12\x12\n\npatch_name\x18\x01 \x01(\t\"r\n\x18MacroNotFoundForPatchMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MacroNotFoundForPatch\"\xb8\x01\n\x16NodeNotFoundOrDisabled\x12\x1a\n\x12original_file_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1b\n\x13resource_type_title\x18\x03 \x01(\t\x12\x13\n\x0btarget_name\x18\x04 \x01(\t\x12\x13\n\x0btarget_kind\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\x12\x10\n\x08\x64isabled\x18\x07 \x01(\t\"t\n\x19NodeNotFoundOrDisabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.NodeNotFoundOrDisabled\"H\n\x0fJinjaLogWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"f\n\x12JinjaLogWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.JinjaLogWarning\"E\n\x0cJinjaLogInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"`\n\x0fJinjaLogInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.JinjaLogInfo\"F\n\rJinjaLogDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"b\n\x10JinjaLogDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.JinjaLogDebug\"\xae\x01\n\x1eUnpinnedRefNewVersionAvailable\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rref_node_name\x18\x02 \x01(\t\x12\x18\n\x10ref_node_package\x18\x03 \x01(\t\x12\x18\n\x10ref_node_version\x18\x04 \x01(\t\x12\x17\n\x0fref_max_version\x18\x05 \x01(\t\"\x84\x01\n!UnpinnedRefNewVersionAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.UnpinnedRefNewVersionAvailable\"V\n\x0f\x44\x65precatedModel\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\x18\n\x10\x64\x65precation_date\x18\x03 \x01(\t\"f\n\x12\x44\x65precatedModelMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DeprecatedModel\"\xc6\x01\n\x1cUpcomingReferenceDeprecation\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"\x80\x01\n\x1fUpcomingReferenceDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.UpcomingReferenceDeprecation\"\xbd\x01\n\x13\x44\x65precatedReference\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"n\n\x16\x44\x65precatedReferenceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DeprecatedReference\"/\n\x1dGitSparseCheckoutSubdirectory\x12\x0e\n\x06subdir\x18\x01 \x01(\t\"\x82\x01\n GitSparseCheckoutSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.GitSparseCheckoutSubdirectory\"/\n\x1bGitProgressCheckoutRevision\x12\x10\n\x08revision\x18\x01 \x01(\t\"~\n\x1eGitProgressCheckoutRevisionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.GitProgressCheckoutRevision\"4\n%GitProgressUpdatingExistingDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x92\x01\n(GitProgressUpdatingExistingDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.GitProgressUpdatingExistingDependency\".\n\x1fGitProgressPullingNewDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x86\x01\n\"GitProgressPullingNewDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressPullingNewDependency\"\x1d\n\x0eGitNothingToDo\x12\x0b\n\x03sha\x18\x01 \x01(\t\"d\n\x11GitNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.GitNothingToDo\"E\n\x1fGitProgressUpdatedCheckoutRange\x12\x11\n\tstart_sha\x18\x01 \x01(\t\x12\x0f\n\x07\x65nd_sha\x18\x02 \x01(\t\"\x86\x01\n\"GitProgressUpdatedCheckoutRangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressUpdatedCheckoutRange\"*\n\x17GitProgressCheckedOutAt\x12\x0f\n\x07\x65nd_sha\x18\x01 \x01(\t\"v\n\x1aGitProgressCheckedOutAtMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.GitProgressCheckedOutAt\")\n\x1aRegistryProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"|\n\x1dRegistryProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.RegistryProgressGETRequest\"=\n\x1bRegistryProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"~\n\x1eRegistryProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RegistryProgressGETResponse\"_\n\x1dSelectorReportInvalidSelector\x12\x17\n\x0fvalid_selectors\x18\x01 \x01(\t\x12\x13\n\x0bspec_method\x18\x02 \x01(\t\x12\x10\n\x08raw_spec\x18\x03 \x01(\t\"\x82\x01\n SelectorReportInvalidSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.SelectorReportInvalidSelector\"\x15\n\x13\x44\x65psNoPackagesFound\"n\n\x16\x44\x65psNoPackagesFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsNoPackagesFound\"/\n\x17\x44\x65psStartPackageInstall\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\"v\n\x1a\x44\x65psStartPackageInstallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsStartPackageInstall\"\'\n\x0f\x44\x65psInstallInfo\x12\x14\n\x0cversion_name\x18\x01 \x01(\t\"f\n\x12\x44\x65psInstallInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DepsInstallInfo\"-\n\x13\x44\x65psUpdateAvailable\x12\x16\n\x0eversion_latest\x18\x01 \x01(\t\"n\n\x16\x44\x65psUpdateAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsUpdateAvailable\"\x0e\n\x0c\x44\x65psUpToDate\"`\n\x0f\x44\x65psUpToDateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUpToDate\",\n\x14\x44\x65psListSubdirectory\x12\x14\n\x0csubdirectory\x18\x01 \x01(\t\"p\n\x17\x44\x65psListSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.DepsListSubdirectory\".\n\x1a\x44\x65psNotifyUpdatesAvailable\x12\x10\n\x08packages\x18\x01 \x03(\t\"|\n\x1d\x44\x65psNotifyUpdatesAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.DepsNotifyUpdatesAvailable\"1\n\x11RetryExternalCall\x12\x0f\n\x07\x61ttempt\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"j\n\x14RetryExternalCallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.RetryExternalCall\"#\n\x14RecordRetryException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17RecordRetryExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.RecordRetryException\".\n\x1fRegistryIndexProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"\x86\x01\n\"RegistryIndexProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryIndexProgressGETRequest\"B\n RegistryIndexProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"\x88\x01\n#RegistryIndexProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12;\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32-.proto_types.RegistryIndexProgressGETResponse\"2\n\x1eRegistryResponseUnexpectedType\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseUnexpectedTypeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseUnexpectedType\"2\n\x1eRegistryResponseMissingTopKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseMissingTopKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseMissingTopKeys\"5\n!RegistryResponseMissingNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x8a\x01\n$RegistryResponseMissingNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.RegistryResponseMissingNestedKeys\"3\n\x1fRegistryResponseExtraNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x86\x01\n\"RegistryResponseExtraNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryResponseExtraNestedKeys\"(\n\x18\x44\x65psSetDownloadDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\"x\n\x1b\x44\x65psSetDownloadDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsSetDownloadDirectory\"-\n\x0c\x44\x65psUnpinned\x12\x10\n\x08revision\x18\x01 \x01(\t\x12\x0b\n\x03git\x18\x02 \x01(\t\"`\n\x0f\x44\x65psUnpinnedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUnpinned\"/\n\x1bNoNodesForSelectionCriteria\x12\x10\n\x08spec_raw\x18\x01 \x01(\t\"~\n\x1eNoNodesForSelectionCriteriaMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.NoNodesForSelectionCriteria\"*\n\x1bRunningOperationCaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"~\n\x1eRunningOperationCaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RunningOperationCaughtError\"\x11\n\x0f\x43ompileComplete\"f\n\x12\x43ompileCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.CompileComplete\"\x18\n\x16\x46reshnessCheckComplete\"t\n\x19\x46reshnessCheckCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.FreshnessCheckComplete\"\x1c\n\nSeedHeader\x12\x0e\n\x06header\x18\x01 \x01(\t\"\\\n\rSeedHeaderMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SeedHeader\"3\n\x12SQLRunnerException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x02 \x01(\t\"l\n\x15SQLRunnerExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SQLRunnerException\"\xa8\x01\n\rLogTestResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x12\n\nnum_models\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"b\n\x10LogTestResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogTestResult\"k\n\x0cLogStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"`\n\x0fLogStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.LogStartLine\"\x95\x01\n\x0eLogModelResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogModelResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogModelResult\"\xfa\x01\n\x11LogSnapshotResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x34\n\x03\x63\x66g\x18\x07 \x03(\x0b\x32\'.proto_types.LogSnapshotResult.CfgEntry\x1a*\n\x08\x43\x66gEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"j\n\x14LogSnapshotResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.LogSnapshotResult\"\xb9\x01\n\rLogSeedResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x16\n\x0eresult_message\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x10\n\x08relation\x18\x08 \x01(\t\"b\n\x10LogSeedResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogSeedResult\"\xad\x01\n\x12LogFreshnessResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12(\n\tnode_info\x18\x02 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x13\n\x0bsource_name\x18\x06 \x01(\t\x12\x12\n\ntable_name\x18\x07 \x01(\t\"l\n\x15LogFreshnessResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogFreshnessResult\"\"\n\rLogCancelLine\x12\x11\n\tconn_name\x18\x01 \x01(\t\"b\n\x10LogCancelLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogCancelLine\"\x1f\n\x0f\x44\x65\x66\x61ultSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"f\n\x12\x44\x65\x66\x61ultSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DefaultSelector\"5\n\tNodeStart\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"Z\n\x0cNodeStartMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.NodeStart\"g\n\x0cNodeFinished\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12-\n\nrun_result\x18\x02 \x01(\x0b\x32\x19.proto_types.RunResultMsg\"`\n\x0fNodeFinishedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.NodeFinished\"+\n\x1bQueryCancelationUnsupported\x12\x0c\n\x04type\x18\x01 \x01(\t\"~\n\x1eQueryCancelationUnsupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.QueryCancelationUnsupported\"O\n\x0f\x43oncurrencyLine\x12\x13\n\x0bnum_threads\x18\x01 \x01(\x05\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\x12\x12\n\nnode_count\x18\x03 \x01(\x05\"f\n\x12\x43oncurrencyLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ConcurrencyLine\"E\n\x19WritingInjectedSQLForNode\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"z\n\x1cWritingInjectedSQLForNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.WritingInjectedSQLForNode\"9\n\rNodeCompiling\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeCompilingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeCompiling\"9\n\rNodeExecuting\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeExecutingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeExecuting\"m\n\x10LogHookStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"h\n\x13LogHookStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.LogHookStartLine\"\x93\x01\n\x0eLogHookEndLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogHookEndLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogHookEndLine\"\x93\x01\n\x0fSkippingDetails\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\x12\x11\n\tnode_name\x18\x04 \x01(\t\x12\r\n\x05index\x18\x05 \x01(\x05\x12\r\n\x05total\x18\x06 \x01(\x05\"f\n\x12SkippingDetailsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SkippingDetails\"\r\n\x0bNothingToDo\"^\n\x0eNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.NothingToDo\",\n\x1dRunningOperationUncaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"\x82\x01\n RunningOperationUncaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.RunningOperationUncaughtError\"\x93\x01\n\x0c\x45ndRunResult\x12*\n\x07results\x18\x01 \x03(\x0b\x32\x19.proto_types.RunResultMsg\x12\x14\n\x0c\x65lapsed_time\x18\x02 \x01(\x02\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07success\x18\x04 \x01(\x08\"`\n\x0f\x45ndRunResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.EndRunResult\"\x11\n\x0fNoNodesSelected\"f\n\x12NoNodesSelectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.NoNodesSelected\"w\n\x10\x43ommandCompleted\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x65lapsed\x18\x04 \x01(\x02\"h\n\x13\x43ommandCompletedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.CommandCompleted\"k\n\x08ShowNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0f\n\x07preview\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"X\n\x0bShowNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.ShowNode\"p\n\x0c\x43ompiledNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x10\n\x08\x63ompiled\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"`\n\x0f\x43ompiledNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.CompiledNode\"b\n\x17\x43\x61tchableExceptionOnRun\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"v\n\x1a\x43\x61tchableExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.CatchableExceptionOnRun\"5\n\x12InternalErrorOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\"l\n\x15InternalErrorOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InternalErrorOnRun\"K\n\x15GenericExceptionOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"r\n\x18GenericExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.GenericExceptionOnRun\"N\n\x1aNodeConnectionReleaseError\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"|\n\x1dNodeConnectionReleaseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.NodeConnectionReleaseError\"\x1f\n\nFoundStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\"\\\n\rFoundStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.FoundStats\"\x17\n\x15MainKeyboardInterrupt\"r\n\x18MainKeyboardInterruptMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainKeyboardInterrupt\"#\n\x14MainEncounteredError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17MainEncounteredErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MainEncounteredError\"%\n\x0eMainStackTrace\x12\x13\n\x0bstack_trace\x18\x01 \x01(\t\"d\n\x11MainStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainStackTrace\"@\n\x13SystemCouldNotWrite\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"n\n\x16SystemCouldNotWriteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.SystemCouldNotWrite\"!\n\x12SystemExecutingCmd\x12\x0b\n\x03\x63md\x18\x01 \x03(\t\"l\n\x15SystemExecutingCmdMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SystemExecutingCmd\"\x1c\n\x0cSystemStdOut\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdOut\"\x1c\n\x0cSystemStdErr\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdErrMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdErr\",\n\x16SystemReportReturnCode\x12\x12\n\nreturncode\x18\x01 \x01(\x05\"t\n\x19SystemReportReturnCodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.SystemReportReturnCode\"p\n\x13TimingInfoCollected\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12/\n\x0btiming_info\x18\x02 \x01(\x0b\x32\x1a.proto_types.TimingInfoMsg\"n\n\x16TimingInfoCollectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.TimingInfoCollected\"&\n\x12LogDebugStackTrace\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"l\n\x15LogDebugStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDebugStackTrace\"\x1e\n\x0e\x43heckCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43heckCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CheckCleanPath\" \n\x10\x43onfirmCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"h\n\x13\x43onfirmCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConfirmCleanPath\"\"\n\x12ProtectedCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"l\n\x15ProtectedCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ProtectedCleanPath\"\x14\n\x12\x46inishedCleanPaths\"l\n\x15\x46inishedCleanPathsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FinishedCleanPaths\"5\n\x0bOpenCommand\x12\x10\n\x08open_cmd\x18\x01 \x01(\t\x12\x14\n\x0cprofiles_dir\x18\x02 \x01(\t\"^\n\x0eOpenCommandMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.OpenCommand\"\x19\n\nFormatting\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rFormattingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.Formatting\"0\n\x0fServingDocsPort\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"f\n\x12ServingDocsPortMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ServingDocsPort\"%\n\x15ServingDocsAccessInfo\x12\x0c\n\x04port\x18\x01 \x01(\t\"r\n\x18ServingDocsAccessInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ServingDocsAccessInfo\"\x15\n\x13ServingDocsExitInfo\"n\n\x16ServingDocsExitInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.ServingDocsExitInfo\"J\n\x10RunResultWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultWarning\"J\n\x10RunResultFailure\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultFailure\"k\n\tStatsLine\x12\x30\n\x05stats\x18\x01 \x03(\x0b\x32!.proto_types.StatsLine.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"Z\n\x0cStatsLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.StatsLine\"\x1d\n\x0eRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11RunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RunResultError\")\n\x17RunResultErrorNoMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"v\n\x1aRunResultErrorNoMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultErrorNoMessage\"\x1f\n\x0fSQLCompiledPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"f\n\x12SQLCompiledPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SQLCompiledPath\"-\n\x14\x43heckNodeTestFailure\x12\x15\n\rrelation_name\x18\x01 \x01(\t\"p\n\x17\x43heckNodeTestFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.CheckNodeTestFailure\"\"\n\x13\x46irstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"n\n\x16\x46irstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.FirstRunResultError\"\'\n\x18\x41\x66terFirstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"x\n\x1b\x41\x66terFirstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.AfterFirstRunResultError\"W\n\x0f\x45ndOfRunSummary\x12\x12\n\nnum_errors\x18\x01 \x01(\x05\x12\x14\n\x0cnum_warnings\x18\x02 \x01(\x05\x12\x1a\n\x12keyboard_interrupt\x18\x03 \x01(\x08\"f\n\x12\x45ndOfRunSummaryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.EndOfRunSummary\"U\n\x13LogSkipBecauseError\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12\x10\n\x08relation\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"n\n\x16LogSkipBecauseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.LogSkipBecauseError\"\x14\n\x12\x45nsureGitInstalled\"l\n\x15\x45nsureGitInstalledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.EnsureGitInstalled\"\x1a\n\x18\x44\x65psCreatingLocalSymlink\"x\n\x1b\x44\x65psCreatingLocalSymlinkMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsCreatingLocalSymlink\"\x19\n\x17\x44\x65psSymlinkNotAvailable\"v\n\x1a\x44\x65psSymlinkNotAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsSymlinkNotAvailable\"\x11\n\x0f\x44isableTracking\"f\n\x12\x44isableTrackingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DisableTracking\"\x1e\n\x0cSendingEvent\x12\x0e\n\x06kwargs\x18\x01 \x01(\t\"`\n\x0fSendingEventMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SendingEvent\"\x12\n\x10SendEventFailure\"h\n\x13SendEventFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SendEventFailure\"\r\n\x0b\x46lushEvents\"^\n\x0e\x46lushEventsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.FlushEvents\"\x14\n\x12\x46lushEventsFailure\"l\n\x15\x46lushEventsFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FlushEventsFailure\"-\n\x19TrackingInitializeFailure\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"z\n\x1cTrackingInitializeFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.TrackingInitializeFailure\"&\n\x17RunResultWarningMessage\x12\x0b\n\x03msg\x18\x01 \x01(\t\"v\n\x1aRunResultWarningMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultWarningMessage\"\x1a\n\x0b\x44\x65\x62ugCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"^\n\x0e\x44\x65\x62ugCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.DebugCmdOut\"\x1d\n\x0e\x44\x65\x62ugCmdResult\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11\x44\x65\x62ugCmdResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.DebugCmdResult\"\x19\n\nListCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rListCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.ListCmdOut\"\x13\n\x04Note\x12\x0b\n\x03msg\x18\x01 \x01(\t\"P\n\x07NoteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x1f\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x11.proto_types.Noteb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btypes.proto\x12\x0bproto_types\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x02\n\tEventInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\t\x12\x15\n\rinvocation_id\x18\x05 \x01(\t\x12\x0b\n\x03pid\x18\x06 \x01(\x05\x12\x0e\n\x06thread\x18\x07 \x01(\t\x12&\n\x02ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x05\x65xtra\x18\t \x03(\x0b\x32!.proto_types.EventInfo.ExtraEntry\x12\x10\n\x08\x63\x61tegory\x18\n \x01(\t\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x7f\n\rTimingInfoMsg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x0cNodeRelation\x12\x10\n\x08\x64\x61tabase\x18\n \x01(\t\x12\x0e\n\x06schema\x18\x0b \x01(\t\x12\r\n\x05\x61lias\x18\x0c \x01(\t\x12\x15\n\rrelation_name\x18\r \x01(\t\"\x91\x02\n\x08NodeInfo\x12\x11\n\tnode_path\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x11\n\tunique_id\x18\x03 \x01(\t\x12\x15\n\rresource_type\x18\x04 \x01(\t\x12\x14\n\x0cmaterialized\x18\x05 \x01(\t\x12\x13\n\x0bnode_status\x18\x06 \x01(\t\x12\x17\n\x0fnode_started_at\x18\x07 \x01(\t\x12\x18\n\x10node_finished_at\x18\x08 \x01(\t\x12%\n\x04meta\x18\t \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x30\n\rnode_relation\x18\n \x01(\x0b\x32\x19.proto_types.NodeRelation\"\xd1\x01\n\x0cRunResultMsg\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12/\n\x0btiming_info\x18\x03 \x03(\x0b\x32\x1a.proto_types.TimingInfoMsg\x12\x0e\n\x06thread\x18\x04 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x31\n\x10\x61\x64\x61pter_response\x18\x06 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"G\n\x0fReferenceKeyMsg\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x12\n\nidentifier\x18\x03 \x01(\t\"6\n\x0eGenericMessage\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\"9\n\x11MainReportVersion\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0blog_version\x18\x02 \x01(\x05\"j\n\x14MainReportVersionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.MainReportVersion\"r\n\x0eMainReportArgs\x12\x33\n\x04\x61rgs\x18\x01 \x03(\x0b\x32%.proto_types.MainReportArgs.ArgsEntry\x1a+\n\tArgsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11MainReportArgsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainReportArgs\"+\n\x15MainTrackingUserState\x12\x12\n\nuser_state\x18\x01 \x01(\t\"r\n\x18MainTrackingUserStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainTrackingUserState\"5\n\x0fMergedFromState\x12\x12\n\nnum_merged\x18\x01 \x01(\x05\x12\x0e\n\x06sample\x18\x02 \x03(\t\"f\n\x12MergedFromStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.MergedFromState\"A\n\x14MissingProfileTarget\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\"p\n\x17MissingProfileTargetMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MissingProfileTarget\"(\n\x11InvalidOptionYAML\x12\x13\n\x0boption_name\x18\x01 \x01(\t\"j\n\x14InvalidOptionYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.InvalidOptionYAML\"!\n\x12LogDbtProjectError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15LogDbtProjectErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProjectError\"3\n\x12LogDbtProfileError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08profiles\x18\x02 \x03(\t\"l\n\x15LogDbtProfileErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProfileError\"!\n\x12StarterProjectPath\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"l\n\x15StarterProjectPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StarterProjectPath\"$\n\x15\x43onfigFolderDirectory\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"r\n\x18\x43onfigFolderDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConfigFolderDirectory\"\'\n\x14NoSampleProfileFound\x12\x0f\n\x07\x61\x64\x61pter\x18\x01 \x01(\t\"p\n\x17NoSampleProfileFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NoSampleProfileFound\"6\n\x18ProfileWrittenWithSample\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"x\n\x1bProfileWrittenWithSampleMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProfileWrittenWithSample\"B\n$ProfileWrittenWithTargetTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x90\x01\n\'ProfileWrittenWithTargetTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.ProfileWrittenWithTargetTemplateYAML\"C\n%ProfileWrittenWithProjectTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x92\x01\n(ProfileWrittenWithProjectTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.ProfileWrittenWithProjectTemplateYAML\"\x12\n\x10SettingUpProfile\"h\n\x13SettingUpProfileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SettingUpProfile\"\x1c\n\x1aInvalidProfileTemplateYAML\"|\n\x1dInvalidProfileTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.InvalidProfileTemplateYAML\"(\n\x18ProjectNameAlreadyExists\x12\x0c\n\x04name\x18\x01 \x01(\t\"x\n\x1bProjectNameAlreadyExistsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProjectNameAlreadyExists\"K\n\x0eProjectCreated\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocs_url\x18\x02 \x01(\t\x12\x11\n\tslack_url\x18\x03 \x01(\t\"d\n\x11ProjectCreatedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ProjectCreated\"@\n\x1aPackageRedirectDeprecation\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1dPackageRedirectDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PackageRedirectDeprecation\"\x1f\n\x1dPackageInstallPathDeprecation\"\x82\x01\n PackageInstallPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.PackageInstallPathDeprecation\"H\n\x1b\x43onfigSourcePathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"~\n\x1e\x43onfigSourcePathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigSourcePathDeprecation\"F\n\x19\x43onfigDataPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"z\n\x1c\x43onfigDataPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConfigDataPathDeprecation\"?\n\x19\x41\x64\x61pterDeprecationWarning\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"z\n\x1c\x41\x64\x61pterDeprecationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.AdapterDeprecationWarning\".\n\x17MetricAttributesRenamed\x12\x13\n\x0bmetric_name\x18\x01 \x01(\t\"v\n\x1aMetricAttributesRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.MetricAttributesRenamed\"+\n\x17\x45xposureNameDeprecation\x12\x10\n\x08\x65xposure\x18\x01 \x01(\t\"v\n\x1a\x45xposureNameDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.ExposureNameDeprecation\"^\n\x13InternalDeprecation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x18\n\x10suggested_action\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\"n\n\x16InternalDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.InternalDeprecation\"@\n\x1a\x45nvironmentVariableRenamed\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1d\x45nvironmentVariableRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.EnvironmentVariableRenamed\"3\n\x18\x43onfigLogPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"x\n\x1b\x43onfigLogPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ConfigLogPathDeprecation\"6\n\x1b\x43onfigTargetPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"~\n\x1e\x43onfigTargetPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigTargetPathDeprecation\"!\n\x1f\x43ollectFreshnessReturnSignature\"\x86\x01\n\"CollectFreshnessReturnSignatureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.CollectFreshnessReturnSignature\"\x87\x01\n\x11\x41\x64\x61pterEventDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"j\n\x14\x41\x64\x61pterEventDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventDebug\"\x86\x01\n\x10\x41\x64\x61pterEventInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"h\n\x13\x41\x64\x61pterEventInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.AdapterEventInfo\"\x89\x01\n\x13\x41\x64\x61pterEventWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"n\n\x16\x41\x64\x61pterEventWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.AdapterEventWarning\"\x99\x01\n\x11\x41\x64\x61pterEventError\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\x12\x10\n\x08\x65xc_info\x18\x05 \x01(\t\"j\n\x14\x41\x64\x61pterEventErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventError\"_\n\rNewConnection\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"b\n\x10NewConnectionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NewConnection\"=\n\x10\x43onnectionReused\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x16\n\x0eorig_conn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionReusedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionReused\"0\n\x1b\x43onnectionLeftOpenInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"~\n\x1e\x43onnectionLeftOpenInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConnectionLeftOpenInCleanup\".\n\x19\x43onnectionClosedInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"z\n\x1c\x43onnectionClosedInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConnectionClosedInCleanup\"_\n\x0eRollbackFailed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"d\n\x11RollbackFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RollbackFailed\"O\n\x10\x43onnectionClosed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionClosedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionClosed\"Q\n\x12\x43onnectionLeftOpen\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"l\n\x15\x43onnectionLeftOpenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ConnectionLeftOpen\"G\n\x08Rollback\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"X\n\x0bRollbackMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.Rollback\"@\n\tCacheMiss\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\"Z\n\x0c\x43\x61\x63heMissMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.CacheMiss\"b\n\rListRelations\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12/\n\trelations\x18\x03 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10ListRelationsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ListRelations\"`\n\x0e\x43onnectionUsed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"d\n\x11\x43onnectionUsedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ConnectionUsed\"T\n\x08SQLQuery\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x0b\n\x03sql\x18\x03 \x01(\t\"X\n\x0bSQLQueryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.SQLQuery\"[\n\x0eSQLQueryStatus\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x03 \x01(\x02\"d\n\x11SQLQueryStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SQLQueryStatus\"H\n\tSQLCommit\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"Z\n\x0cSQLCommitMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.SQLCommit\"a\n\rColTypeChange\x12\x11\n\torig_type\x18\x01 \x01(\t\x12\x10\n\x08new_type\x18\x02 \x01(\t\x12+\n\x05table\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10\x43olTypeChangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ColTypeChange\"@\n\x0eSchemaCreation\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"d\n\x11SchemaCreationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SchemaCreation\"<\n\nSchemaDrop\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"\\\n\rSchemaDropMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SchemaDrop\"\xde\x01\n\x0b\x43\x61\x63heAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12-\n\x07ref_key\x18\x02 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_2\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_3\x18\x04 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12.\n\x08ref_list\x18\x05 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"^\n\x0e\x43\x61\x63heActionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.CacheAction\"\x98\x01\n\x0e\x43\x61\x63heDumpGraph\x12\x33\n\x04\x64ump\x18\x01 \x03(\x0b\x32%.proto_types.CacheDumpGraph.DumpEntry\x12\x14\n\x0c\x62\x65\x66ore_after\x18\x02 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\t\x1a+\n\tDumpEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11\x43\x61\x63heDumpGraphMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CacheDumpGraph\"!\n\x12\x41\x64\x61pterImportError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15\x41\x64\x61pterImportErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.AdapterImportError\"#\n\x0fPluginLoadError\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"f\n\x12PluginLoadErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.PluginLoadError\"Z\n\x14NewConnectionOpening\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x18\n\x10\x63onnection_state\x18\x02 \x01(\t\"p\n\x17NewConnectionOpeningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NewConnectionOpening\"8\n\rCodeExecution\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ode_content\x18\x02 \x01(\t\"b\n\x10\x43odeExecutionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.CodeExecution\"6\n\x13\x43odeExecutionStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x02 \x01(\x02\"n\n\x16\x43odeExecutionStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.CodeExecutionStatus\"%\n\x16\x43\x61talogGenerationError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"t\n\x19\x43\x61talogGenerationErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.CatalogGenerationError\"-\n\x13WriteCatalogFailure\x12\x16\n\x0enum_exceptions\x18\x01 \x01(\x05\"n\n\x16WriteCatalogFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.WriteCatalogFailure\"\x1e\n\x0e\x43\x61talogWritten\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43\x61talogWrittenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CatalogWritten\"\x14\n\x12\x43\x61nnotGenerateDocs\"l\n\x15\x43\x61nnotGenerateDocsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.CannotGenerateDocs\"\x11\n\x0f\x42uildingCatalog\"f\n\x12\x42uildingCatalogMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.BuildingCatalog\"-\n\x18\x44\x61tabaseErrorRunningHook\x12\x11\n\thook_type\x18\x01 \x01(\t\"x\n\x1b\x44\x61tabaseErrorRunningHookMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DatabaseErrorRunningHook\"4\n\x0cHooksRunning\x12\x11\n\tnum_hooks\x18\x01 \x01(\x05\x12\x11\n\thook_type\x18\x02 \x01(\t\"`\n\x0fHooksRunningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.HooksRunning\"T\n\x14\x46inishedRunningStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\x12\x11\n\texecution\x18\x02 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x03 \x01(\x02\"p\n\x17\x46inishedRunningStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.FinishedRunningStats\"<\n\x15\x43onstraintNotEnforced\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"r\n\x18\x43onstraintNotEnforcedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConstraintNotEnforced\"=\n\x16\x43onstraintNotSupported\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"t\n\x19\x43onstraintNotSupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.ConstraintNotSupported\"7\n\x12InputFileDiffError\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x02 \x01(\t\"l\n\x15InputFileDiffErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InputFileDiffError\"t\n\x1aPublicationArtifactChanged\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"|\n\x1dPublicationArtifactChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PublicationArtifactChanged\"?\n\x14InvalidValueForField\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x13\n\x0b\x66ield_value\x18\x02 \x01(\t\"p\n\x17InvalidValueForFieldMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.InvalidValueForField\"Q\n\x11ValidationWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x11\n\tnode_name\x18\x03 \x01(\t\"j\n\x14ValidationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ValidationWarning\"!\n\x11ParsePerfInfoPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"j\n\x14ParsePerfInfoPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ParsePerfInfoPath\"1\n!PartialParsingErrorProcessingFile\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\"\x8a\x01\n$PartialParsingErrorProcessingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.PartialParsingErrorProcessingFile\"\x86\x01\n\x13PartialParsingError\x12?\n\x08\x65xc_info\x18\x01 \x03(\x0b\x32-.proto_types.PartialParsingError.ExcInfoEntry\x1a.\n\x0c\x45xcInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"n\n\x16PartialParsingErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.PartialParsingError\"\x1b\n\x19PartialParsingSkipParsing\"z\n\x1cPartialParsingSkipParsingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.PartialParsingSkipParsing\"&\n\x14UnableToPartialParse\x12\x0e\n\x06reason\x18\x01 \x01(\t\"p\n\x17UnableToPartialParseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.UnableToPartialParse\"f\n\x12StateCheckVarsHash\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\x12\x0c\n\x04vars\x18\x02 \x01(\t\x12\x0f\n\x07profile\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\"l\n\x15StateCheckVarsHashMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StateCheckVarsHash\"\x1a\n\x18PartialParsingNotEnabled\"x\n\x1bPartialParsingNotEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.PartialParsingNotEnabled\"C\n\x14ParsedFileLoadFailed\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"p\n\x17ParsedFileLoadFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.ParsedFileLoadFailed\"H\n\x15PartialParsingEnabled\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x05\x12\r\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x05\x12\x0f\n\x07\x63hanged\x18\x03 \x01(\x05\"r\n\x18PartialParsingEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.PartialParsingEnabled\"8\n\x12PartialParsingFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\"l\n\x15PartialParsingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.PartialParsingFile\"\xaf\x01\n\x1fInvalidDisabledTargetInTestNode\x12\x1b\n\x13resource_type_title\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1a\n\x12original_file_path\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\x12\x13\n\x0btarget_name\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\"\x86\x01\n\"InvalidDisabledTargetInTestNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.InvalidDisabledTargetInTestNode\"7\n\x18UnusedResourceConfigPath\x12\x1b\n\x13unused_config_paths\x18\x01 \x03(\t\"x\n\x1bUnusedResourceConfigPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.UnusedResourceConfigPath\"3\n\rSeedIncreased\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"b\n\x10SeedIncreasedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.SeedIncreased\">\n\x18SeedExceedsLimitSamePath\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"x\n\x1bSeedExceedsLimitSamePathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.SeedExceedsLimitSamePath\"D\n\x1eSeedExceedsLimitAndPathChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x84\x01\n!SeedExceedsLimitAndPathChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.SeedExceedsLimitAndPathChanged\"\\\n\x1fSeedExceedsLimitChecksumChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rchecksum_name\x18\x03 \x01(\t\"\x86\x01\n\"SeedExceedsLimitChecksumChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.SeedExceedsLimitChecksumChanged\"%\n\x0cUnusedTables\x12\x15\n\runused_tables\x18\x01 \x03(\t\"`\n\x0fUnusedTablesMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.UnusedTables\"\x87\x01\n\x17WrongResourceSchemaFile\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x1c\n\x14plural_resource_type\x18\x03 \x01(\t\x12\x10\n\x08yaml_key\x18\x04 \x01(\t\x12\x11\n\tfile_path\x18\x05 \x01(\t\"v\n\x1aWrongResourceSchemaFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.WrongResourceSchemaFile\"K\n\x10NoNodeForYamlKey\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x10\n\x08yaml_key\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x03 \x01(\t\"h\n\x13NoNodeForYamlKeyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.NoNodeForYamlKey\"+\n\x15MacroNotFoundForPatch\x12\x12\n\npatch_name\x18\x01 \x01(\t\"r\n\x18MacroNotFoundForPatchMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MacroNotFoundForPatch\"\xb8\x01\n\x16NodeNotFoundOrDisabled\x12\x1a\n\x12original_file_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1b\n\x13resource_type_title\x18\x03 \x01(\t\x12\x13\n\x0btarget_name\x18\x04 \x01(\t\x12\x13\n\x0btarget_kind\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\x12\x10\n\x08\x64isabled\x18\x07 \x01(\t\"t\n\x19NodeNotFoundOrDisabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.NodeNotFoundOrDisabled\"H\n\x0fJinjaLogWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"f\n\x12JinjaLogWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.JinjaLogWarning\"E\n\x0cJinjaLogInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"`\n\x0fJinjaLogInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.JinjaLogInfo\"F\n\rJinjaLogDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"b\n\x10JinjaLogDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.JinjaLogDebug\"\xae\x01\n\x1eUnpinnedRefNewVersionAvailable\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rref_node_name\x18\x02 \x01(\t\x12\x18\n\x10ref_node_package\x18\x03 \x01(\t\x12\x18\n\x10ref_node_version\x18\x04 \x01(\t\x12\x17\n\x0fref_max_version\x18\x05 \x01(\t\"\x84\x01\n!UnpinnedRefNewVersionAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.UnpinnedRefNewVersionAvailable\"V\n\x0f\x44\x65precatedModel\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\x18\n\x10\x64\x65precation_date\x18\x03 \x01(\t\"f\n\x12\x44\x65precatedModelMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DeprecatedModel\"\xc6\x01\n\x1cUpcomingReferenceDeprecation\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"\x80\x01\n\x1fUpcomingReferenceDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.UpcomingReferenceDeprecation\"\xbd\x01\n\x13\x44\x65precatedReference\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"n\n\x16\x44\x65precatedReferenceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DeprecatedReference\"/\n\x1dGitSparseCheckoutSubdirectory\x12\x0e\n\x06subdir\x18\x01 \x01(\t\"\x82\x01\n GitSparseCheckoutSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.GitSparseCheckoutSubdirectory\"/\n\x1bGitProgressCheckoutRevision\x12\x10\n\x08revision\x18\x01 \x01(\t\"~\n\x1eGitProgressCheckoutRevisionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.GitProgressCheckoutRevision\"4\n%GitProgressUpdatingExistingDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x92\x01\n(GitProgressUpdatingExistingDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.GitProgressUpdatingExistingDependency\".\n\x1fGitProgressPullingNewDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x86\x01\n\"GitProgressPullingNewDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressPullingNewDependency\"\x1d\n\x0eGitNothingToDo\x12\x0b\n\x03sha\x18\x01 \x01(\t\"d\n\x11GitNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.GitNothingToDo\"E\n\x1fGitProgressUpdatedCheckoutRange\x12\x11\n\tstart_sha\x18\x01 \x01(\t\x12\x0f\n\x07\x65nd_sha\x18\x02 \x01(\t\"\x86\x01\n\"GitProgressUpdatedCheckoutRangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressUpdatedCheckoutRange\"*\n\x17GitProgressCheckedOutAt\x12\x0f\n\x07\x65nd_sha\x18\x01 \x01(\t\"v\n\x1aGitProgressCheckedOutAtMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.GitProgressCheckedOutAt\")\n\x1aRegistryProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"|\n\x1dRegistryProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.RegistryProgressGETRequest\"=\n\x1bRegistryProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"~\n\x1eRegistryProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RegistryProgressGETResponse\"_\n\x1dSelectorReportInvalidSelector\x12\x17\n\x0fvalid_selectors\x18\x01 \x01(\t\x12\x13\n\x0bspec_method\x18\x02 \x01(\t\x12\x10\n\x08raw_spec\x18\x03 \x01(\t\"\x82\x01\n SelectorReportInvalidSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.SelectorReportInvalidSelector\"\x15\n\x13\x44\x65psNoPackagesFound\"n\n\x16\x44\x65psNoPackagesFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsNoPackagesFound\"/\n\x17\x44\x65psStartPackageInstall\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\"v\n\x1a\x44\x65psStartPackageInstallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsStartPackageInstall\"\'\n\x0f\x44\x65psInstallInfo\x12\x14\n\x0cversion_name\x18\x01 \x01(\t\"f\n\x12\x44\x65psInstallInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DepsInstallInfo\"-\n\x13\x44\x65psUpdateAvailable\x12\x16\n\x0eversion_latest\x18\x01 \x01(\t\"n\n\x16\x44\x65psUpdateAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsUpdateAvailable\"\x0e\n\x0c\x44\x65psUpToDate\"`\n\x0f\x44\x65psUpToDateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUpToDate\",\n\x14\x44\x65psListSubdirectory\x12\x14\n\x0csubdirectory\x18\x01 \x01(\t\"p\n\x17\x44\x65psListSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.DepsListSubdirectory\".\n\x1a\x44\x65psNotifyUpdatesAvailable\x12\x10\n\x08packages\x18\x01 \x03(\t\"|\n\x1d\x44\x65psNotifyUpdatesAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.DepsNotifyUpdatesAvailable\"1\n\x11RetryExternalCall\x12\x0f\n\x07\x61ttempt\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"j\n\x14RetryExternalCallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.RetryExternalCall\"#\n\x14RecordRetryException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17RecordRetryExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.RecordRetryException\".\n\x1fRegistryIndexProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"\x86\x01\n\"RegistryIndexProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryIndexProgressGETRequest\"B\n RegistryIndexProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"\x88\x01\n#RegistryIndexProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12;\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32-.proto_types.RegistryIndexProgressGETResponse\"2\n\x1eRegistryResponseUnexpectedType\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseUnexpectedTypeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseUnexpectedType\"2\n\x1eRegistryResponseMissingTopKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseMissingTopKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseMissingTopKeys\"5\n!RegistryResponseMissingNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x8a\x01\n$RegistryResponseMissingNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.RegistryResponseMissingNestedKeys\"3\n\x1fRegistryResponseExtraNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x86\x01\n\"RegistryResponseExtraNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryResponseExtraNestedKeys\"(\n\x18\x44\x65psSetDownloadDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\"x\n\x1b\x44\x65psSetDownloadDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsSetDownloadDirectory\"-\n\x0c\x44\x65psUnpinned\x12\x10\n\x08revision\x18\x01 \x01(\t\x12\x0b\n\x03git\x18\x02 \x01(\t\"`\n\x0f\x44\x65psUnpinnedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUnpinned\"/\n\x1bNoNodesForSelectionCriteria\x12\x10\n\x08spec_raw\x18\x01 \x01(\t\"~\n\x1eNoNodesForSelectionCriteriaMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.NoNodesForSelectionCriteria\"M\n\x1cPublicationArtifactAvailable\x12-\n\x0cpub_artifact\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\"\x80\x01\n\x1fPublicationArtifactAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.PublicationArtifactAvailable\"*\n\x1bRunningOperationCaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"~\n\x1eRunningOperationCaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RunningOperationCaughtError\"\x11\n\x0f\x43ompileComplete\"f\n\x12\x43ompileCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.CompileComplete\"\x18\n\x16\x46reshnessCheckComplete\"t\n\x19\x46reshnessCheckCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.FreshnessCheckComplete\"\x1c\n\nSeedHeader\x12\x0e\n\x06header\x18\x01 \x01(\t\"\\\n\rSeedHeaderMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SeedHeader\"3\n\x12SQLRunnerException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x02 \x01(\t\"l\n\x15SQLRunnerExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SQLRunnerException\"\xa8\x01\n\rLogTestResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x12\n\nnum_models\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"b\n\x10LogTestResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogTestResult\"k\n\x0cLogStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"`\n\x0fLogStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.LogStartLine\"\x95\x01\n\x0eLogModelResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogModelResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogModelResult\"\xfa\x01\n\x11LogSnapshotResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x34\n\x03\x63\x66g\x18\x07 \x03(\x0b\x32\'.proto_types.LogSnapshotResult.CfgEntry\x1a*\n\x08\x43\x66gEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"j\n\x14LogSnapshotResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.LogSnapshotResult\"\xb9\x01\n\rLogSeedResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x16\n\x0eresult_message\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x10\n\x08relation\x18\x08 \x01(\t\"b\n\x10LogSeedResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogSeedResult\"\xad\x01\n\x12LogFreshnessResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12(\n\tnode_info\x18\x02 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x13\n\x0bsource_name\x18\x06 \x01(\t\x12\x12\n\ntable_name\x18\x07 \x01(\t\"l\n\x15LogFreshnessResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogFreshnessResult\"\"\n\rLogCancelLine\x12\x11\n\tconn_name\x18\x01 \x01(\t\"b\n\x10LogCancelLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogCancelLine\"\x1f\n\x0f\x44\x65\x66\x61ultSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"f\n\x12\x44\x65\x66\x61ultSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DefaultSelector\"5\n\tNodeStart\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"Z\n\x0cNodeStartMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.NodeStart\"g\n\x0cNodeFinished\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12-\n\nrun_result\x18\x02 \x01(\x0b\x32\x19.proto_types.RunResultMsg\"`\n\x0fNodeFinishedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.NodeFinished\"+\n\x1bQueryCancelationUnsupported\x12\x0c\n\x04type\x18\x01 \x01(\t\"~\n\x1eQueryCancelationUnsupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.QueryCancelationUnsupported\"O\n\x0f\x43oncurrencyLine\x12\x13\n\x0bnum_threads\x18\x01 \x01(\x05\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\x12\x12\n\nnode_count\x18\x03 \x01(\x05\"f\n\x12\x43oncurrencyLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ConcurrencyLine\"E\n\x19WritingInjectedSQLForNode\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"z\n\x1cWritingInjectedSQLForNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.WritingInjectedSQLForNode\"9\n\rNodeCompiling\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeCompilingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeCompiling\"9\n\rNodeExecuting\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeExecutingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeExecuting\"m\n\x10LogHookStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"h\n\x13LogHookStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.LogHookStartLine\"\x93\x01\n\x0eLogHookEndLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogHookEndLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogHookEndLine\"\x93\x01\n\x0fSkippingDetails\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\x12\x11\n\tnode_name\x18\x04 \x01(\t\x12\r\n\x05index\x18\x05 \x01(\x05\x12\r\n\x05total\x18\x06 \x01(\x05\"f\n\x12SkippingDetailsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SkippingDetails\"\r\n\x0bNothingToDo\"^\n\x0eNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.NothingToDo\",\n\x1dRunningOperationUncaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"\x82\x01\n RunningOperationUncaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.RunningOperationUncaughtError\"\x93\x01\n\x0c\x45ndRunResult\x12*\n\x07results\x18\x01 \x03(\x0b\x32\x19.proto_types.RunResultMsg\x12\x14\n\x0c\x65lapsed_time\x18\x02 \x01(\x02\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07success\x18\x04 \x01(\x08\"`\n\x0f\x45ndRunResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.EndRunResult\"\x11\n\x0fNoNodesSelected\"f\n\x12NoNodesSelectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.NoNodesSelected\"w\n\x10\x43ommandCompleted\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x65lapsed\x18\x04 \x01(\x02\"h\n\x13\x43ommandCompletedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.CommandCompleted\"k\n\x08ShowNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0f\n\x07preview\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"X\n\x0bShowNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.ShowNode\"p\n\x0c\x43ompiledNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x10\n\x08\x63ompiled\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"`\n\x0f\x43ompiledNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.CompiledNode\"b\n\x17\x43\x61tchableExceptionOnRun\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"v\n\x1a\x43\x61tchableExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.CatchableExceptionOnRun\"5\n\x12InternalErrorOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\"l\n\x15InternalErrorOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InternalErrorOnRun\"K\n\x15GenericExceptionOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"r\n\x18GenericExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.GenericExceptionOnRun\"N\n\x1aNodeConnectionReleaseError\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"|\n\x1dNodeConnectionReleaseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.NodeConnectionReleaseError\"\x1f\n\nFoundStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\"\\\n\rFoundStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.FoundStats\"\x17\n\x15MainKeyboardInterrupt\"r\n\x18MainKeyboardInterruptMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainKeyboardInterrupt\"#\n\x14MainEncounteredError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17MainEncounteredErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MainEncounteredError\"%\n\x0eMainStackTrace\x12\x13\n\x0bstack_trace\x18\x01 \x01(\t\"d\n\x11MainStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainStackTrace\"@\n\x13SystemCouldNotWrite\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"n\n\x16SystemCouldNotWriteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.SystemCouldNotWrite\"!\n\x12SystemExecutingCmd\x12\x0b\n\x03\x63md\x18\x01 \x03(\t\"l\n\x15SystemExecutingCmdMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SystemExecutingCmd\"\x1c\n\x0cSystemStdOut\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdOut\"\x1c\n\x0cSystemStdErr\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdErrMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdErr\",\n\x16SystemReportReturnCode\x12\x12\n\nreturncode\x18\x01 \x01(\x05\"t\n\x19SystemReportReturnCodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.SystemReportReturnCode\"p\n\x13TimingInfoCollected\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12/\n\x0btiming_info\x18\x02 \x01(\x0b\x32\x1a.proto_types.TimingInfoMsg\"n\n\x16TimingInfoCollectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.TimingInfoCollected\"&\n\x12LogDebugStackTrace\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"l\n\x15LogDebugStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDebugStackTrace\"\x1e\n\x0e\x43heckCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43heckCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CheckCleanPath\" \n\x10\x43onfirmCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"h\n\x13\x43onfirmCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConfirmCleanPath\"\"\n\x12ProtectedCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"l\n\x15ProtectedCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ProtectedCleanPath\"\x14\n\x12\x46inishedCleanPaths\"l\n\x15\x46inishedCleanPathsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FinishedCleanPaths\"5\n\x0bOpenCommand\x12\x10\n\x08open_cmd\x18\x01 \x01(\t\x12\x14\n\x0cprofiles_dir\x18\x02 \x01(\t\"^\n\x0eOpenCommandMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.OpenCommand\"\x19\n\nFormatting\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rFormattingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.Formatting\"0\n\x0fServingDocsPort\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"f\n\x12ServingDocsPortMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ServingDocsPort\"%\n\x15ServingDocsAccessInfo\x12\x0c\n\x04port\x18\x01 \x01(\t\"r\n\x18ServingDocsAccessInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ServingDocsAccessInfo\"\x15\n\x13ServingDocsExitInfo\"n\n\x16ServingDocsExitInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.ServingDocsExitInfo\"J\n\x10RunResultWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultWarning\"J\n\x10RunResultFailure\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultFailure\"k\n\tStatsLine\x12\x30\n\x05stats\x18\x01 \x03(\x0b\x32!.proto_types.StatsLine.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"Z\n\x0cStatsLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.StatsLine\"\x1d\n\x0eRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11RunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RunResultError\")\n\x17RunResultErrorNoMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"v\n\x1aRunResultErrorNoMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultErrorNoMessage\"\x1f\n\x0fSQLCompiledPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"f\n\x12SQLCompiledPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SQLCompiledPath\"-\n\x14\x43heckNodeTestFailure\x12\x15\n\rrelation_name\x18\x01 \x01(\t\"p\n\x17\x43heckNodeTestFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.CheckNodeTestFailure\"\"\n\x13\x46irstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"n\n\x16\x46irstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.FirstRunResultError\"\'\n\x18\x41\x66terFirstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"x\n\x1b\x41\x66terFirstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.AfterFirstRunResultError\"W\n\x0f\x45ndOfRunSummary\x12\x12\n\nnum_errors\x18\x01 \x01(\x05\x12\x14\n\x0cnum_warnings\x18\x02 \x01(\x05\x12\x1a\n\x12keyboard_interrupt\x18\x03 \x01(\x08\"f\n\x12\x45ndOfRunSummaryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.EndOfRunSummary\"U\n\x13LogSkipBecauseError\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12\x10\n\x08relation\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"n\n\x16LogSkipBecauseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.LogSkipBecauseError\"\x14\n\x12\x45nsureGitInstalled\"l\n\x15\x45nsureGitInstalledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.EnsureGitInstalled\"\x1a\n\x18\x44\x65psCreatingLocalSymlink\"x\n\x1b\x44\x65psCreatingLocalSymlinkMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsCreatingLocalSymlink\"\x19\n\x17\x44\x65psSymlinkNotAvailable\"v\n\x1a\x44\x65psSymlinkNotAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsSymlinkNotAvailable\"\x11\n\x0f\x44isableTracking\"f\n\x12\x44isableTrackingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DisableTracking\"\x1e\n\x0cSendingEvent\x12\x0e\n\x06kwargs\x18\x01 \x01(\t\"`\n\x0fSendingEventMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SendingEvent\"\x12\n\x10SendEventFailure\"h\n\x13SendEventFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SendEventFailure\"\r\n\x0b\x46lushEvents\"^\n\x0e\x46lushEventsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.FlushEvents\"\x14\n\x12\x46lushEventsFailure\"l\n\x15\x46lushEventsFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FlushEventsFailure\"-\n\x19TrackingInitializeFailure\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"z\n\x1cTrackingInitializeFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.TrackingInitializeFailure\"&\n\x17RunResultWarningMessage\x12\x0b\n\x03msg\x18\x01 \x01(\t\"v\n\x1aRunResultWarningMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultWarningMessage\"\x1a\n\x0b\x44\x65\x62ugCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"^\n\x0e\x44\x65\x62ugCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.DebugCmdOut\"\x1d\n\x0e\x44\x65\x62ugCmdResult\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11\x44\x65\x62ugCmdResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.DebugCmdResult\"\x19\n\nListCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rListCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.ListCmdOut\"\x13\n\x04Note\x12\x0b\n\x03msg\x18\x01 \x01(\t\"P\n\x07NoteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x1f\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x11.proto_types.Noteb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'types_pb2', globals()) @@ -568,324 +568,328 @@ _NONODESFORSELECTIONCRITERIA._serialized_end=24771 _NONODESFORSELECTIONCRITERIAMSG._serialized_start=24773 _NONODESFORSELECTIONCRITERIAMSG._serialized_end=24899 - _RUNNINGOPERATIONCAUGHTERROR._serialized_start=24901 - _RUNNINGOPERATIONCAUGHTERROR._serialized_end=24943 - _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_start=24945 - _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_end=25071 - _COMPILECOMPLETE._serialized_start=25073 - _COMPILECOMPLETE._serialized_end=25090 - _COMPILECOMPLETEMSG._serialized_start=25092 - _COMPILECOMPLETEMSG._serialized_end=25194 - _FRESHNESSCHECKCOMPLETE._serialized_start=25196 - _FRESHNESSCHECKCOMPLETE._serialized_end=25220 - _FRESHNESSCHECKCOMPLETEMSG._serialized_start=25222 - _FRESHNESSCHECKCOMPLETEMSG._serialized_end=25338 - _SEEDHEADER._serialized_start=25340 - _SEEDHEADER._serialized_end=25368 - _SEEDHEADERMSG._serialized_start=25370 - _SEEDHEADERMSG._serialized_end=25462 - _SQLRUNNEREXCEPTION._serialized_start=25464 - _SQLRUNNEREXCEPTION._serialized_end=25515 - _SQLRUNNEREXCEPTIONMSG._serialized_start=25517 - _SQLRUNNEREXCEPTIONMSG._serialized_end=25625 - _LOGTESTRESULT._serialized_start=25628 - _LOGTESTRESULT._serialized_end=25796 - _LOGTESTRESULTMSG._serialized_start=25798 - _LOGTESTRESULTMSG._serialized_end=25896 - _LOGSTARTLINE._serialized_start=25898 - _LOGSTARTLINE._serialized_end=26005 - _LOGSTARTLINEMSG._serialized_start=26007 - _LOGSTARTLINEMSG._serialized_end=26103 - _LOGMODELRESULT._serialized_start=26106 - _LOGMODELRESULT._serialized_end=26255 - _LOGMODELRESULTMSG._serialized_start=26257 - _LOGMODELRESULTMSG._serialized_end=26357 - _LOGSNAPSHOTRESULT._serialized_start=26360 - _LOGSNAPSHOTRESULT._serialized_end=26610 - _LOGSNAPSHOTRESULT_CFGENTRY._serialized_start=26568 - _LOGSNAPSHOTRESULT_CFGENTRY._serialized_end=26610 - _LOGSNAPSHOTRESULTMSG._serialized_start=26612 - _LOGSNAPSHOTRESULTMSG._serialized_end=26718 - _LOGSEEDRESULT._serialized_start=26721 - _LOGSEEDRESULT._serialized_end=26906 - _LOGSEEDRESULTMSG._serialized_start=26908 - _LOGSEEDRESULTMSG._serialized_end=27006 - _LOGFRESHNESSRESULT._serialized_start=27009 - _LOGFRESHNESSRESULT._serialized_end=27182 - _LOGFRESHNESSRESULTMSG._serialized_start=27184 - _LOGFRESHNESSRESULTMSG._serialized_end=27292 - _LOGCANCELLINE._serialized_start=27294 - _LOGCANCELLINE._serialized_end=27328 - _LOGCANCELLINEMSG._serialized_start=27330 - _LOGCANCELLINEMSG._serialized_end=27428 - _DEFAULTSELECTOR._serialized_start=27430 - _DEFAULTSELECTOR._serialized_end=27461 - _DEFAULTSELECTORMSG._serialized_start=27463 - _DEFAULTSELECTORMSG._serialized_end=27565 - _NODESTART._serialized_start=27567 - _NODESTART._serialized_end=27620 - _NODESTARTMSG._serialized_start=27622 - _NODESTARTMSG._serialized_end=27712 - _NODEFINISHED._serialized_start=27714 - _NODEFINISHED._serialized_end=27817 - _NODEFINISHEDMSG._serialized_start=27819 - _NODEFINISHEDMSG._serialized_end=27915 - _QUERYCANCELATIONUNSUPPORTED._serialized_start=27917 - _QUERYCANCELATIONUNSUPPORTED._serialized_end=27960 - _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_start=27962 - _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_end=28088 - _CONCURRENCYLINE._serialized_start=28090 - _CONCURRENCYLINE._serialized_end=28169 - _CONCURRENCYLINEMSG._serialized_start=28171 - _CONCURRENCYLINEMSG._serialized_end=28273 - _WRITINGINJECTEDSQLFORNODE._serialized_start=28275 - _WRITINGINJECTEDSQLFORNODE._serialized_end=28344 - _WRITINGINJECTEDSQLFORNODEMSG._serialized_start=28346 - _WRITINGINJECTEDSQLFORNODEMSG._serialized_end=28468 - _NODECOMPILING._serialized_start=28470 - _NODECOMPILING._serialized_end=28527 - _NODECOMPILINGMSG._serialized_start=28529 - _NODECOMPILINGMSG._serialized_end=28627 - _NODEEXECUTING._serialized_start=28629 - _NODEEXECUTING._serialized_end=28686 - _NODEEXECUTINGMSG._serialized_start=28688 - _NODEEXECUTINGMSG._serialized_end=28786 - _LOGHOOKSTARTLINE._serialized_start=28788 - _LOGHOOKSTARTLINE._serialized_end=28897 - _LOGHOOKSTARTLINEMSG._serialized_start=28899 - _LOGHOOKSTARTLINEMSG._serialized_end=29003 - _LOGHOOKENDLINE._serialized_start=29006 - _LOGHOOKENDLINE._serialized_end=29153 - _LOGHOOKENDLINEMSG._serialized_start=29155 - _LOGHOOKENDLINEMSG._serialized_end=29255 - _SKIPPINGDETAILS._serialized_start=29258 - _SKIPPINGDETAILS._serialized_end=29405 - _SKIPPINGDETAILSMSG._serialized_start=29407 - _SKIPPINGDETAILSMSG._serialized_end=29509 - _NOTHINGTODO._serialized_start=29511 - _NOTHINGTODO._serialized_end=29524 - _NOTHINGTODOMSG._serialized_start=29526 - _NOTHINGTODOMSG._serialized_end=29620 - _RUNNINGOPERATIONUNCAUGHTERROR._serialized_start=29622 - _RUNNINGOPERATIONUNCAUGHTERROR._serialized_end=29666 - _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_start=29669 - _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_end=29799 - _ENDRUNRESULT._serialized_start=29802 - _ENDRUNRESULT._serialized_end=29949 - _ENDRUNRESULTMSG._serialized_start=29951 - _ENDRUNRESULTMSG._serialized_end=30047 - _NONODESSELECTED._serialized_start=30049 - _NONODESSELECTED._serialized_end=30066 - _NONODESSELECTEDMSG._serialized_start=30068 - _NONODESSELECTEDMSG._serialized_end=30170 - _COMMANDCOMPLETED._serialized_start=30172 - _COMMANDCOMPLETED._serialized_end=30291 - _COMMANDCOMPLETEDMSG._serialized_start=30293 - _COMMANDCOMPLETEDMSG._serialized_end=30397 - _SHOWNODE._serialized_start=30399 - _SHOWNODE._serialized_end=30506 - _SHOWNODEMSG._serialized_start=30508 - _SHOWNODEMSG._serialized_end=30596 - _COMPILEDNODE._serialized_start=30598 - _COMPILEDNODE._serialized_end=30710 - _COMPILEDNODEMSG._serialized_start=30712 - _COMPILEDNODEMSG._serialized_end=30808 - _CATCHABLEEXCEPTIONONRUN._serialized_start=30810 - _CATCHABLEEXCEPTIONONRUN._serialized_end=30908 - _CATCHABLEEXCEPTIONONRUNMSG._serialized_start=30910 - _CATCHABLEEXCEPTIONONRUNMSG._serialized_end=31028 - _INTERNALERRORONRUN._serialized_start=31030 - _INTERNALERRORONRUN._serialized_end=31083 - _INTERNALERRORONRUNMSG._serialized_start=31085 - _INTERNALERRORONRUNMSG._serialized_end=31193 - _GENERICEXCEPTIONONRUN._serialized_start=31195 - _GENERICEXCEPTIONONRUN._serialized_end=31270 - _GENERICEXCEPTIONONRUNMSG._serialized_start=31272 - _GENERICEXCEPTIONONRUNMSG._serialized_end=31386 - _NODECONNECTIONRELEASEERROR._serialized_start=31388 - _NODECONNECTIONRELEASEERROR._serialized_end=31466 - _NODECONNECTIONRELEASEERRORMSG._serialized_start=31468 - _NODECONNECTIONRELEASEERRORMSG._serialized_end=31592 - _FOUNDSTATS._serialized_start=31594 - _FOUNDSTATS._serialized_end=31625 - _FOUNDSTATSMSG._serialized_start=31627 - _FOUNDSTATSMSG._serialized_end=31719 - _MAINKEYBOARDINTERRUPT._serialized_start=31721 - _MAINKEYBOARDINTERRUPT._serialized_end=31744 - _MAINKEYBOARDINTERRUPTMSG._serialized_start=31746 - _MAINKEYBOARDINTERRUPTMSG._serialized_end=31860 - _MAINENCOUNTEREDERROR._serialized_start=31862 - _MAINENCOUNTEREDERROR._serialized_end=31897 - _MAINENCOUNTEREDERRORMSG._serialized_start=31899 - _MAINENCOUNTEREDERRORMSG._serialized_end=32011 - _MAINSTACKTRACE._serialized_start=32013 - _MAINSTACKTRACE._serialized_end=32050 - _MAINSTACKTRACEMSG._serialized_start=32052 - _MAINSTACKTRACEMSG._serialized_end=32152 - _SYSTEMCOULDNOTWRITE._serialized_start=32154 - _SYSTEMCOULDNOTWRITE._serialized_end=32218 - _SYSTEMCOULDNOTWRITEMSG._serialized_start=32220 - _SYSTEMCOULDNOTWRITEMSG._serialized_end=32330 - _SYSTEMEXECUTINGCMD._serialized_start=32332 - _SYSTEMEXECUTINGCMD._serialized_end=32365 - _SYSTEMEXECUTINGCMDMSG._serialized_start=32367 - _SYSTEMEXECUTINGCMDMSG._serialized_end=32475 - _SYSTEMSTDOUT._serialized_start=32477 - _SYSTEMSTDOUT._serialized_end=32505 - _SYSTEMSTDOUTMSG._serialized_start=32507 - _SYSTEMSTDOUTMSG._serialized_end=32603 - _SYSTEMSTDERR._serialized_start=32605 - _SYSTEMSTDERR._serialized_end=32633 - _SYSTEMSTDERRMSG._serialized_start=32635 - _SYSTEMSTDERRMSG._serialized_end=32731 - _SYSTEMREPORTRETURNCODE._serialized_start=32733 - _SYSTEMREPORTRETURNCODE._serialized_end=32777 - _SYSTEMREPORTRETURNCODEMSG._serialized_start=32779 - _SYSTEMREPORTRETURNCODEMSG._serialized_end=32895 - _TIMINGINFOCOLLECTED._serialized_start=32897 - _TIMINGINFOCOLLECTED._serialized_end=33009 - _TIMINGINFOCOLLECTEDMSG._serialized_start=33011 - _TIMINGINFOCOLLECTEDMSG._serialized_end=33121 - _LOGDEBUGSTACKTRACE._serialized_start=33123 - _LOGDEBUGSTACKTRACE._serialized_end=33161 - _LOGDEBUGSTACKTRACEMSG._serialized_start=33163 - _LOGDEBUGSTACKTRACEMSG._serialized_end=33271 - _CHECKCLEANPATH._serialized_start=33273 - _CHECKCLEANPATH._serialized_end=33303 - _CHECKCLEANPATHMSG._serialized_start=33305 - _CHECKCLEANPATHMSG._serialized_end=33405 - _CONFIRMCLEANPATH._serialized_start=33407 - _CONFIRMCLEANPATH._serialized_end=33439 - _CONFIRMCLEANPATHMSG._serialized_start=33441 - _CONFIRMCLEANPATHMSG._serialized_end=33545 - _PROTECTEDCLEANPATH._serialized_start=33547 - _PROTECTEDCLEANPATH._serialized_end=33581 - _PROTECTEDCLEANPATHMSG._serialized_start=33583 - _PROTECTEDCLEANPATHMSG._serialized_end=33691 - _FINISHEDCLEANPATHS._serialized_start=33693 - _FINISHEDCLEANPATHS._serialized_end=33713 - _FINISHEDCLEANPATHSMSG._serialized_start=33715 - _FINISHEDCLEANPATHSMSG._serialized_end=33823 - _OPENCOMMAND._serialized_start=33825 - _OPENCOMMAND._serialized_end=33878 - _OPENCOMMANDMSG._serialized_start=33880 - _OPENCOMMANDMSG._serialized_end=33974 - _FORMATTING._serialized_start=33976 - _FORMATTING._serialized_end=34001 - _FORMATTINGMSG._serialized_start=34003 - _FORMATTINGMSG._serialized_end=34095 - _SERVINGDOCSPORT._serialized_start=34097 - _SERVINGDOCSPORT._serialized_end=34145 - _SERVINGDOCSPORTMSG._serialized_start=34147 - _SERVINGDOCSPORTMSG._serialized_end=34249 - _SERVINGDOCSACCESSINFO._serialized_start=34251 - _SERVINGDOCSACCESSINFO._serialized_end=34288 - _SERVINGDOCSACCESSINFOMSG._serialized_start=34290 - _SERVINGDOCSACCESSINFOMSG._serialized_end=34404 - _SERVINGDOCSEXITINFO._serialized_start=34406 - _SERVINGDOCSEXITINFO._serialized_end=34427 - _SERVINGDOCSEXITINFOMSG._serialized_start=34429 - _SERVINGDOCSEXITINFOMSG._serialized_end=34539 - _RUNRESULTWARNING._serialized_start=34541 - _RUNRESULTWARNING._serialized_end=34615 - _RUNRESULTWARNINGMSG._serialized_start=34617 - _RUNRESULTWARNINGMSG._serialized_end=34721 - _RUNRESULTFAILURE._serialized_start=34723 - _RUNRESULTFAILURE._serialized_end=34797 - _RUNRESULTFAILUREMSG._serialized_start=34799 - _RUNRESULTFAILUREMSG._serialized_end=34903 - _STATSLINE._serialized_start=34905 - _STATSLINE._serialized_end=35012 - _STATSLINE_STATSENTRY._serialized_start=34968 - _STATSLINE_STATSENTRY._serialized_end=35012 - _STATSLINEMSG._serialized_start=35014 - _STATSLINEMSG._serialized_end=35104 - _RUNRESULTERROR._serialized_start=35106 - _RUNRESULTERROR._serialized_end=35135 - _RUNRESULTERRORMSG._serialized_start=35137 - _RUNRESULTERRORMSG._serialized_end=35237 - _RUNRESULTERRORNOMESSAGE._serialized_start=35239 - _RUNRESULTERRORNOMESSAGE._serialized_end=35280 - _RUNRESULTERRORNOMESSAGEMSG._serialized_start=35282 - _RUNRESULTERRORNOMESSAGEMSG._serialized_end=35400 - _SQLCOMPILEDPATH._serialized_start=35402 - _SQLCOMPILEDPATH._serialized_end=35433 - _SQLCOMPILEDPATHMSG._serialized_start=35435 - _SQLCOMPILEDPATHMSG._serialized_end=35537 - _CHECKNODETESTFAILURE._serialized_start=35539 - _CHECKNODETESTFAILURE._serialized_end=35584 - _CHECKNODETESTFAILUREMSG._serialized_start=35586 - _CHECKNODETESTFAILUREMSG._serialized_end=35698 - _FIRSTRUNRESULTERROR._serialized_start=35700 - _FIRSTRUNRESULTERROR._serialized_end=35734 - _FIRSTRUNRESULTERRORMSG._serialized_start=35736 - _FIRSTRUNRESULTERRORMSG._serialized_end=35846 - _AFTERFIRSTRUNRESULTERROR._serialized_start=35848 - _AFTERFIRSTRUNRESULTERROR._serialized_end=35887 - _AFTERFIRSTRUNRESULTERRORMSG._serialized_start=35889 - _AFTERFIRSTRUNRESULTERRORMSG._serialized_end=36009 - _ENDOFRUNSUMMARY._serialized_start=36011 - _ENDOFRUNSUMMARY._serialized_end=36098 - _ENDOFRUNSUMMARYMSG._serialized_start=36100 - _ENDOFRUNSUMMARYMSG._serialized_end=36202 - _LOGSKIPBECAUSEERROR._serialized_start=36204 - _LOGSKIPBECAUSEERROR._serialized_end=36289 - _LOGSKIPBECAUSEERRORMSG._serialized_start=36291 - _LOGSKIPBECAUSEERRORMSG._serialized_end=36401 - _ENSUREGITINSTALLED._serialized_start=36403 - _ENSUREGITINSTALLED._serialized_end=36423 - _ENSUREGITINSTALLEDMSG._serialized_start=36425 - _ENSUREGITINSTALLEDMSG._serialized_end=36533 - _DEPSCREATINGLOCALSYMLINK._serialized_start=36535 - _DEPSCREATINGLOCALSYMLINK._serialized_end=36561 - _DEPSCREATINGLOCALSYMLINKMSG._serialized_start=36563 - _DEPSCREATINGLOCALSYMLINKMSG._serialized_end=36683 - _DEPSSYMLINKNOTAVAILABLE._serialized_start=36685 - _DEPSSYMLINKNOTAVAILABLE._serialized_end=36710 - _DEPSSYMLINKNOTAVAILABLEMSG._serialized_start=36712 - _DEPSSYMLINKNOTAVAILABLEMSG._serialized_end=36830 - _DISABLETRACKING._serialized_start=36832 - _DISABLETRACKING._serialized_end=36849 - _DISABLETRACKINGMSG._serialized_start=36851 - _DISABLETRACKINGMSG._serialized_end=36953 - _SENDINGEVENT._serialized_start=36955 - _SENDINGEVENT._serialized_end=36985 - _SENDINGEVENTMSG._serialized_start=36987 - _SENDINGEVENTMSG._serialized_end=37083 - _SENDEVENTFAILURE._serialized_start=37085 - _SENDEVENTFAILURE._serialized_end=37103 - _SENDEVENTFAILUREMSG._serialized_start=37105 - _SENDEVENTFAILUREMSG._serialized_end=37209 - _FLUSHEVENTS._serialized_start=37211 - _FLUSHEVENTS._serialized_end=37224 - _FLUSHEVENTSMSG._serialized_start=37226 - _FLUSHEVENTSMSG._serialized_end=37320 - _FLUSHEVENTSFAILURE._serialized_start=37322 - _FLUSHEVENTSFAILURE._serialized_end=37342 - _FLUSHEVENTSFAILUREMSG._serialized_start=37344 - _FLUSHEVENTSFAILUREMSG._serialized_end=37452 - _TRACKINGINITIALIZEFAILURE._serialized_start=37454 - _TRACKINGINITIALIZEFAILURE._serialized_end=37499 - _TRACKINGINITIALIZEFAILUREMSG._serialized_start=37501 - _TRACKINGINITIALIZEFAILUREMSG._serialized_end=37623 - _RUNRESULTWARNINGMESSAGE._serialized_start=37625 - _RUNRESULTWARNINGMESSAGE._serialized_end=37663 - _RUNRESULTWARNINGMESSAGEMSG._serialized_start=37665 - _RUNRESULTWARNINGMESSAGEMSG._serialized_end=37783 - _DEBUGCMDOUT._serialized_start=37785 - _DEBUGCMDOUT._serialized_end=37811 - _DEBUGCMDOUTMSG._serialized_start=37813 - _DEBUGCMDOUTMSG._serialized_end=37907 - _DEBUGCMDRESULT._serialized_start=37909 - _DEBUGCMDRESULT._serialized_end=37938 - _DEBUGCMDRESULTMSG._serialized_start=37940 - _DEBUGCMDRESULTMSG._serialized_end=38040 - _LISTCMDOUT._serialized_start=38042 - _LISTCMDOUT._serialized_end=38067 - _LISTCMDOUTMSG._serialized_start=38069 - _LISTCMDOUTMSG._serialized_end=38161 - _NOTE._serialized_start=38163 - _NOTE._serialized_end=38182 - _NOTEMSG._serialized_start=38184 - _NOTEMSG._serialized_end=38264 + _PUBLICATIONARTIFACTAVAILABLE._serialized_start=24901 + _PUBLICATIONARTIFACTAVAILABLE._serialized_end=24978 + _PUBLICATIONARTIFACTAVAILABLEMSG._serialized_start=24981 + _PUBLICATIONARTIFACTAVAILABLEMSG._serialized_end=25109 + _RUNNINGOPERATIONCAUGHTERROR._serialized_start=25111 + _RUNNINGOPERATIONCAUGHTERROR._serialized_end=25153 + _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_start=25155 + _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_end=25281 + _COMPILECOMPLETE._serialized_start=25283 + _COMPILECOMPLETE._serialized_end=25300 + _COMPILECOMPLETEMSG._serialized_start=25302 + _COMPILECOMPLETEMSG._serialized_end=25404 + _FRESHNESSCHECKCOMPLETE._serialized_start=25406 + _FRESHNESSCHECKCOMPLETE._serialized_end=25430 + _FRESHNESSCHECKCOMPLETEMSG._serialized_start=25432 + _FRESHNESSCHECKCOMPLETEMSG._serialized_end=25548 + _SEEDHEADER._serialized_start=25550 + _SEEDHEADER._serialized_end=25578 + _SEEDHEADERMSG._serialized_start=25580 + _SEEDHEADERMSG._serialized_end=25672 + _SQLRUNNEREXCEPTION._serialized_start=25674 + _SQLRUNNEREXCEPTION._serialized_end=25725 + _SQLRUNNEREXCEPTIONMSG._serialized_start=25727 + _SQLRUNNEREXCEPTIONMSG._serialized_end=25835 + _LOGTESTRESULT._serialized_start=25838 + _LOGTESTRESULT._serialized_end=26006 + _LOGTESTRESULTMSG._serialized_start=26008 + _LOGTESTRESULTMSG._serialized_end=26106 + _LOGSTARTLINE._serialized_start=26108 + _LOGSTARTLINE._serialized_end=26215 + _LOGSTARTLINEMSG._serialized_start=26217 + _LOGSTARTLINEMSG._serialized_end=26313 + _LOGMODELRESULT._serialized_start=26316 + _LOGMODELRESULT._serialized_end=26465 + _LOGMODELRESULTMSG._serialized_start=26467 + _LOGMODELRESULTMSG._serialized_end=26567 + _LOGSNAPSHOTRESULT._serialized_start=26570 + _LOGSNAPSHOTRESULT._serialized_end=26820 + _LOGSNAPSHOTRESULT_CFGENTRY._serialized_start=26778 + _LOGSNAPSHOTRESULT_CFGENTRY._serialized_end=26820 + _LOGSNAPSHOTRESULTMSG._serialized_start=26822 + _LOGSNAPSHOTRESULTMSG._serialized_end=26928 + _LOGSEEDRESULT._serialized_start=26931 + _LOGSEEDRESULT._serialized_end=27116 + _LOGSEEDRESULTMSG._serialized_start=27118 + _LOGSEEDRESULTMSG._serialized_end=27216 + _LOGFRESHNESSRESULT._serialized_start=27219 + _LOGFRESHNESSRESULT._serialized_end=27392 + _LOGFRESHNESSRESULTMSG._serialized_start=27394 + _LOGFRESHNESSRESULTMSG._serialized_end=27502 + _LOGCANCELLINE._serialized_start=27504 + _LOGCANCELLINE._serialized_end=27538 + _LOGCANCELLINEMSG._serialized_start=27540 + _LOGCANCELLINEMSG._serialized_end=27638 + _DEFAULTSELECTOR._serialized_start=27640 + _DEFAULTSELECTOR._serialized_end=27671 + _DEFAULTSELECTORMSG._serialized_start=27673 + _DEFAULTSELECTORMSG._serialized_end=27775 + _NODESTART._serialized_start=27777 + _NODESTART._serialized_end=27830 + _NODESTARTMSG._serialized_start=27832 + _NODESTARTMSG._serialized_end=27922 + _NODEFINISHED._serialized_start=27924 + _NODEFINISHED._serialized_end=28027 + _NODEFINISHEDMSG._serialized_start=28029 + _NODEFINISHEDMSG._serialized_end=28125 + _QUERYCANCELATIONUNSUPPORTED._serialized_start=28127 + _QUERYCANCELATIONUNSUPPORTED._serialized_end=28170 + _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_start=28172 + _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_end=28298 + _CONCURRENCYLINE._serialized_start=28300 + _CONCURRENCYLINE._serialized_end=28379 + _CONCURRENCYLINEMSG._serialized_start=28381 + _CONCURRENCYLINEMSG._serialized_end=28483 + _WRITINGINJECTEDSQLFORNODE._serialized_start=28485 + _WRITINGINJECTEDSQLFORNODE._serialized_end=28554 + _WRITINGINJECTEDSQLFORNODEMSG._serialized_start=28556 + _WRITINGINJECTEDSQLFORNODEMSG._serialized_end=28678 + _NODECOMPILING._serialized_start=28680 + _NODECOMPILING._serialized_end=28737 + _NODECOMPILINGMSG._serialized_start=28739 + _NODECOMPILINGMSG._serialized_end=28837 + _NODEEXECUTING._serialized_start=28839 + _NODEEXECUTING._serialized_end=28896 + _NODEEXECUTINGMSG._serialized_start=28898 + _NODEEXECUTINGMSG._serialized_end=28996 + _LOGHOOKSTARTLINE._serialized_start=28998 + _LOGHOOKSTARTLINE._serialized_end=29107 + _LOGHOOKSTARTLINEMSG._serialized_start=29109 + _LOGHOOKSTARTLINEMSG._serialized_end=29213 + _LOGHOOKENDLINE._serialized_start=29216 + _LOGHOOKENDLINE._serialized_end=29363 + _LOGHOOKENDLINEMSG._serialized_start=29365 + _LOGHOOKENDLINEMSG._serialized_end=29465 + _SKIPPINGDETAILS._serialized_start=29468 + _SKIPPINGDETAILS._serialized_end=29615 + _SKIPPINGDETAILSMSG._serialized_start=29617 + _SKIPPINGDETAILSMSG._serialized_end=29719 + _NOTHINGTODO._serialized_start=29721 + _NOTHINGTODO._serialized_end=29734 + _NOTHINGTODOMSG._serialized_start=29736 + _NOTHINGTODOMSG._serialized_end=29830 + _RUNNINGOPERATIONUNCAUGHTERROR._serialized_start=29832 + _RUNNINGOPERATIONUNCAUGHTERROR._serialized_end=29876 + _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_start=29879 + _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_end=30009 + _ENDRUNRESULT._serialized_start=30012 + _ENDRUNRESULT._serialized_end=30159 + _ENDRUNRESULTMSG._serialized_start=30161 + _ENDRUNRESULTMSG._serialized_end=30257 + _NONODESSELECTED._serialized_start=30259 + _NONODESSELECTED._serialized_end=30276 + _NONODESSELECTEDMSG._serialized_start=30278 + _NONODESSELECTEDMSG._serialized_end=30380 + _COMMANDCOMPLETED._serialized_start=30382 + _COMMANDCOMPLETED._serialized_end=30501 + _COMMANDCOMPLETEDMSG._serialized_start=30503 + _COMMANDCOMPLETEDMSG._serialized_end=30607 + _SHOWNODE._serialized_start=30609 + _SHOWNODE._serialized_end=30716 + _SHOWNODEMSG._serialized_start=30718 + _SHOWNODEMSG._serialized_end=30806 + _COMPILEDNODE._serialized_start=30808 + _COMPILEDNODE._serialized_end=30920 + _COMPILEDNODEMSG._serialized_start=30922 + _COMPILEDNODEMSG._serialized_end=31018 + _CATCHABLEEXCEPTIONONRUN._serialized_start=31020 + _CATCHABLEEXCEPTIONONRUN._serialized_end=31118 + _CATCHABLEEXCEPTIONONRUNMSG._serialized_start=31120 + _CATCHABLEEXCEPTIONONRUNMSG._serialized_end=31238 + _INTERNALERRORONRUN._serialized_start=31240 + _INTERNALERRORONRUN._serialized_end=31293 + _INTERNALERRORONRUNMSG._serialized_start=31295 + _INTERNALERRORONRUNMSG._serialized_end=31403 + _GENERICEXCEPTIONONRUN._serialized_start=31405 + _GENERICEXCEPTIONONRUN._serialized_end=31480 + _GENERICEXCEPTIONONRUNMSG._serialized_start=31482 + _GENERICEXCEPTIONONRUNMSG._serialized_end=31596 + _NODECONNECTIONRELEASEERROR._serialized_start=31598 + _NODECONNECTIONRELEASEERROR._serialized_end=31676 + _NODECONNECTIONRELEASEERRORMSG._serialized_start=31678 + _NODECONNECTIONRELEASEERRORMSG._serialized_end=31802 + _FOUNDSTATS._serialized_start=31804 + _FOUNDSTATS._serialized_end=31835 + _FOUNDSTATSMSG._serialized_start=31837 + _FOUNDSTATSMSG._serialized_end=31929 + _MAINKEYBOARDINTERRUPT._serialized_start=31931 + _MAINKEYBOARDINTERRUPT._serialized_end=31954 + _MAINKEYBOARDINTERRUPTMSG._serialized_start=31956 + _MAINKEYBOARDINTERRUPTMSG._serialized_end=32070 + _MAINENCOUNTEREDERROR._serialized_start=32072 + _MAINENCOUNTEREDERROR._serialized_end=32107 + _MAINENCOUNTEREDERRORMSG._serialized_start=32109 + _MAINENCOUNTEREDERRORMSG._serialized_end=32221 + _MAINSTACKTRACE._serialized_start=32223 + _MAINSTACKTRACE._serialized_end=32260 + _MAINSTACKTRACEMSG._serialized_start=32262 + _MAINSTACKTRACEMSG._serialized_end=32362 + _SYSTEMCOULDNOTWRITE._serialized_start=32364 + _SYSTEMCOULDNOTWRITE._serialized_end=32428 + _SYSTEMCOULDNOTWRITEMSG._serialized_start=32430 + _SYSTEMCOULDNOTWRITEMSG._serialized_end=32540 + _SYSTEMEXECUTINGCMD._serialized_start=32542 + _SYSTEMEXECUTINGCMD._serialized_end=32575 + _SYSTEMEXECUTINGCMDMSG._serialized_start=32577 + _SYSTEMEXECUTINGCMDMSG._serialized_end=32685 + _SYSTEMSTDOUT._serialized_start=32687 + _SYSTEMSTDOUT._serialized_end=32715 + _SYSTEMSTDOUTMSG._serialized_start=32717 + _SYSTEMSTDOUTMSG._serialized_end=32813 + _SYSTEMSTDERR._serialized_start=32815 + _SYSTEMSTDERR._serialized_end=32843 + _SYSTEMSTDERRMSG._serialized_start=32845 + _SYSTEMSTDERRMSG._serialized_end=32941 + _SYSTEMREPORTRETURNCODE._serialized_start=32943 + _SYSTEMREPORTRETURNCODE._serialized_end=32987 + _SYSTEMREPORTRETURNCODEMSG._serialized_start=32989 + _SYSTEMREPORTRETURNCODEMSG._serialized_end=33105 + _TIMINGINFOCOLLECTED._serialized_start=33107 + _TIMINGINFOCOLLECTED._serialized_end=33219 + _TIMINGINFOCOLLECTEDMSG._serialized_start=33221 + _TIMINGINFOCOLLECTEDMSG._serialized_end=33331 + _LOGDEBUGSTACKTRACE._serialized_start=33333 + _LOGDEBUGSTACKTRACE._serialized_end=33371 + _LOGDEBUGSTACKTRACEMSG._serialized_start=33373 + _LOGDEBUGSTACKTRACEMSG._serialized_end=33481 + _CHECKCLEANPATH._serialized_start=33483 + _CHECKCLEANPATH._serialized_end=33513 + _CHECKCLEANPATHMSG._serialized_start=33515 + _CHECKCLEANPATHMSG._serialized_end=33615 + _CONFIRMCLEANPATH._serialized_start=33617 + _CONFIRMCLEANPATH._serialized_end=33649 + _CONFIRMCLEANPATHMSG._serialized_start=33651 + _CONFIRMCLEANPATHMSG._serialized_end=33755 + _PROTECTEDCLEANPATH._serialized_start=33757 + _PROTECTEDCLEANPATH._serialized_end=33791 + _PROTECTEDCLEANPATHMSG._serialized_start=33793 + _PROTECTEDCLEANPATHMSG._serialized_end=33901 + _FINISHEDCLEANPATHS._serialized_start=33903 + _FINISHEDCLEANPATHS._serialized_end=33923 + _FINISHEDCLEANPATHSMSG._serialized_start=33925 + _FINISHEDCLEANPATHSMSG._serialized_end=34033 + _OPENCOMMAND._serialized_start=34035 + _OPENCOMMAND._serialized_end=34088 + _OPENCOMMANDMSG._serialized_start=34090 + _OPENCOMMANDMSG._serialized_end=34184 + _FORMATTING._serialized_start=34186 + _FORMATTING._serialized_end=34211 + _FORMATTINGMSG._serialized_start=34213 + _FORMATTINGMSG._serialized_end=34305 + _SERVINGDOCSPORT._serialized_start=34307 + _SERVINGDOCSPORT._serialized_end=34355 + _SERVINGDOCSPORTMSG._serialized_start=34357 + _SERVINGDOCSPORTMSG._serialized_end=34459 + _SERVINGDOCSACCESSINFO._serialized_start=34461 + _SERVINGDOCSACCESSINFO._serialized_end=34498 + _SERVINGDOCSACCESSINFOMSG._serialized_start=34500 + _SERVINGDOCSACCESSINFOMSG._serialized_end=34614 + _SERVINGDOCSEXITINFO._serialized_start=34616 + _SERVINGDOCSEXITINFO._serialized_end=34637 + _SERVINGDOCSEXITINFOMSG._serialized_start=34639 + _SERVINGDOCSEXITINFOMSG._serialized_end=34749 + _RUNRESULTWARNING._serialized_start=34751 + _RUNRESULTWARNING._serialized_end=34825 + _RUNRESULTWARNINGMSG._serialized_start=34827 + _RUNRESULTWARNINGMSG._serialized_end=34931 + _RUNRESULTFAILURE._serialized_start=34933 + _RUNRESULTFAILURE._serialized_end=35007 + _RUNRESULTFAILUREMSG._serialized_start=35009 + _RUNRESULTFAILUREMSG._serialized_end=35113 + _STATSLINE._serialized_start=35115 + _STATSLINE._serialized_end=35222 + _STATSLINE_STATSENTRY._serialized_start=35178 + _STATSLINE_STATSENTRY._serialized_end=35222 + _STATSLINEMSG._serialized_start=35224 + _STATSLINEMSG._serialized_end=35314 + _RUNRESULTERROR._serialized_start=35316 + _RUNRESULTERROR._serialized_end=35345 + _RUNRESULTERRORMSG._serialized_start=35347 + _RUNRESULTERRORMSG._serialized_end=35447 + _RUNRESULTERRORNOMESSAGE._serialized_start=35449 + _RUNRESULTERRORNOMESSAGE._serialized_end=35490 + _RUNRESULTERRORNOMESSAGEMSG._serialized_start=35492 + _RUNRESULTERRORNOMESSAGEMSG._serialized_end=35610 + _SQLCOMPILEDPATH._serialized_start=35612 + _SQLCOMPILEDPATH._serialized_end=35643 + _SQLCOMPILEDPATHMSG._serialized_start=35645 + _SQLCOMPILEDPATHMSG._serialized_end=35747 + _CHECKNODETESTFAILURE._serialized_start=35749 + _CHECKNODETESTFAILURE._serialized_end=35794 + _CHECKNODETESTFAILUREMSG._serialized_start=35796 + _CHECKNODETESTFAILUREMSG._serialized_end=35908 + _FIRSTRUNRESULTERROR._serialized_start=35910 + _FIRSTRUNRESULTERROR._serialized_end=35944 + _FIRSTRUNRESULTERRORMSG._serialized_start=35946 + _FIRSTRUNRESULTERRORMSG._serialized_end=36056 + _AFTERFIRSTRUNRESULTERROR._serialized_start=36058 + _AFTERFIRSTRUNRESULTERROR._serialized_end=36097 + _AFTERFIRSTRUNRESULTERRORMSG._serialized_start=36099 + _AFTERFIRSTRUNRESULTERRORMSG._serialized_end=36219 + _ENDOFRUNSUMMARY._serialized_start=36221 + _ENDOFRUNSUMMARY._serialized_end=36308 + _ENDOFRUNSUMMARYMSG._serialized_start=36310 + _ENDOFRUNSUMMARYMSG._serialized_end=36412 + _LOGSKIPBECAUSEERROR._serialized_start=36414 + _LOGSKIPBECAUSEERROR._serialized_end=36499 + _LOGSKIPBECAUSEERRORMSG._serialized_start=36501 + _LOGSKIPBECAUSEERRORMSG._serialized_end=36611 + _ENSUREGITINSTALLED._serialized_start=36613 + _ENSUREGITINSTALLED._serialized_end=36633 + _ENSUREGITINSTALLEDMSG._serialized_start=36635 + _ENSUREGITINSTALLEDMSG._serialized_end=36743 + _DEPSCREATINGLOCALSYMLINK._serialized_start=36745 + _DEPSCREATINGLOCALSYMLINK._serialized_end=36771 + _DEPSCREATINGLOCALSYMLINKMSG._serialized_start=36773 + _DEPSCREATINGLOCALSYMLINKMSG._serialized_end=36893 + _DEPSSYMLINKNOTAVAILABLE._serialized_start=36895 + _DEPSSYMLINKNOTAVAILABLE._serialized_end=36920 + _DEPSSYMLINKNOTAVAILABLEMSG._serialized_start=36922 + _DEPSSYMLINKNOTAVAILABLEMSG._serialized_end=37040 + _DISABLETRACKING._serialized_start=37042 + _DISABLETRACKING._serialized_end=37059 + _DISABLETRACKINGMSG._serialized_start=37061 + _DISABLETRACKINGMSG._serialized_end=37163 + _SENDINGEVENT._serialized_start=37165 + _SENDINGEVENT._serialized_end=37195 + _SENDINGEVENTMSG._serialized_start=37197 + _SENDINGEVENTMSG._serialized_end=37293 + _SENDEVENTFAILURE._serialized_start=37295 + _SENDEVENTFAILURE._serialized_end=37313 + _SENDEVENTFAILUREMSG._serialized_start=37315 + _SENDEVENTFAILUREMSG._serialized_end=37419 + _FLUSHEVENTS._serialized_start=37421 + _FLUSHEVENTS._serialized_end=37434 + _FLUSHEVENTSMSG._serialized_start=37436 + _FLUSHEVENTSMSG._serialized_end=37530 + _FLUSHEVENTSFAILURE._serialized_start=37532 + _FLUSHEVENTSFAILURE._serialized_end=37552 + _FLUSHEVENTSFAILUREMSG._serialized_start=37554 + _FLUSHEVENTSFAILUREMSG._serialized_end=37662 + _TRACKINGINITIALIZEFAILURE._serialized_start=37664 + _TRACKINGINITIALIZEFAILURE._serialized_end=37709 + _TRACKINGINITIALIZEFAILUREMSG._serialized_start=37711 + _TRACKINGINITIALIZEFAILUREMSG._serialized_end=37833 + _RUNRESULTWARNINGMESSAGE._serialized_start=37835 + _RUNRESULTWARNINGMESSAGE._serialized_end=37873 + _RUNRESULTWARNINGMESSAGEMSG._serialized_start=37875 + _RUNRESULTWARNINGMESSAGEMSG._serialized_end=37993 + _DEBUGCMDOUT._serialized_start=37995 + _DEBUGCMDOUT._serialized_end=38021 + _DEBUGCMDOUTMSG._serialized_start=38023 + _DEBUGCMDOUTMSG._serialized_end=38117 + _DEBUGCMDRESULT._serialized_start=38119 + _DEBUGCMDRESULT._serialized_end=38148 + _DEBUGCMDRESULTMSG._serialized_start=38150 + _DEBUGCMDRESULTMSG._serialized_end=38250 + _LISTCMDOUT._serialized_start=38252 + _LISTCMDOUT._serialized_end=38277 + _LISTCMDOUTMSG._serialized_start=38279 + _LISTCMDOUTMSG._serialized_end=38371 + _NOTE._serialized_start=38373 + _NOTE._serialized_end=38392 + _NOTEMSG._serialized_start=38394 + _NOTEMSG._serialized_end=38474 # @@protoc_insertion_point(module_scope) diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index 4fa9b21bd90..50ce0430a06 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -52,6 +52,7 @@ StateCheckVarsHash, Note, PublicationArtifactChanged, + PublicationArtifactAvailable, DeprecatedModel, DeprecatedReference, UpcomingReferenceDeprecation, @@ -550,7 +551,7 @@ def load(self): if not skip_parsing or public_nodes_changed: # Write out the _publication.json file for this project - write_publication_artifact(self.root_project, self.manifest) + log_publication_artifact(self.root_project, self.manifest) # write out the fully parsed manifest self.write_manifest_for_partial_parse() @@ -1757,7 +1758,7 @@ def process_node(config: RuntimeConfig, manifest: Manifest, node: ManifestNode): _process_docs_for_node(ctx, node) -def write_publication_artifact(root_project: RuntimeConfig, manifest: Manifest): +def log_publication_artifact(root_project: RuntimeConfig, manifest: Manifest): # The manifest.json is written out in a task, so we're not writing it here # build publication metadata @@ -1824,10 +1825,8 @@ def write_publication_artifact(root_project: RuntimeConfig, manifest: Manifest): public_models=public_models, dependencies=dependencies, ) - # write out publication artifact _publication.json - publication_file_name = f"{root_project.project_name}_publication.json" - path = os.path.join(root_project.target_path, publication_file_name) - publication.write(path) + + fire_event(PublicationArtifactAvailable(pub_artifact=publication.to_dict())) def write_manifest(manifest: Manifest, target_path: str): diff --git a/core/dbt/tests/util.py b/core/dbt/tests/util.py index 9f0a0a47684..f770c8a28e9 100644 --- a/core/dbt/tests/util.py +++ b/core/dbt/tests/util.py @@ -116,24 +116,39 @@ def run_dbt( # If you want the logs that are normally written to a file, you must # start with the "--debug" flag. The structured schema log CI test # will turn the logs into json, so you have to be prepared for that. -def run_dbt_and_capture(args: List[str] = None, expect_pass=True): +def run_dbt_and_capture( + args: List[str] = None, + expect_pass: bool = True, + publications: List[PublicationArtifact] = None, +): try: stringbuf = StringIO() capture_stdout_logs(stringbuf) - res = run_dbt(args, expect_pass=expect_pass) + res = run_dbt(args, expect_pass=expect_pass, publications=publications) stdout = stringbuf.getvalue() finally: stop_capture_stdout_logs() - # Json logs will have lots of escape characters which will - # make checks for strings in the logs fail, so remove those. - if '{"code":' in stdout: - stdout = stdout.replace("\\", "") - return res, stdout +def get_logging_events(log_output, event_name): + logging_events = [] + for log_line in log_output.split("\n"): + # skip empty lines + if len(log_line) == 0: + continue + # The adapter logging also shows up, so skip non-json lines + if not log_line.startswith("{"): + continue + if event_name in log_line: + log_dct = json.loads(log_line) + if log_dct["info"]["name"] == event_name: + logging_events.append(log_dct) + return logging_events + + # Used in test cases to get the manifest from the partial parsing file # Note: this uses an internal version of the manifest, and in the future # parts of it will not be supported for external use. diff --git a/tests/functional/multi_project/test_publication.py b/tests/functional/multi_project/test_publication.py index abbe271c7fc..754d02dc73e 100644 --- a/tests/functional/multi_project/test_publication.py +++ b/tests/functional/multi_project/test_publication.py @@ -2,7 +2,12 @@ import pytest import os -from dbt.tests.util import run_dbt, get_artifact, write_file +from dbt.tests.util import ( + run_dbt, + write_file, + run_dbt_and_capture, + get_logging_events, +) from dbt.contracts.publication import PublicationArtifact, PublicModel from dbt.exceptions import ( PublicationConfigNotFound, @@ -102,10 +107,11 @@ def models(self): } def test_publication_artifact(self, project): - results = run_dbt(["run"]) + results, log_output = run_dbt_and_capture(["--debug", "--log-format=json", "run"]) assert len(results) == 3 - publication_dict = get_artifact(project.project_root, "target", "test_publication.json") + pub_available_events = get_logging_events(log_output, "PublicationArtifactAvailable") + publication_dict = pub_available_events[0]["data"]["pub_artifact"] publication = PublicationArtifact.from_dict(publication_dict) assert publication assert len(publication.public_models) == 2 @@ -134,13 +140,16 @@ def test_pub_artifacts(self, project): # Provide publication and try again m_pub_json = marketing_pub_json.replace("test_schema", project.test_schema) publications = [PublicationArtifact.from_dict(json.loads(m_pub_json))] - manifest = run_dbt(["parse"], publications=publications) + manifest, log_output = run_dbt_and_capture( + ["--debug", "--log-format=json", "parse"], publications=publications + ) assert manifest.publications assert "marketing" in manifest.publications assert "model.marketing.fct_one" in manifest.publications["marketing"].public_node_ids # Check dependencies in publication_artifact - publication_dict = get_artifact(project.project_root, "target", "test_publication.json") + pub_available_events = get_logging_events(log_output, "PublicationArtifactAvailable") + publication_dict = pub_available_events[0]["data"]["pub_artifact"] publication = PublicationArtifact.from_dict(publication_dict) assert publication.dependencies == ["marketing"] @@ -234,13 +243,14 @@ def test_multi_projects(self, project, project_alt): # run the alternate project by using the alternate project root # (There is currently a bug where project-dir requires a chdir to work.) os.chdir(project_alt.project_root) - results = run_dbt(["run", "--project-dir", str(project_alt.project_root)]) + results, log_output = run_dbt_and_capture( + ["--debug", "--log-format=json", "run", "--project-dir", str(project_alt.project_root)] + ) assert len(results) == 1 # Check publication artifact - publication_dict = get_artifact( - project_alt.project_root, "target", "test_alt_publication.json" - ) + pub_available_events = get_logging_events(log_output, "PublicationArtifactAvailable") + publication_dict = pub_available_events[0]["data"]["pub_artifact"] publication = PublicationArtifact.from_dict(publication_dict) assert len(publication.public_models) == 1 diff --git a/tests/unit/test_events.py b/tests/unit/test_events.py index b61ff9d939e..54fefe7d471 100644 --- a/tests/unit/test_events.py +++ b/tests/unit/test_events.py @@ -275,6 +275,8 @@ def test_event_codes(self): types.RegistryResponseMissingNestedKeys(response=""), types.RegistryResponseExtraNestedKeys(response=""), types.DepsSetDownloadDirectory(path=""), + # P - Artifacts =================== + types.PublicationArtifactAvailable(), # Q - Node execution ====================== types.RunningOperationCaughtError(exc=""), types.CompileComplete(), From a3d40e0abf3e263383657e166a1b9e82bb789965 Mon Sep 17 00:00:00 2001 From: Github Build Bot Date: Thu, 25 May 2023 15:06:24 +0000 Subject: [PATCH 22/67] Bumping version to 1.6.0b2 and generate changelog --- .bumpversion.cfg | 2 +- .changes/1.6.0-b2.md | 38 +++++++++++++++++ .../Dependencies-20230522-005948.yaml | 0 .../Dependencies-20230522-212201.yaml | 0 .../Features-20230509-233329.yaml | 0 .../Features-20230515-122304.yaml | 0 .../Features-20230517-185627.yaml | 0 .../Fixes-20230511-140441.yaml | 0 .../Fixes-20230515-123654.yaml | 0 .../Fixes-20230515-142851.yaml | 0 .../Fixes-20230516-152644.yaml | 0 .../Fixes-20230522-132924.yaml | 0 .../Fixes-20230522-135007.yaml | 0 .../Under the Hood-20230515-095116.yaml | 0 .../Under the Hood-20230515-152107.yaml | 0 .../Under the Hood-20230516-094241.yaml | 0 .../Under the Hood-20230518-114251.yaml | 0 .../Under the Hood-20230519-153059.yaml | 0 .../Under the Hood-20230521-125720.yaml | 0 .../Under the Hood-20230523-122137.yaml | 0 CHANGELOG.md | 41 ++++++++++++++++++- core/dbt/version.py | 2 +- core/setup.py | 2 +- docker/Dockerfile | 12 +++--- .../dbt/adapters/postgres/__version__.py | 2 +- plugins/postgres/setup.py | 2 +- .../adapter/dbt/tests/adapter/__version__.py | 2 +- tests/adapter/setup.py | 2 +- 28 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 .changes/1.6.0-b2.md rename .changes/{unreleased => 1.6.0}/Dependencies-20230522-005948.yaml (100%) rename .changes/{unreleased => 1.6.0}/Dependencies-20230522-212201.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230509-233329.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230515-122304.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230517-185627.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230511-140441.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230515-123654.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230515-142851.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230516-152644.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230522-132924.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230522-135007.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230515-095116.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230515-152107.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230516-094241.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230518-114251.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230519-153059.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230521-125720.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230523-122137.yaml (100%) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 85772b5b860..fc2c9a12a93 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.6.0b1 +current_version = 1.6.0b2 parse = (?P[\d]+) # major version number \.(?P[\d]+) # minor version number \.(?P[\d]+) # patch version number diff --git a/.changes/1.6.0-b2.md b/.changes/1.6.0-b2.md new file mode 100644 index 00000000000..b14864280d3 --- /dev/null +++ b/.changes/1.6.0-b2.md @@ -0,0 +1,38 @@ +## dbt-core 1.6.0-b2 - May 25, 2023 + +### Features + +- Added warnings for model and ref deprecations ([#7433](https://github.com/dbt-labs/dbt-core/issues/7433)) +- Update drop_relation macro to allow for configuration of drop statement separately from object name ([#7625](https://github.com/dbt-labs/dbt-core/issues/7625)) +- accept publications in dbt.invoke ([#7372](https://github.com/dbt-labs/dbt-core/issues/7372)) + +### Fixes + +- Honor `--skip-profile-setup` parameter when inside an existing project ([#7594](https://github.com/dbt-labs/dbt-core/issues/7594)) +- Fix: Relative project paths weren't working with deps ([#7491](https://github.com/dbt-labs/dbt-core/issues/7491)) +- Exclude password fields from Jinja rendering. ([#7629](https://github.com/dbt-labs/dbt-core/issues/7629)) +- Add --target-path to more CLI subcommands ([#7646](https://github.com/dbt-labs/dbt-core/issues/7646)) +- Stringify flag paths for Jinja context ([#7495](https://github.com/dbt-labs/dbt-core/issues/7495)) +- write run_results.json for run operation ([#7502](https://github.com/dbt-labs/dbt-core/issues/7502)) + +### Under the Hood + +- Add ability to instantiate Flags class from dict ([#7607](https://github.com/dbt-labs/dbt-core/issues/7607)) +- Add other relation to reffable nodes ([#7550](https://github.com/dbt-labs/dbt-core/issues/7550)) +- Move node patch method to schema parser patch_node_properties and refactor schema parsing ([#7430](https://github.com/dbt-labs/dbt-core/issues/7430)) +- Remove legacy file logger code ([#NA](https://github.com/dbt-labs/dbt-core/issues/NA)) +- Break up integration tests as a short term fix for Windows CI runs ([#7668](https://github.com/dbt-labs/dbt-core/issues/7668)) +- Include null checks in utils test base ([#7670](https://github.com/dbt-labs/dbt-core/issues/7670)) +- Write pub artifact to log ([#7372](https://github.com/dbt-labs/dbt-core/issues/7372)) + +### Dependencies + +- Bump ubuntu from 23.04 to 23.10 ([#7675](https://github.com/dbt-labs/dbt-core/pull/7675)) +- ([#7681](https://github.com/dbt-labs/dbt-core/pull/7681)) + +### Contributors +- [@dradnan89@hotmail.com](https://github.com/dradnan89@hotmail.com) ([#7681](https://github.com/dbt-labs/dbt-core/pull/7681)) +- [@dwreeves](https://github.com/dwreeves) ([#7646](https://github.com/dbt-labs/dbt-core/issues/7646)) +- [@iknox-fa](https://github.com/iknox-fa) ([#7491](https://github.com/dbt-labs/dbt-core/issues/7491), [#NA](https://github.com/dbt-labs/dbt-core/issues/NA)) +- [@sdebruyn](https://github.com/sdebruyn) ([#7670](https://github.com/dbt-labs/dbt-core/issues/7670)) +- [@stu-k](https://github.com/stu-k) ([#7607](https://github.com/dbt-labs/dbt-core/issues/7607), [#7550](https://github.com/dbt-labs/dbt-core/issues/7550)) diff --git a/.changes/unreleased/Dependencies-20230522-005948.yaml b/.changes/1.6.0/Dependencies-20230522-005948.yaml similarity index 100% rename from .changes/unreleased/Dependencies-20230522-005948.yaml rename to .changes/1.6.0/Dependencies-20230522-005948.yaml diff --git a/.changes/unreleased/Dependencies-20230522-212201.yaml b/.changes/1.6.0/Dependencies-20230522-212201.yaml similarity index 100% rename from .changes/unreleased/Dependencies-20230522-212201.yaml rename to .changes/1.6.0/Dependencies-20230522-212201.yaml diff --git a/.changes/unreleased/Features-20230509-233329.yaml b/.changes/1.6.0/Features-20230509-233329.yaml similarity index 100% rename from .changes/unreleased/Features-20230509-233329.yaml rename to .changes/1.6.0/Features-20230509-233329.yaml diff --git a/.changes/unreleased/Features-20230515-122304.yaml b/.changes/1.6.0/Features-20230515-122304.yaml similarity index 100% rename from .changes/unreleased/Features-20230515-122304.yaml rename to .changes/1.6.0/Features-20230515-122304.yaml diff --git a/.changes/unreleased/Features-20230517-185627.yaml b/.changes/1.6.0/Features-20230517-185627.yaml similarity index 100% rename from .changes/unreleased/Features-20230517-185627.yaml rename to .changes/1.6.0/Features-20230517-185627.yaml diff --git a/.changes/unreleased/Fixes-20230511-140441.yaml b/.changes/1.6.0/Fixes-20230511-140441.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230511-140441.yaml rename to .changes/1.6.0/Fixes-20230511-140441.yaml diff --git a/.changes/unreleased/Fixes-20230515-123654.yaml b/.changes/1.6.0/Fixes-20230515-123654.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230515-123654.yaml rename to .changes/1.6.0/Fixes-20230515-123654.yaml diff --git a/.changes/unreleased/Fixes-20230515-142851.yaml b/.changes/1.6.0/Fixes-20230515-142851.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230515-142851.yaml rename to .changes/1.6.0/Fixes-20230515-142851.yaml diff --git a/.changes/unreleased/Fixes-20230516-152644.yaml b/.changes/1.6.0/Fixes-20230516-152644.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230516-152644.yaml rename to .changes/1.6.0/Fixes-20230516-152644.yaml diff --git a/.changes/unreleased/Fixes-20230522-132924.yaml b/.changes/1.6.0/Fixes-20230522-132924.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230522-132924.yaml rename to .changes/1.6.0/Fixes-20230522-132924.yaml diff --git a/.changes/unreleased/Fixes-20230522-135007.yaml b/.changes/1.6.0/Fixes-20230522-135007.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230522-135007.yaml rename to .changes/1.6.0/Fixes-20230522-135007.yaml diff --git a/.changes/unreleased/Under the Hood-20230515-095116.yaml b/.changes/1.6.0/Under the Hood-20230515-095116.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230515-095116.yaml rename to .changes/1.6.0/Under the Hood-20230515-095116.yaml diff --git a/.changes/unreleased/Under the Hood-20230515-152107.yaml b/.changes/1.6.0/Under the Hood-20230515-152107.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230515-152107.yaml rename to .changes/1.6.0/Under the Hood-20230515-152107.yaml diff --git a/.changes/unreleased/Under the Hood-20230516-094241.yaml b/.changes/1.6.0/Under the Hood-20230516-094241.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230516-094241.yaml rename to .changes/1.6.0/Under the Hood-20230516-094241.yaml diff --git a/.changes/unreleased/Under the Hood-20230518-114251.yaml b/.changes/1.6.0/Under the Hood-20230518-114251.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230518-114251.yaml rename to .changes/1.6.0/Under the Hood-20230518-114251.yaml diff --git a/.changes/unreleased/Under the Hood-20230519-153059.yaml b/.changes/1.6.0/Under the Hood-20230519-153059.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230519-153059.yaml rename to .changes/1.6.0/Under the Hood-20230519-153059.yaml diff --git a/.changes/unreleased/Under the Hood-20230521-125720.yaml b/.changes/1.6.0/Under the Hood-20230521-125720.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230521-125720.yaml rename to .changes/1.6.0/Under the Hood-20230521-125720.yaml diff --git a/.changes/unreleased/Under the Hood-20230523-122137.yaml b/.changes/1.6.0/Under the Hood-20230523-122137.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230523-122137.yaml rename to .changes/1.6.0/Under the Hood-20230523-122137.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f5656d3f7d..760f22fbf07 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,46 @@ - "Breaking changes" listed under a version may require action from end users or external maintainers when upgrading to that version. - Do not edit this file directly. This file is auto-generated using [changie](https://github.com/miniscruff/changie). For details on how to document a change, see [the contributing guide](https://github.com/dbt-labs/dbt-core/blob/main/CONTRIBUTING.md#adding-changelog-entry) +## dbt-core 1.6.0-b2 - May 25, 2023 + +### Features + +- Added warnings for model and ref deprecations ([#7433](https://github.com/dbt-labs/dbt-core/issues/7433)) +- Update drop_relation macro to allow for configuration of drop statement separately from object name ([#7625](https://github.com/dbt-labs/dbt-core/issues/7625)) +- accept publications in dbt.invoke ([#7372](https://github.com/dbt-labs/dbt-core/issues/7372)) + +### Fixes + +- Honor `--skip-profile-setup` parameter when inside an existing project ([#7594](https://github.com/dbt-labs/dbt-core/issues/7594)) +- Fix: Relative project paths weren't working with deps ([#7491](https://github.com/dbt-labs/dbt-core/issues/7491)) +- Exclude password fields from Jinja rendering. ([#7629](https://github.com/dbt-labs/dbt-core/issues/7629)) +- Add --target-path to more CLI subcommands ([#7646](https://github.com/dbt-labs/dbt-core/issues/7646)) +- Stringify flag paths for Jinja context ([#7495](https://github.com/dbt-labs/dbt-core/issues/7495)) +- write run_results.json for run operation ([#7502](https://github.com/dbt-labs/dbt-core/issues/7502)) + +### Under the Hood + +- Add ability to instantiate Flags class from dict ([#7607](https://github.com/dbt-labs/dbt-core/issues/7607)) +- Add other relation to reffable nodes ([#7550](https://github.com/dbt-labs/dbt-core/issues/7550)) +- Move node patch method to schema parser patch_node_properties and refactor schema parsing ([#7430](https://github.com/dbt-labs/dbt-core/issues/7430)) +- Remove legacy file logger code ([#NA](https://github.com/dbt-labs/dbt-core/issues/NA)) +- Break up integration tests as a short term fix for Windows CI runs ([#7668](https://github.com/dbt-labs/dbt-core/issues/7668)) +- Include null checks in utils test base ([#7670](https://github.com/dbt-labs/dbt-core/issues/7670)) +- Write pub artifact to log ([#7372](https://github.com/dbt-labs/dbt-core/issues/7372)) + +### Dependencies + +- Bump ubuntu from 23.04 to 23.10 ([#7675](https://github.com/dbt-labs/dbt-core/pull/7675)) +- ([#7681](https://github.com/dbt-labs/dbt-core/pull/7681)) + +### Contributors +- [@dradnan89@hotmail.com](https://github.com/dradnan89@hotmail.com) ([#7681](https://github.com/dbt-labs/dbt-core/pull/7681)) +- [@dwreeves](https://github.com/dwreeves) ([#7646](https://github.com/dbt-labs/dbt-core/issues/7646)) +- [@iknox-fa](https://github.com/iknox-fa) ([#7491](https://github.com/dbt-labs/dbt-core/issues/7491), [#NA](https://github.com/dbt-labs/dbt-core/issues/NA)) +- [@sdebruyn](https://github.com/sdebruyn) ([#7670](https://github.com/dbt-labs/dbt-core/issues/7670)) +- [@stu-k](https://github.com/stu-k) ([#7607](https://github.com/dbt-labs/dbt-core/issues/7607), [#7550](https://github.com/dbt-labs/dbt-core/issues/7550)) + + ## dbt-core 1.6.0-b1 - May 12, 2023 ### Features @@ -56,7 +96,6 @@ - [@dwreeves](https://github.com/dwreeves) ([#7418](https://github.com/dbt-labs/dbt-core/issues/7418)) - [@thomasgjerdekog](https://github.com/thomasgjerdekog) ([#7517](https://github.com/dbt-labs/dbt-core/issues/7517)) - ## dbt-core 1.6.0-a1 - April 17, 2023 ## Previous Releases diff --git a/core/dbt/version.py b/core/dbt/version.py index d10c10e7186..923e37b40d6 100644 --- a/core/dbt/version.py +++ b/core/dbt/version.py @@ -232,5 +232,5 @@ def _get_adapter_plugin_names() -> Iterator[str]: yield plugin_name -__version__ = "1.6.0b1" +__version__ = "1.6.0b2" installed = get_installed_version() diff --git a/core/setup.py b/core/setup.py index 049a8e0a950..643d2dd030c 100644 --- a/core/setup.py +++ b/core/setup.py @@ -25,7 +25,7 @@ package_name = "dbt-core" -package_version = "1.6.0b1" +package_version = "1.6.0b2" description = """With dbt, data analysts and engineers can build analytics \ the way engineers build applications.""" diff --git a/docker/Dockerfile b/docker/Dockerfile index 9d8332fc351..7cb7f8dbc8c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,12 +14,12 @@ FROM --platform=$build_for python:3.11.2-slim-bullseye as base # N.B. The refs updated automagically every release via bumpversion # N.B. dbt-postgres is currently found in the core codebase so a value of dbt-core@ is correct -ARG dbt_core_ref=dbt-core@v1.6.0b1 -ARG dbt_postgres_ref=dbt-core@v1.6.0b1 -ARG dbt_redshift_ref=dbt-redshift@v1.6.0b1 -ARG dbt_bigquery_ref=dbt-bigquery@v1.6.0b1 -ARG dbt_snowflake_ref=dbt-snowflake@v1.6.0b1 -ARG dbt_spark_ref=dbt-spark@v1.6.0b1 +ARG dbt_core_ref=dbt-core@v1.6.0b2 +ARG dbt_postgres_ref=dbt-core@v1.6.0b2 +ARG dbt_redshift_ref=dbt-redshift@v1.6.0b2 +ARG dbt_bigquery_ref=dbt-bigquery@v1.6.0b2 +ARG dbt_snowflake_ref=dbt-snowflake@v1.6.0b2 +ARG dbt_spark_ref=dbt-spark@v1.6.0b2 # special case args ARG dbt_spark_version=all ARG dbt_third_party diff --git a/plugins/postgres/dbt/adapters/postgres/__version__.py b/plugins/postgres/dbt/adapters/postgres/__version__.py index cafa9196687..21c2b283654 100644 --- a/plugins/postgres/dbt/adapters/postgres/__version__.py +++ b/plugins/postgres/dbt/adapters/postgres/__version__.py @@ -1 +1 @@ -version = "1.6.0b1" +version = "1.6.0b2" diff --git a/plugins/postgres/setup.py b/plugins/postgres/setup.py index 7642f24465a..370347a9608 100644 --- a/plugins/postgres/setup.py +++ b/plugins/postgres/setup.py @@ -41,7 +41,7 @@ def _dbt_psycopg2_name(): package_name = "dbt-postgres" -package_version = "1.6.0b1" +package_version = "1.6.0b2" description = """The postgres adapter plugin for dbt (data build tool)""" this_directory = os.path.abspath(os.path.dirname(__file__)) diff --git a/tests/adapter/dbt/tests/adapter/__version__.py b/tests/adapter/dbt/tests/adapter/__version__.py index cafa9196687..21c2b283654 100644 --- a/tests/adapter/dbt/tests/adapter/__version__.py +++ b/tests/adapter/dbt/tests/adapter/__version__.py @@ -1 +1 @@ -version = "1.6.0b1" +version = "1.6.0b2" diff --git a/tests/adapter/setup.py b/tests/adapter/setup.py index f387d557237..50185134302 100644 --- a/tests/adapter/setup.py +++ b/tests/adapter/setup.py @@ -20,7 +20,7 @@ package_name = "dbt-tests-adapter" -package_version = "1.6.0b1" +package_version = "1.6.0b2" description = """The dbt adapter tests for adapter plugins""" this_directory = os.path.abspath(os.path.dirname(__file__)) From aa11cf295625266b9ab58dba95de675156fd1e96 Mon Sep 17 00:00:00 2001 From: leahwicz <60146280+leahwicz@users.noreply.github.com> Date: Fri, 26 May 2023 08:38:13 -0400 Subject: [PATCH 23/67] Adding link to 1.5 release notes (#7707) --- .changes/0.0.0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.changes/0.0.0.md b/.changes/0.0.0.md index f3a5e03d1a1..40386d90428 100644 --- a/.changes/0.0.0.md +++ b/.changes/0.0.0.md @@ -3,6 +3,7 @@ For information on prior major and minor releases, see their changelogs: +* [1.5](https://github.com/dbt-labs/dbt-core/blob/1.5.latest/CHANGELOG.md) * [1.4](https://github.com/dbt-labs/dbt-core/blob/1.4.latest/CHANGELOG.md) * [1.3](https://github.com/dbt-labs/dbt-core/blob/1.3.latest/CHANGELOG.md) * [1.2](https://github.com/dbt-labs/dbt-core/blob/1.2.latest/CHANGELOG.md) From 620ca40b85c1e0d8b594ba32520a50cc3ebef6a8 Mon Sep 17 00:00:00 2001 From: Doug Beatty <44704949+dbeatty10@users.noreply.github.com> Date: Fri, 26 May 2023 10:48:08 -0600 Subject: [PATCH 24/67] Add `%` to adapter suite test cases for `persist_docs` (#7699) * Test table/view/column-level comments with `%` symbol * Test docs block with `%` symbol * Changelog entry --- .changes/unreleased/Fixes-20230524-160648.yaml | 6 ++++++ tests/adapter/dbt/tests/adapter/persist_docs/fixtures.py | 7 +++++++ 2 files changed, 13 insertions(+) create mode 100644 .changes/unreleased/Fixes-20230524-160648.yaml diff --git a/.changes/unreleased/Fixes-20230524-160648.yaml b/.changes/unreleased/Fixes-20230524-160648.yaml new file mode 100644 index 00000000000..7ff7bc4a2f3 --- /dev/null +++ b/.changes/unreleased/Fixes-20230524-160648.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Add `%` to adapter suite test cases for `persist_docs` +time: 2023-05-24T16:06:48.477708-06:00 +custom: + Author: dbeatty10 + Issue: "7698" diff --git a/tests/adapter/dbt/tests/adapter/persist_docs/fixtures.py b/tests/adapter/dbt/tests/adapter/persist_docs/fixtures.py index f7179bb1ab5..fb96c07506a 100644 --- a/tests/adapter/dbt/tests/adapter/persist_docs/fixtures.py +++ b/tests/adapter/dbt/tests/adapter/persist_docs/fixtures.py @@ -13,6 +13,7 @@ and with 'single quotes' as welll as other; '''abc123''' reserved -- characters +80% of statistics are made up on the spot -- /* comment */ Some $lbl$ labeled $lbl$ and $$ unlabeled $$ dollar-quoting @@ -67,6 +68,7 @@ and with 'single quotes' as welll as other; '''abc123''' reserved -- characters + 80% of statistics are made up on the spot -- /* comment */ Some $lbl$ labeled $lbl$ and $$ unlabeled $$ dollar-quoting @@ -77,6 +79,7 @@ and with 'single quotes' as welll as other; '''abc123''' reserved -- characters + 80% of statistics are made up on the spot -- /* comment */ Some $lbl$ labeled $lbl$ and $$ unlabeled $$ dollar-quoting @@ -90,6 +93,7 @@ and with 'single quotes' as welll as other; '''abc123''' reserved -- characters + 80% of statistics are made up on the spot -- /* comment */ Some $lbl$ labeled $lbl$ and $$ unlabeled $$ dollar-quoting @@ -100,6 +104,7 @@ and with 'single quotes' as welll as other; '''abc123''' reserved -- characters + 80% of statistics are made up on the spot -- /* comment */ Some $lbl$ labeled $lbl$ and $$ unlabeled $$ dollar-quoting @@ -111,6 +116,7 @@ and with 'single quotes' as welll as other; '''abc123''' reserved -- characters + 80% of statistics are made up on the spot -- /* comment */ Some $lbl$ labeled $lbl$ and $$ unlabeled $$ dollar-quoting @@ -121,6 +127,7 @@ and with 'single quotes' as welll as other; '''abc123''' reserved -- characters + 80% of statistics are made up on the spot -- /* comment */ Some $lbl$ labeled $lbl$ and $$ unlabeled $$ dollar-quoting From ac16a55c64f2c9b085f423d1a101c34cc4c6941b Mon Sep 17 00:00:00 2001 From: Emily Rockman Date: Fri, 26 May 2023 14:51:00 -0500 Subject: [PATCH 25/67] Update to reusable workflow for branch testing (#7676) * fix overlooked node12 case with abandonded marketplace action * update slack notification * remove spaces per formatting * replace with cli dispatch * move conditional * add explicit token, temp comment out slack * add checkout * checkout teh right branch * switch to PAT * add back repo checkout * manually check workflow status * fix notification * swap to reusable workflow * fix path * swap permissions * remove trigger * fix secrets * point to main --- .github/workflows/jira-creation.yml | 2 +- .github/workflows/jira-transition.yml | 2 +- .github/workflows/release-branch-tests.yml | 71 ++-------------------- .github/workflows/triage-labels.yml | 3 +- 4 files changed, 10 insertions(+), 68 deletions(-) diff --git a/.github/workflows/jira-creation.yml b/.github/workflows/jira-creation.yml index 2c6af71b76c..79936a93a85 100644 --- a/.github/workflows/jira-creation.yml +++ b/.github/workflows/jira-creation.yml @@ -18,7 +18,7 @@ permissions: issues: write jobs: - call-label-action: + call-creation-action: uses: dbt-labs/actions/.github/workflows/jira-creation-actions.yml@main secrets: JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} diff --git a/.github/workflows/jira-transition.yml b/.github/workflows/jira-transition.yml index 1ea62467980..563d8197a8a 100644 --- a/.github/workflows/jira-transition.yml +++ b/.github/workflows/jira-transition.yml @@ -19,7 +19,7 @@ on: permissions: read-all jobs: - call-label-action: + call-transition-action: uses: dbt-labs/actions/.github/workflows/jira-transition-actions.yml@main secrets: JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} diff --git a/.github/workflows/release-branch-tests.yml b/.github/workflows/release-branch-tests.yml index 101e08a7535..8e8b13701df 100644 --- a/.github/workflows/release-branch-tests.yml +++ b/.github/workflows/release-branch-tests.yml @@ -1,11 +1,7 @@ # **what?** # The purpose of this workflow is to trigger CI to run for each # release branch and main branch on a regular cadence. If the CI workflow -# fails for a branch, it will post to dev-core-alerts to raise awareness. -# The 'aurelien-baudet/workflow-dispatch' Action triggers the existing -# CI worklow file on the given branch to run so that even if we change the -# CI workflow file in the future, the one that is tailored for the given -# release branch will be used. +# fails for a branch, it will post to #dev-core-alerts to raise awareness. # **why?** # Ensures release branches and main are always shippable and not broken. @@ -28,63 +24,8 @@ on: permissions: read-all jobs: - fetch-latest-branches: - runs-on: ubuntu-latest - - outputs: - latest-branches: ${{ steps.get-latest-branches.outputs.repo-branches }} - - steps: - - name: "Fetch dbt-core Latest Branches" - uses: dbt-labs/actions/fetch-repo-branches@v1.1.1 - id: get-latest-branches - with: - repo_name: ${{ github.event.repository.name }} - organization: "dbt-labs" - pat: ${{ secrets.GITHUB_TOKEN }} - fetch_protected_branches_only: true - regex: "^1.[0-9]+.latest$" - perform_match_method: "match" - retries: 3 - - - name: "[ANNOTATION] ${{ github.event.repository.name }} - branches to test" - run: | - title="${{ github.event.repository.name }} - branches to test" - message="The workflow will run tests for the following branches of the ${{ github.event.repository.name }} repo: ${{ steps.get-latest-branches.outputs.repo-branches }}" - echo "::notice $title::$message" - - kick-off-ci: - needs: [fetch-latest-branches] - name: Kick-off CI - runs-on: ubuntu-latest - - strategy: - # must run CI 1 branch at a time b/c the workflow-dispatch Action polls for - # latest run for results and it gets confused when we kick off multiple runs - # at once. There is a race condition so we will just run in sequential order. - max-parallel: 1 - fail-fast: false - matrix: - branch: ${{ fromJSON(needs.fetch-latest-branches.outputs.latest-branches) }} - include: - - branch: 'main' - - steps: - - name: Call CI workflow for ${{ matrix.branch }} branch - id: trigger-step - uses: aurelien-baudet/workflow-dispatch@v2 - with: - workflow: main.yml - ref: ${{ matrix.branch }} - token: ${{ secrets.FISHTOWN_BOT_PAT }} - - - name: Post failure to Slack - uses: ravsamhq/notify-slack-action@v2 - if: ${{ always() && !contains(steps.trigger-step.outputs.workflow-conclusion,'success') }} - with: - status: ${{ job.status }} - notification_title: 'dbt-core scheduled run of "${{ matrix.branch }}" branch not successful' - message_format: ':x: CI on branch "${{ matrix.branch }}" ${{ steps.trigger-step.outputs.workflow-conclusion }}' - footer: 'Linked failed CI run ${{ steps.trigger-step.outputs.workflow-url }}' - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_DEV_CORE_ALERTS }} + run_tests: + uses: dbt-labs/actions/.github/workflows/release-branch-tests.yml@main + with: + workflows_to_run: '["main.yml"]' + secrets: inherit diff --git a/.github/workflows/triage-labels.yml b/.github/workflows/triage-labels.yml index 97649a5223c..6b8d6a82f26 100644 --- a/.github/workflows/triage-labels.yml +++ b/.github/workflows/triage-labels.yml @@ -23,8 +23,9 @@ permissions: jobs: triage_label: + if: contains(github.event.issue.labels.*.name, 'awaiting_response') uses: dbt-labs/actions/.github/workflows/swap-labels.yml@main with: add_label: "triage" remove_label: "awaiting_response" - secrets: inherit # this is only acceptable because we own the action we're calling + secrets: inherit From 7e3a6eec96d55363501be4d01c0328030a1ec51b Mon Sep 17 00:00:00 2001 From: Kshitij Aranke Date: Fri, 26 May 2023 13:00:16 -0700 Subject: [PATCH 26/67] fix #7300: Enable state for deferral to be separate from state for selectors (#7690) --- .../unreleased/Features-20230523-225955.yaml | 6 ++ core/dbt/cli/main.py | 10 +++ core/dbt/cli/params.py | 15 ++++- core/dbt/task/compile.py | 8 +-- core/dbt/task/runnable.py | 12 ++-- .../defer_state/test_defer_state.py | 67 +++++++++++++++++++ 6 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 .changes/unreleased/Features-20230523-225955.yaml diff --git a/.changes/unreleased/Features-20230523-225955.yaml b/.changes/unreleased/Features-20230523-225955.yaml new file mode 100644 index 00000000000..c64e66f1b02 --- /dev/null +++ b/.changes/unreleased/Features-20230523-225955.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Enable state for deferral to be separate from state for selectors +time: 2023-05-23T22:59:55.920975-07:00 +custom: + Author: aranke + Issue: "7300" diff --git a/core/dbt/cli/main.py b/core/dbt/cli/main.py index 56ad5599a1b..47ebacf0067 100644 --- a/core/dbt/cli/main.py +++ b/core/dbt/cli/main.py @@ -179,6 +179,7 @@ def cli(ctx, **kwargs): @p.selector @p.show @p.state +@p.defer_state @p.deprecated_state @p.store_failures @p.target @@ -250,6 +251,7 @@ def docs(ctx, **kwargs): @p.selector @p.empty_catalog @p.state +@p.defer_state @p.deprecated_state @p.target @p.target_path @@ -322,6 +324,7 @@ def docs_serve(ctx, **kwargs): @p.selector @p.inline @p.state +@p.defer_state @p.deprecated_state @p.target @p.target_path @@ -368,6 +371,7 @@ def compile(ctx, **kwargs): @p.selector @p.inline @p.state +@p.defer_state @p.deprecated_state @p.target @p.target_path @@ -476,6 +480,7 @@ def init(ctx, **kwargs): @p.raw_select @p.selector @p.state +@p.defer_state @p.deprecated_state @p.target @p.target_path @@ -545,6 +550,7 @@ def parse(ctx, **kwargs): @p.select @p.selector @p.state +@p.defer_state @p.deprecated_state @p.target @p.target_path @@ -612,6 +618,7 @@ def run_operation(ctx, **kwargs): @p.selector @p.show @p.state +@p.defer_state @p.deprecated_state @p.target @p.target_path @@ -650,6 +657,7 @@ def seed(ctx, **kwargs): @p.select @p.selector @p.state +@p.defer_state @p.deprecated_state @p.target @p.target_path @@ -692,6 +700,7 @@ def source(ctx, **kwargs): @p.select @p.selector @p.state +@p.defer_state @p.deprecated_state @p.target @p.target_path @@ -738,6 +747,7 @@ def freshness(ctx, **kwargs): @p.select @p.selector @p.state +@p.defer_state @p.deprecated_state @p.store_failures @p.target diff --git a/core/dbt/cli/params.py b/core/dbt/cli/params.py index b638fc539dc..79fcb5ed811 100644 --- a/core/dbt/cli/params.py +++ b/core/dbt/cli/params.py @@ -426,7 +426,20 @@ state = click.option( "--state", envvar="DBT_STATE", - help="If set, use the given directory as the source for JSON files to compare with this project.", + help="Unless overridden, use this state directory for both state comparison and deferral.", + type=click.Path( + dir_okay=True, + file_okay=False, + readable=True, + resolve_path=True, + path_type=Path, + ), +) + +defer_state = click.option( + "--defer-state", + envvar="DBT_DEFER_STATE", + help="Override the state directory for deferral only.", type=click.Path( dir_okay=True, file_okay=False, diff --git a/core/dbt/task/compile.py b/core/dbt/task/compile.py index dbf469cd093..371191d9cc9 100644 --- a/core/dbt/task/compile.py +++ b/core/dbt/task/compile.py @@ -100,14 +100,14 @@ def _get_deferred_manifest(self) -> Optional[WritableManifest]: if not self.args.defer: return None - state = self.previous_state - if state is None: + state = self.previous_defer_state or self.previous_state + if not state: raise DbtRuntimeError( "Received a --defer argument, but no value was provided to --state" ) - if state.manifest is None: - raise DbtRuntimeError(f'Could not find manifest in --state path: "{self.args.state}"') + if not state.manifest: + raise DbtRuntimeError(f'Could not find manifest in --state path: "{state}"') return state.manifest def defer_to_manifest(self, adapter, selected_uids: AbstractSet[str]): diff --git a/core/dbt/task/runnable.py b/core/dbt/task/runnable.py index 494acf98904..70d889fe580 100644 --- a/core/dbt/task/runnable.py +++ b/core/dbt/task/runnable.py @@ -60,7 +60,6 @@ class GraphRunnableTask(ConfiguredTask): - MARK_DEPENDENT_ERRORS_STATUSES = [NodeStatus.Error] def __init__(self, args, config, manifest): @@ -72,17 +71,20 @@ def __init__(self, args, config, manifest): self.node_results = [] self.num_nodes: int = 0 self.previous_state: Optional[PreviousState] = None + self.previous_defer_state: Optional[PreviousState] = None self.run_count: int = 0 self.started_at: float = 0 - self.set_previous_state() - - def set_previous_state(self): - if self.args.state is not None: + if self.args.state: self.previous_state = PreviousState( path=self.args.state, current_path=Path(self.config.target_path) ) + if self.args.defer_state: + self.previous_defer_state = PreviousState( + path=self.args.defer_state, current_path=Path(self.config.target_path) + ) + def index_offset(self, value: int) -> int: return value diff --git a/tests/functional/defer_state/test_defer_state.py b/tests/functional/defer_state/test_defer_state.py index a50f09af0d1..d3707b45f2b 100644 --- a/tests/functional/defer_state/test_defer_state.py +++ b/tests/functional/defer_state/test_defer_state.py @@ -6,6 +6,7 @@ import pytest from dbt.cli.exceptions import DbtUsageException +from dbt.contracts.results import RunStatus from dbt.tests.util import run_dbt, write_file, rm_file from dbt.exceptions import DbtRuntimeError @@ -23,6 +24,7 @@ macros_sql, infinite_macros_sql, snapshot_sql, + view_model_now_table_sql, ) @@ -272,3 +274,68 @@ def test_run_defer_deleted_upstream(self, project, unique_schema, other_schema): ) results = run_dbt(["test", "--state", "state", "--defer", "--favor-state"]) assert other_schema not in results[0].node.compiled_code + + +class TestDeferStateFlag(BaseDeferState): + def test_defer_state_flag(self, project, unique_schema, other_schema): + project.create_test_schema(other_schema) + + # test that state deferral works correctly + run_dbt(["compile", "--target-path", "target_compile"]) + write_file(view_model_now_table_sql, "models", "table_model.sql") + + results = run_dbt(["ls", "--select", "state:modified", "--state", "target_compile"]) + assert results == ["test.table_model"] + + run_dbt(["seed", "--target", "otherschema", "--target-path", "target_otherschema"]) + + # this will fail because we haven't loaded the seed in the default schema + run_dbt( + [ + "run", + "--select", + "state:modified", + "--defer", + "--state", + "target_compile", + "--favor-state", + ], + expect_pass=False, + ) + + # this will fail because we haven't passed in --state + with pytest.raises( + DbtRuntimeError, match="Got a state selector method, but no comparison manifest" + ): + run_dbt( + [ + "run", + "--select", + "state:modified", + "--defer", + "--defer-state", + "target_otherschema", + "--favor-state", + ], + expect_pass=False, + ) + + # this will succeed because we've loaded the seed in other schema and are successfully deferring to it instead + results = run_dbt( + [ + "run", + "--select", + "state:modified", + "--defer", + "--state", + "target_compile", + "--defer-state", + "target_otherschema", + "--favor-state", + ] + ) + + assert len(results.results) == 1 + assert results.results[0].status == RunStatus.Success + assert results.results[0].node.name == "table_model" + assert results.results[0].adapter_response["rows_affected"] == 2 From 38ca4fce2522aca496a72ccb704472d5bdf85908 Mon Sep 17 00:00:00 2001 From: Gerda Shank Date: Fri, 26 May 2023 18:50:38 -0400 Subject: [PATCH 27/67] Target path should be relative to project dir, rather than current working directory (#7706) --- .../unreleased/Fixes-20230525-165053.yaml | 6 ++++ core/dbt/cli/params.py | 4 +-- core/dbt/cli/requires.py | 2 +- core/dbt/compilation.py | 13 ++++---- core/dbt/config/project.py | 5 +++ core/dbt/context/providers.py | 3 +- core/dbt/contracts/graph/nodes.py | 14 +++++--- core/dbt/contracts/state.py | 16 ++++++---- core/dbt/parser/manifest.py | 10 ++---- core/dbt/task/compile.py | 2 +- core/dbt/task/freshness.py | 2 +- core/dbt/task/generate.py | 10 +++--- core/dbt/task/run_operation.py | 2 +- core/dbt/task/runnable.py | 12 ++++--- core/dbt/task/serve.py | 2 +- test/unit/test_graph_selector_methods.py | 4 ++- tests/functional/configs/test_configs.py | 6 ++-- .../defer_state/test_defer_state.py | 32 +++++++++++-------- .../multi_project/test_publication.py | 4 --- 19 files changed, 89 insertions(+), 60 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230525-165053.yaml diff --git a/.changes/unreleased/Fixes-20230525-165053.yaml b/.changes/unreleased/Fixes-20230525-165053.yaml new file mode 100644 index 00000000000..89dcd6ddf60 --- /dev/null +++ b/.changes/unreleased/Fixes-20230525-165053.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Incorrect paths used for "target" and "state" directories +time: 2023-05-25T16:50:53.718564-04:00 +custom: + Author: gshank + Issue: "7465" diff --git a/core/dbt/cli/params.py b/core/dbt/cli/params.py index 79fcb5ed811..5100ca5dfce 100644 --- a/core/dbt/cli/params.py +++ b/core/dbt/cli/params.py @@ -431,7 +431,7 @@ dir_okay=True, file_okay=False, readable=True, - resolve_path=True, + resolve_path=False, path_type=Path, ), ) @@ -444,7 +444,7 @@ dir_okay=True, file_okay=False, readable=True, - resolve_path=True, + resolve_path=False, path_type=Path, ), ) diff --git a/core/dbt/cli/requires.py b/core/dbt/cli/requires.py index 5fa2f8c9256..340fc2380fe 100644 --- a/core/dbt/cli/requires.py +++ b/core/dbt/cli/requires.py @@ -247,7 +247,7 @@ def wrapper(*args, **kwargs): ctx.obj["manifest"] = manifest if write and ctx.obj["flags"].write_json: - write_manifest(manifest, ctx.obj["runtime_config"].target_path) + write_manifest(manifest, ctx.obj["runtime_config"].project_target_path) return func(*args, **kwargs) diff --git a/core/dbt/compilation.py b/core/dbt/compilation.py index 12b7a4cc14a..c45713b786e 100644 --- a/core/dbt/compilation.py +++ b/core/dbt/compilation.py @@ -272,7 +272,7 @@ def __init__(self, config): self.config = config def initialize(self): - make_directory(self.config.target_path) + make_directory(self.config.project_target_path) make_directory(self.config.packages_install_path) # creates a ModelContext which is converted to @@ -512,7 +512,9 @@ def compile(self, manifest: Manifest, write=True, add_test_edges=False) -> Graph # including the test edges. summaries["with_test_edges"] = linker.get_graph_summary(manifest) - with open(os.path.join(self.config.target_path, "graph_summary.json"), "w") as out_stream: + with open( + os.path.join(self.config.project_target_path, "graph_summary.json"), "w" + ) as out_stream: try: out_stream.write(json.dumps(summaries)) except Exception as e: # This is non-essential information, so merely note failures. @@ -539,7 +541,7 @@ def compile(self, manifest: Manifest, write=True, add_test_edges=False) -> Graph def write_graph_file(self, linker: Linker, manifest: Manifest): filename = graph_file_name - graph_path = os.path.join(self.config.target_path, filename) + graph_path = os.path.join(self.config.project_target_path, filename) flags = get_flags() if flags.WRITE_JSON: linker.write_graph(graph_path, manifest) @@ -554,9 +556,8 @@ def _write_node(self, node: ManifestSQLNode) -> ManifestSQLNode: fire_event(WritingInjectedSQLForNode(node_info=get_node_info())) if node.compiled_code: - node.compiled_path = node.write_node( - self.config.target_path, "compiled", node.compiled_code - ) + node.compiled_path = node.get_target_write_path(self.config.target_path, "compiled") + node.write_node(self.config.project_root, node.compiled_path, node.compiled_code) return node def compile_node( diff --git a/core/dbt/config/project.py b/core/dbt/config/project.py index 76a3980e26a..96705c7ccb0 100644 --- a/core/dbt/config/project.py +++ b/core/dbt/config/project.py @@ -700,3 +700,8 @@ def get_macro_search_order(self, macro_namespace: str): if dispatch_entry["macro_namespace"] == macro_namespace: return dispatch_entry["search_order"] return None + + @property + def project_target_path(self): + # If target_path is absolute, project_root will not be included + return os.path.join(self.project_root, self.target_path) diff --git a/core/dbt/context/providers.py b/core/dbt/context/providers.py index 8a74cc08d1e..fe279a7fd3f 100644 --- a/core/dbt/context/providers.py +++ b/core/dbt/context/providers.py @@ -833,7 +833,8 @@ def write(self, payload: str) -> str: # macros/source defs aren't 'writeable'. if isinstance(self.model, (Macro, SourceDefinition)): raise MacrosSourcesUnWriteableError(node=self.model) - self.model.build_path = self.model.write_node(self.config.target_path, "run", payload) + self.model.build_path = self.model.get_target_write_path(self.config.target_path, "run") + self.model.write_node(self.config.project_root, self.model.build_path, payload) return "" @contextmember diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 4529599b596..9d5701c65a6 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -345,17 +345,23 @@ class ParsedNode(NodeInfoMixin, ParsedNodeMandatory, SerializableType): relation_name: Optional[str] = None raw_code: str = "" - def write_node(self, target_path: str, subdirectory: str, payload: str): + def get_target_write_path(self, target_path: str, subdirectory: str): + # This is called for both the "compiled" subdirectory of "target" and the "run" subdirectory if os.path.basename(self.path) == os.path.basename(self.original_file_path): # One-to-one relationship of nodes to files. path = self.original_file_path else: # Many-to-one relationship of nodes to files. path = os.path.join(self.original_file_path, self.path) - full_path = os.path.join(target_path, subdirectory, self.package_name, path) + target_write_path = os.path.join(target_path, subdirectory, self.package_name, path) + return target_write_path - write_file(full_path, payload) - return full_path + def write_node(self, project_root: str, compiled_path, compiled_code: str): + if os.path.isabs(compiled_path): + full_path = compiled_path + else: + full_path = os.path.join(project_root, compiled_path) + write_file(full_path, compiled_code) def _serialize(self): return self.to_dict() diff --git a/core/dbt/contracts/state.py b/core/dbt/contracts/state.py index cb135e241ac..bd9f389b602 100644 --- a/core/dbt/contracts/state.py +++ b/core/dbt/contracts/state.py @@ -7,15 +7,17 @@ class PreviousState: - def __init__(self, path: Path, current_path: Path): - self.path: Path = path - self.current_path: Path = current_path + def __init__(self, state_path: Path, target_path: Path, project_root: Path): + self.state_path: Path = state_path + self.target_path: Path = target_path + self.project_root: Path = project_root self.manifest: Optional[WritableManifest] = None self.results: Optional[RunResultsArtifact] = None self.sources: Optional[FreshnessExecutionResultArtifact] = None self.sources_current: Optional[FreshnessExecutionResultArtifact] = None - manifest_path = self.path / "manifest.json" + # Note: if state_path is absolute, project_root will be ignored. + manifest_path = self.project_root / self.state_path / "manifest.json" if manifest_path.exists() and manifest_path.is_file(): try: self.manifest = WritableManifest.read_and_check_versions(str(manifest_path)) @@ -23,7 +25,7 @@ def __init__(self, path: Path, current_path: Path): exc.add_filename(str(manifest_path)) raise - results_path = self.path / "run_results.json" + results_path = self.project_root / self.state_path / "run_results.json" if results_path.exists() and results_path.is_file(): try: self.results = RunResultsArtifact.read_and_check_versions(str(results_path)) @@ -31,7 +33,7 @@ def __init__(self, path: Path, current_path: Path): exc.add_filename(str(results_path)) raise - sources_path = self.path / "sources.json" + sources_path = self.project_root / self.state_path / "sources.json" if sources_path.exists() and sources_path.is_file(): try: self.sources = FreshnessExecutionResultArtifact.read_and_check_versions( @@ -41,7 +43,7 @@ def __init__(self, path: Path, current_path: Path): exc.add_filename(str(sources_path)) raise - sources_current_path = self.current_path / "sources.json" + sources_current_path = self.project_root / self.target_path / "sources.json" if sources_current_path.exists() and sources_current_path.is_file(): try: self.sources_current = FreshnessExecutionResultArtifact.read_and_check_versions( diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index 50ce0430a06..414867c96cd 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -326,7 +326,7 @@ def get_full_manifest( loader.track_project_load() if write_perf_info: - loader.write_perf_info(config.target_path) + loader.write_perf_info(config.project_target_path) return manifest @@ -729,9 +729,7 @@ def macro_depends_on(self): macro.depends_on.add_macro(dep_macro_id) # will check for dupes def write_manifest_for_partial_parse(self): - path = os.path.join( - self.root_project.project_root, self.root_project.target_path, PARTIAL_PARSE_FILE_NAME - ) + path = os.path.join(self.root_project.project_target_path, PARTIAL_PARSE_FILE_NAME) try: # This shouldn't be necessary, but we have gotten bug reports (#3757) of the # saved manifest not matching the code version. @@ -944,9 +942,7 @@ def read_manifest_for_partial_parse(self) -> Optional[Manifest]: if not get_flags().PARTIAL_PARSE: fire_event(PartialParsingNotEnabled()) return None - path = os.path.join( - self.root_project.project_root, self.root_project.target_path, PARTIAL_PARSE_FILE_NAME - ) + path = os.path.join(self.root_project.project_target_path, PARTIAL_PARSE_FILE_NAME) reparse_reason = None diff --git a/core/dbt/task/compile.py b/core/dbt/task/compile.py index 371191d9cc9..1e6ecce7ee4 100644 --- a/core/dbt/task/compile.py +++ b/core/dbt/task/compile.py @@ -125,7 +125,7 @@ def defer_to_manifest(self, adapter, selected_uids: AbstractSet[str]): favor_state=bool(self.args.favor_state), ) # TODO: is it wrong to write the manifest here? I think it's right... - write_manifest(self.manifest, self.config.target_path) + write_manifest(self.manifest, self.config.project_target_path) def _runtime_initialize(self): if getattr(self.args, "inline", None): diff --git a/core/dbt/task/freshness.py b/core/dbt/task/freshness.py index d662e35dd66..32f09dd7470 100644 --- a/core/dbt/task/freshness.py +++ b/core/dbt/task/freshness.py @@ -159,7 +159,7 @@ def result_path(self): if self.args.output: return os.path.realpath(self.args.output) else: - return os.path.join(self.config.target_path, RESULT_FILE_NAME) + return os.path.join(self.config.project_target_path, RESULT_FILE_NAME) def raise_on_first_error(self): return False diff --git a/core/dbt/task/generate.py b/core/dbt/task/generate.py index 204d64d7ccd..5e21213e8fb 100644 --- a/core/dbt/task/generate.py +++ b/core/dbt/task/generate.py @@ -214,10 +214,12 @@ def run(self) -> CatalogArtifact: compile_results=compile_results, ) - shutil.copyfile(DOCS_INDEX_FILE_PATH, os.path.join(self.config.target_path, "index.html")) + shutil.copyfile( + DOCS_INDEX_FILE_PATH, os.path.join(self.config.project_target_path, "index.html") + ) for asset_path in self.config.asset_paths: - to_asset_path = os.path.join(self.config.target_path, asset_path) + to_asset_path = os.path.join(self.config.project_target_path, asset_path) if os.path.exists(to_asset_path): shutil.rmtree(to_asset_path) @@ -257,10 +259,10 @@ def run(self) -> CatalogArtifact: errors=errors, ) - path = os.path.join(self.config.target_path, CATALOG_FILENAME) + path = os.path.join(self.config.project_target_path, CATALOG_FILENAME) results.write(path) if self.args.compile: - write_manifest(self.manifest, self.config.target_path) + write_manifest(self.manifest, self.config.project_target_path) if exceptions: fire_event(WriteCatalogFailure(num_exceptions=len(exceptions))) diff --git a/core/dbt/task/run_operation.py b/core/dbt/task/run_operation.py index beac272de9a..c614aeda54c 100644 --- a/core/dbt/task/run_operation.py +++ b/core/dbt/task/run_operation.py @@ -101,7 +101,7 @@ def run(self) -> RunResultsArtifact: results=[run_result], ) - result_path = os.path.join(self.config.target_path, RESULT_FILE_NAME) + result_path = os.path.join(self.config.project_target_path, RESULT_FILE_NAME) if self.args.write_json: results.write(result_path) diff --git a/core/dbt/task/runnable.py b/core/dbt/task/runnable.py index 70d889fe580..e3de59df771 100644 --- a/core/dbt/task/runnable.py +++ b/core/dbt/task/runnable.py @@ -77,12 +77,16 @@ def __init__(self, args, config, manifest): if self.args.state: self.previous_state = PreviousState( - path=self.args.state, current_path=Path(self.config.target_path) + state_path=self.args.state, + target_path=Path(self.config.target_path), + project_root=Path(self.config.project_root), ) if self.args.defer_state: self.previous_defer_state = PreviousState( - path=self.args.defer_state, current_path=Path(self.config.target_path) + state_path=self.args.defer_state, + target_path=Path(self.config.target_path), + project_root=Path(self.config.project_root), ) def index_offset(self, value: int) -> int: @@ -158,7 +162,7 @@ def get_runner_type(self, node): raise NotImplementedError("Not Implemented") def result_path(self): - return os.path.join(self.config.target_path, RESULT_FILE_NAME) + return os.path.join(self.config.project_target_path, RESULT_FILE_NAME) def get_runner(self, node): adapter = get_adapter(self.config) @@ -457,7 +461,7 @@ def run(self): ) if self.args.write_json: - write_manifest(self.manifest, self.config.target_path) + write_manifest(self.manifest, self.config.project_target_path) if hasattr(result, "write"): result.write(self.result_path()) diff --git a/core/dbt/task/serve.py b/core/dbt/task/serve.py index 696be89a37f..060c4c93d17 100644 --- a/core/dbt/task/serve.py +++ b/core/dbt/task/serve.py @@ -12,7 +12,7 @@ class ServeTask(ConfiguredTask): def run(self): - os.chdir(self.config.target_path) + os.chdir(self.config.project_target_path) shutil.copyfile(DOCS_INDEX_FILE_PATH, "index.html") port = self.args.port diff --git a/test/unit/test_graph_selector_methods.py b/test/unit/test_graph_selector_methods.py index 380073fd19f..5bc881747da 100644 --- a/test/unit/test_graph_selector_methods.py +++ b/test/unit/test_graph_selector_methods.py @@ -1202,7 +1202,9 @@ def test_select_metric(manifest): def previous_state(manifest): writable = copy.deepcopy(manifest).writable_manifest() state = PreviousState( - path=Path("/path/does/not/exist"), current_path=Path("/path/does/not/exist") + state_path=Path("/path/does/not/exist"), + target_path=Path("/path/does/not/exist"), + project_root=Path("/path/does/not/exist"), ) state.manifest = writable return state diff --git a/tests/functional/configs/test_configs.py b/tests/functional/configs/test_configs.py index 086ef455f18..49a3222910a 100644 --- a/tests/functional/configs/test_configs.py +++ b/tests/functional/configs/test_configs.py @@ -58,11 +58,13 @@ def project_config_update(self): } def test_alternative_target_paths(self, project): + # chdir to a different directory to test creation of target directory under project_root + os.chdir(project.profiles_dir) run_dbt(["seed"]) target_path = "" - for d in os.listdir("."): - if os.path.isdir(d) and d.startswith("target_"): + for d in os.listdir(project.project_root): + if os.path.isdir(os.path.join(project.project_root, d)) and d.startswith("target_"): target_path = d assert os.path.exists(os.path.join(project.project_root, target_path, "manifest.json")) diff --git a/tests/functional/defer_state/test_defer_state.py b/tests/functional/defer_state/test_defer_state.py index d3707b45f2b..960b517c490 100644 --- a/tests/functional/defer_state/test_defer_state.py +++ b/tests/functional/defer_state/test_defer_state.py @@ -79,12 +79,15 @@ def profiles_config_update(self, dbt_profile_target, unique_schema, other_schema outputs["otherschema"]["schema"] = other_schema return {"test": {"outputs": outputs, "target": "default"}} - def copy_state(self): - if not os.path.exists("state"): - os.makedirs("state") - shutil.copyfile("target/manifest.json", "state/manifest.json") + def copy_state(self, project_root): + state_path = os.path.join(project_root, "state") + if not os.path.exists(state_path): + os.makedirs(state_path) + shutil.copyfile( + f"{project_root}/target/manifest.json", f"{project_root}/state/manifest.json" + ) - def run_and_save_state(self): + def run_and_save_state(self, project_root): results = run_dbt(["seed"]) assert len(results) == 1 assert not any(r.node.deferred for r in results) @@ -95,7 +98,7 @@ def run_and_save_state(self): assert len(results) == 2 # copy files - self.copy_state() + self.copy_state(project_root) class TestDeferStateUnsupportedCommands(BaseDeferState): @@ -112,9 +115,12 @@ def test_no_state(self, project): class TestRunCompileState(BaseDeferState): def test_run_and_compile_defer(self, project): - self.run_and_save_state() + self.run_and_save_state(project.project_root) # defer test, it succeeds + # Change directory to ensure that state directory is underneath + # project directory. + os.chdir(project.profiles_dir) results = run_dbt(["compile", "--state", "state", "--defer"]) assert len(results.results) == 6 assert results.results[0].node.name == "seed" @@ -122,11 +128,11 @@ def test_run_and_compile_defer(self, project): class TestSnapshotState(BaseDeferState): def test_snapshot_state_defer(self, project): - self.run_and_save_state() + self.run_and_save_state(project.project_root) # snapshot succeeds without --defer run_dbt(["snapshot"]) # copy files - self.copy_state() + self.copy_state(project.project_root) # defer test, it succeeds run_dbt(["snapshot", "--state", "state", "--defer"]) # favor_state test, it succeeds @@ -136,7 +142,7 @@ def test_snapshot_state_defer(self, project): class TestRunDeferState(BaseDeferState): def test_run_and_defer(self, project, unique_schema, other_schema): project.create_test_schema(other_schema) - self.run_and_save_state() + self.run_and_save_state(project.project_root) # test tests first, because run will change things # no state, wrong schema, failure. @@ -188,7 +194,7 @@ def test_run_and_defer(self, project, unique_schema, other_schema): class TestRunDeferStateChangedModel(BaseDeferState): def test_run_defer_state_changed_model(self, project): - self.run_and_save_state() + self.run_and_save_state(project.project_root) # change "view_model" write_file(changed_view_model_sql, "models", "view_model.sql") @@ -217,7 +223,7 @@ def test_run_defer_state_changed_model(self, project): class TestRunDeferStateIFFNotExists(BaseDeferState): def test_run_defer_iff_not_exists(self, project, unique_schema, other_schema): project.create_test_schema(other_schema) - self.run_and_save_state() + self.run_and_save_state(project.project_root) results = run_dbt(["seed", "--target", "otherschema"]) assert len(results) == 1 @@ -240,7 +246,7 @@ def test_run_defer_iff_not_exists(self, project, unique_schema, other_schema): class TestDeferStateDeletedUpstream(BaseDeferState): def test_run_defer_deleted_upstream(self, project, unique_schema, other_schema): project.create_test_schema(other_schema) - self.run_and_save_state() + self.run_and_save_state(project.project_root) # remove "ephemeral_model" + change "table_model" rm_file("models", "ephemeral_model.sql") diff --git a/tests/functional/multi_project/test_publication.py b/tests/functional/multi_project/test_publication.py index 754d02dc73e..c8e3fc6fc9c 100644 --- a/tests/functional/multi_project/test_publication.py +++ b/tests/functional/multi_project/test_publication.py @@ -1,6 +1,5 @@ import json import pytest -import os from dbt.tests.util import ( run_dbt, @@ -241,8 +240,6 @@ def models_alt(self): def test_multi_projects(self, project, project_alt): # run the alternate project by using the alternate project root - # (There is currently a bug where project-dir requires a chdir to work.) - os.chdir(project_alt.project_root) results, log_output = run_dbt_and_capture( ["--debug", "--log-format=json", "run", "--project-dir", str(project_alt.project_root)] ) @@ -255,7 +252,6 @@ def test_multi_projects(self, project, project_alt): assert len(publication.public_models) == 1 # run the base project - os.chdir(project.project_root) write_file(dependencies_alt_yml, project.project_root, "dependencies.yml") results = run_dbt( ["run", "--project-dir", str(project.project_root)], publications=[publication] From 1ac6df09964dd68b149668e647cf9baf93b1e0a3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 27 May 2023 22:10:38 -0400 Subject: [PATCH 28/67] Adding performance modeling for 1.2.0 to refs/heads/main (#7560) * adding performance baseline for 1.2.0 * Adding newline --------- Co-authored-by: Github Build Bot Co-authored-by: leahwicz <60146280+leahwicz@users.noreply.github.com> --- performance/baselines/1.2.0/parse___01_2000_simple_models.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 performance/baselines/1.2.0/parse___01_2000_simple_models.json diff --git a/performance/baselines/1.2.0/parse___01_2000_simple_models.json b/performance/baselines/1.2.0/parse___01_2000_simple_models.json new file mode 100644 index 00000000000..c235a904aa3 --- /dev/null +++ b/performance/baselines/1.2.0/parse___01_2000_simple_models.json @@ -0,0 +1 @@ +{"version":"1.2.0","metric":{"name":"parse","project_name":"01_2000_simple_models"},"ts":"2023-05-09T13:49:21.773314639Z","measurement":{"command":"dbt parse --no-version-check --profiles-dir ../../project_config/","mean":44.19299478025,"stddev":0.2429047068802047,"median":44.17483035975,"user":43.4559033,"system":0.5913923200000001,"min":43.81193651175,"max":44.61466355675,"times":[44.597056272749995,43.96855886975,43.90405755675,44.14156308475,44.49939515775,44.11553658675,44.30173547275,43.932534850749995,43.843978513749995,44.08611205475,43.99133546975,44.39880287075,44.20809763475,44.10553540675,43.81193651175,44.24880915975,44.408731260749995,44.61466355675,44.31538149475,44.36607381875]}} From 9c7e01dbcac5c3a5071deb5e72250c25b646e835 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Tue, 30 May 2023 12:04:49 -0400 Subject: [PATCH 29/67] Readd exp_path for config deprecation warnings (#7536) --- .changes/unreleased/Fixes-20230506-180900.yaml | 6 ++++++ core/dbt/config/project.py | 8 ++++---- core/dbt/events/types.py | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230506-180900.yaml diff --git a/.changes/unreleased/Fixes-20230506-180900.yaml b/.changes/unreleased/Fixes-20230506-180900.yaml new file mode 100644 index 00000000000..b7159138625 --- /dev/null +++ b/.changes/unreleased/Fixes-20230506-180900.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Fix warning messages for deprecated dbt_project.yml configs +time: 2023-05-06T18:09:00.361961+02:00 +custom: + Author: jtcohen6 + Issue: "7424" diff --git a/core/dbt/config/project.py b/core/dbt/config/project.py index 96705c7ccb0..f3723e41eb7 100644 --- a/core/dbt/config/project.py +++ b/core/dbt/config/project.py @@ -315,10 +315,10 @@ def check_config_path( # this field is no longer supported, but many projects may specify it with the default value # if so, let's only raise this deprecation warning if they set a custom value if not default_value or project_dict[deprecated_path] != default_value: - deprecations.warn( - f"project-config-{deprecated_path}", - deprecated_path=deprecated_path, - ) + kwargs = {"deprecated_path": deprecated_path} + if expected_path: + kwargs.update({"exp_path": expected_path}) + deprecations.warn(f"project-config-{deprecated_path}", **kwargs) def create_project(self, rendered: RenderComponents) -> "Project": unrendered = RenderComponents( diff --git a/core/dbt/events/types.py b/core/dbt/events/types.py index ab86dce9b19..8b976cc86a1 100644 --- a/core/dbt/events/types.py +++ b/core/dbt/events/types.py @@ -281,7 +281,7 @@ def code(self): def message(self): description = ( - f"The `{self.deprecated_path}` config has been renamed to `{self.exp_path}`." + f"The `{self.deprecated_path}` config has been renamed to `{self.exp_path}`. " "Please update your `dbt_project.yml` configuration to reflect this change." ) return line_wrap_message(warning_tag(f"Deprecated functionality\n\n{description}")) @@ -293,7 +293,7 @@ def code(self): def message(self): description = ( - f"The `{self.deprecated_path}` config has been renamed to `{self.exp_path}`." + f"The `{self.deprecated_path}` config has been renamed to `{self.exp_path}`. " "Please update your `dbt_project.yml` configuration to reflect this change." ) return line_wrap_message(warning_tag(f"Deprecated functionality\n\n{description}")) From fd301a38dbb66a4655e1c0d23e52e6ec832ca9ca Mon Sep 17 00:00:00 2001 From: Sam Debruyn Date: Tue, 30 May 2023 18:12:57 +0200 Subject: [PATCH 30/67] Dropped support for Python 3.7 (#7623) --- .../unreleased/Breaking Changes-20230515-053148.yaml | 6 ++++++ .github/workflows/main.yml | 4 ++-- CONTRIBUTING.md | 4 ++-- Dockerfile.test | 7 ------- core/setup.py | 10 ++++------ plugins/postgres/setup.py | 7 +++---- tests/adapter/setup.py | 9 +++++---- tox.ini | 4 ++-- 8 files changed, 24 insertions(+), 27 deletions(-) create mode 100644 .changes/unreleased/Breaking Changes-20230515-053148.yaml diff --git a/.changes/unreleased/Breaking Changes-20230515-053148.yaml b/.changes/unreleased/Breaking Changes-20230515-053148.yaml new file mode 100644 index 00000000000..578fbed36b3 --- /dev/null +++ b/.changes/unreleased/Breaking Changes-20230515-053148.yaml @@ -0,0 +1,6 @@ +kind: Breaking Changes +body: Dropped support for Python 3.7 +time: 2023-05-15T05:31:48.375649+02:00 +custom: + Author: sdebruyn + Issue: "7082" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 13274dbcd61..5f21e5f7047 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -69,7 +69,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.9", "3.10", "3.11"] env: TOXENV: "unit" @@ -116,7 +116,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.9", "3.10", "3.11"] os: [ubuntu-20.04] include: - python-version: 3.8 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 893979fd9ac..7643483f3d6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -56,7 +56,7 @@ There are some tools that will be helpful to you in developing locally. While th These are the tools used in `dbt-core` development and testing: -- [`tox`](https://tox.readthedocs.io/en/latest/) to manage virtualenvs across python versions. We currently target the latest patch releases for Python 3.7, 3.8, 3.9, 3.10 and 3.11 +- [`tox`](https://tox.readthedocs.io/en/latest/) to manage virtualenvs across python versions. We currently target the latest patch releases for Python 3.8, 3.9, 3.10 and 3.11 - [`pytest`](https://docs.pytest.org/en/latest/) to define, discover, and run tests - [`flake8`](https://flake8.pycqa.org/en/latest/) for code linting - [`black`](https://github.com/psf/black) for code formatting @@ -163,7 +163,7 @@ suites. #### `tox` -[`tox`](https://tox.readthedocs.io/en/latest/) takes care of managing virtualenvs and install dependencies in order to run tests. You can also run tests in parallel, for example, you can run unit tests for Python 3.7, Python 3.8, Python 3.9, Python 3.10 and Python 3.11 checks in parallel with `tox -p`. Also, you can run unit tests for specific python versions with `tox -e py37`. The configuration for these tests in located in `tox.ini`. +[`tox`](https://tox.readthedocs.io/en/latest/) takes care of managing virtualenvs and install dependencies in order to run tests. You can also run tests in parallel, for example, you can run unit tests for Python 3.8, Python 3.9, Python 3.10 and Python 3.11 checks in parallel with `tox -p`. Also, you can run unit tests for specific python versions with `tox -e py38`. The configuration for these tests in located in `tox.ini`. #### `pytest` diff --git a/Dockerfile.test b/Dockerfile.test index da175a1ee37..788157a769a 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -33,13 +33,6 @@ RUN apt-get update \ python \ python-dev \ python3-pip \ - python3.6 \ - python3.6-dev \ - python3-pip \ - python3.6-venv \ - python3.7 \ - python3.7-dev \ - python3.7-venv \ python3.8 \ python3.8-dev \ python3.8-venv \ diff --git a/core/setup.py b/core/setup.py index 643d2dd030c..0c4167998de 100644 --- a/core/setup.py +++ b/core/setup.py @@ -2,9 +2,9 @@ import os import sys -if sys.version_info < (3, 7, 2): +if sys.version_info < (3, 8): print("Error: dbt does not support this version of Python.") - print("Please upgrade to Python 3.7.2 or higher.") + print("Please upgrade to Python 3.8 or higher.") sys.exit(1) @@ -55,8 +55,7 @@ "logbook>=1.5,<1.6", "mashumaro[msgpack]==3.6", "minimal-snowplow-tracker==0.0.2", - "networkx>=2.3,<2.8.1;python_version<'3.8'", - "networkx>=2.3,<3;python_version>='3.8'", + "networkx>=2.3,<3", "packaging>20.9", "sqlparse>=0.2.3,<0.4.4", "dbt-extractor~=0.4.1", @@ -79,11 +78,10 @@ "Operating System :: Microsoft :: Windows", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", ], - python_requires=">=3.7.2", + python_requires=">=3.8", ) diff --git a/plugins/postgres/setup.py b/plugins/postgres/setup.py index 370347a9608..d8d39372875 100644 --- a/plugins/postgres/setup.py +++ b/plugins/postgres/setup.py @@ -2,9 +2,9 @@ import os import sys -if sys.version_info < (3, 7): +if sys.version_info < (3, 8): print("Error: dbt does not support this version of Python.") - print("Please upgrade to Python 3.7 or higher.") + print("Please upgrade to Python 3.8 or higher.") sys.exit(1) @@ -79,11 +79,10 @@ def _dbt_psycopg2_name(): "Operating System :: Microsoft :: Windows", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", ], - python_requires=">=3.7", + python_requires=">=3.8", ) diff --git a/tests/adapter/setup.py b/tests/adapter/setup.py index 50185134302..89cf278eb1f 100644 --- a/tests/adapter/setup.py +++ b/tests/adapter/setup.py @@ -2,9 +2,9 @@ import os import sys -if sys.version_info < (3, 7): +if sys.version_info < (3, 8): print("Error: dbt does not support this version of Python.") - print("Please upgrade to Python 3.7 or higher.") + print("Please upgrade to Python 3.8 or higher.") sys.exit(1) @@ -48,9 +48,10 @@ "Operating System :: Microsoft :: Windows", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", ], - python_requires=">=3.7", + python_requires=">=3.8", ) diff --git a/tox.ini b/tox.ini index 79b072d35d4..97d9a488f30 100644 --- a/tox.ini +++ b/tox.ini @@ -2,7 +2,7 @@ skipsdist = True envlist = unit,integration -[testenv:{unit,py37,py38,py39,py310,py311,py}] +[testenv:{unit,py38,py39,py310,py311,py}] description = unit testing download = true skip_install = true @@ -16,7 +16,7 @@ deps = -rdev-requirements.txt -reditable-requirements.txt -[testenv:{integration,py37-integration,py38-integration,py39-integration,py310-integration,py311-integration,py-integration}] +[testenv:{integration,py38-integration,py39-integration,py310-integration,py311-integration,py-integration}] description = functional testing download = true skip_install = true From 00a531d9d644e6bead6a209bc053b05ae02e48f6 Mon Sep 17 00:00:00 2001 From: Peter Webb Date: Tue, 30 May 2023 12:48:47 -0400 Subject: [PATCH 31/67] Template rendering optimization (#7451) * CT-2478: Template rendering optimization * CT-2478: Fix type annotation, and accomodate non-string unit test cases. --- .../unreleased/Features-20230424-163611.yaml | 6 +++++ core/dbt/clients/jinja.py | 22 +++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 .changes/unreleased/Features-20230424-163611.yaml diff --git a/.changes/unreleased/Features-20230424-163611.yaml b/.changes/unreleased/Features-20230424-163611.yaml new file mode 100644 index 00000000000..c27cc29f673 --- /dev/null +++ b/.changes/unreleased/Features-20230424-163611.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Optimize template rendering for common parse scenarios +time: 2023-04-24T16:36:11.24088-04:00 +custom: + Author: peterallenwebb + Issue: "7449" diff --git a/core/dbt/clients/jinja.py b/core/dbt/clients/jinja.py index 9674a1265e6..ca7814792b1 100644 --- a/core/dbt/clients/jinja.py +++ b/core/dbt/clients/jinja.py @@ -565,6 +565,8 @@ def _requote_result(raw_value: str, rendered: str) -> str: # is small enough that I've just chosen the more readable option. _HAS_RENDER_CHARS_PAT = re.compile(r"({[{%#]|[#}%]})") +_render_cache: Dict[str, Any] = dict() + def get_rendered( string: str, @@ -572,15 +574,21 @@ def get_rendered( node=None, capture_macros: bool = False, native: bool = False, -) -> str: +) -> Any: # performance optimization: if there are no jinja control characters in the # string, we can just return the input. Fall back to jinja if the type is # not a string or if native rendering is enabled (so '1' -> 1, etc...) # If this is desirable in the native env as well, we could handle the # native=True case by passing the input string to ast.literal_eval, like # the native renderer does. - if not native and isinstance(string, str) and _HAS_RENDER_CHARS_PAT.search(string) is None: - return string + has_render_chars = not isinstance(string, str) or _HAS_RENDER_CHARS_PAT.search(string) + + if not has_render_chars: + if not native: + return string + elif string in _render_cache: + return _render_cache[string] + template = get_template( string, ctx, @@ -588,7 +596,13 @@ def get_rendered( capture_macros=capture_macros, native=native, ) - return render_template(template, ctx, node) + + rendered = render_template(template, ctx, node) + + if not has_render_chars and native: + _render_cache[string] = rendered + + return rendered def undefined_error(msg) -> NoReturn: From 45d614533f0c7de81e20488c75c707262c9312e1 Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Tue, 30 May 2023 13:50:36 -0700 Subject: [PATCH 32/67] fix StopIteration error when publication not found (#7710) --- .../unreleased/Fixes-20230526-153738.yaml | 6 ++++ core/dbt/contracts/publication.py | 2 -- core/dbt/parser/manifest.py | 28 ++++++++++--------- .../multi_project/test_publication.py | 6 +++- 4 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230526-153738.yaml diff --git a/.changes/unreleased/Fixes-20230526-153738.yaml b/.changes/unreleased/Fixes-20230526-153738.yaml new file mode 100644 index 00000000000..6fe6929898c --- /dev/null +++ b/.changes/unreleased/Fixes-20230526-153738.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: fix StopIteration error when publication for project not found +time: 2023-05-26T15:37:38.952939-04:00 +custom: + Author: michelleark + Issue: "7711" diff --git a/core/dbt/contracts/publication.py b/core/dbt/contracts/publication.py index d6cfa67b751..ca201503888 100644 --- a/core/dbt/contracts/publication.py +++ b/core/dbt/contracts/publication.py @@ -97,8 +97,6 @@ class PublicationMandatory: @dataclass @schema_version("publication", 1) class PublicationArtifact(ArtifactMixin, PublicationMandatory): - """This represents the _publication.json artifact""" - public_models: Dict[str, PublicModel] = field(default_factory=dict) metadata: PublicationMetadata = field(default_factory=PublicationMetadata) # list of project name strings diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index 414867c96cd..bc6c9233388 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -243,7 +243,11 @@ def __init__( self.root_project: RuntimeConfig = root_project self.all_projects: Mapping[str, Project] = all_projects self.file_diff = file_diff - self.publications = publications + self.publications: Mapping[str, PublicationArtifact] = ( + {publication.project_name: publication for publication in publications} + if publications + else {} + ) self.manifest: Manifest = Manifest() self.new_manifest = self.manifest self.manifest.metadata = root_project.get_metadata() @@ -839,20 +843,18 @@ def build_public_nodes(self) -> bool: def load_new_public_nodes(self): for project in self.manifest.project_dependencies.projects: - publication = ( - next(p for p in self.publications if p.project_name == project.name) - if self.publications - else None - ) - if publication: - publication_config = PublicationConfig.from_publication(publication) - self.manifest.publications[project.name] = publication_config - # Add to dictionary of public_nodes and save id in PublicationConfig - for public_node in publication.public_models.values(): - self.manifest.public_nodes[public_node.unique_id] = public_node - else: + try: + publication = self.publications[project.name] + except KeyError: raise PublicationConfigNotFound(project=project.name) + publication_config = PublicationConfig.from_publication(publication) + self.manifest.publications[project.name] = publication_config + + # Add to dictionary of public_nodes and save id in PublicationConfig + for public_node in publication.public_models.values(): + self.manifest.public_nodes[public_node.unique_id] = public_node + def is_partial_parsable(self, manifest: Manifest) -> Tuple[bool, Optional[str]]: """Compare the global hashes of the read-in parse results' values to the known ones, and return if it is ok to re-use the results. diff --git a/tests/functional/multi_project/test_publication.py b/tests/functional/multi_project/test_publication.py index c8e3fc6fc9c..eae657899fd 100644 --- a/tests/functional/multi_project/test_publication.py +++ b/tests/functional/multi_project/test_publication.py @@ -132,10 +132,14 @@ def models(self): def test_pub_artifacts(self, project): write_file(dependencies_yml, "dependencies.yml") - # Dependencies lists "marketing" project, but no publication file found + # Dependencies lists "marketing" project, but no publications provided with pytest.raises(PublicationConfigNotFound): run_dbt(["parse"]) + # Dependencies lists "marketing" project, but no "marketing" publication provided + with pytest.raises(PublicationConfigNotFound): + run_dbt(["parse"], publications=[PublicationArtifact(project_name="not_marketing")]) + # Provide publication and try again m_pub_json = marketing_pub_json.replace("test_schema", project.test_schema) publications = [PublicationArtifact.from_dict(json.loads(m_pub_json))] From 9dd5ab90bffe55ff1ba1300bd2d57d74f75ccb9b Mon Sep 17 00:00:00 2001 From: dave-connors-3 <73915542+dave-connors-3@users.noreply.github.com> Date: Thu, 1 Jun 2023 08:25:59 -0500 Subject: [PATCH 33/67] add ability to select models by access (#7739) * add ability to select models by access * changie * Update core/dbt/graph/selector_methods.py --- .../unreleased/Features-20230530-164847.yaml | 6 ++++++ core/dbt/graph/selector_methods.py | 12 ++++++++++++ test/unit/test_graph_selector_methods.py | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 .changes/unreleased/Features-20230530-164847.yaml diff --git a/.changes/unreleased/Features-20230530-164847.yaml b/.changes/unreleased/Features-20230530-164847.yaml new file mode 100644 index 00000000000..eb4e47a619a --- /dev/null +++ b/.changes/unreleased/Features-20230530-164847.yaml @@ -0,0 +1,6 @@ +kind: Features +body: add access selection syntax +time: 2023-05-30T16:48:47.740037-05:00 +custom: + Author: dave-connors-3 + Issue: "7738" diff --git a/core/dbt/graph/selector_methods.py b/core/dbt/graph/selector_methods.py index f8442fc4973..e132175e972 100644 --- a/core/dbt/graph/selector_methods.py +++ b/core/dbt/graph/selector_methods.py @@ -36,6 +36,7 @@ class MethodName(StrEnum): FQN = "fqn" Tag = "tag" Group = "group" + Access = "access" Source = "source" Path = "path" File = "file" @@ -230,6 +231,16 @@ def search(self, included_nodes: Set[UniqueId], selector: str) -> Iterator[Uniqu yield node +class AccessSelectorMethod(SelectorMethod): + def search(self, included_nodes: Set[UniqueId], selector: str) -> Iterator[UniqueId]: + """yields model nodes matching the specified access level""" + for node, real_node in self.parsed_nodes(included_nodes): + if not isinstance(real_node, ModelNode): + continue + if selector == real_node.access: + yield node + + class SourceSelectorMethod(SelectorMethod): def search(self, included_nodes: Set[UniqueId], selector: str) -> Iterator[UniqueId]: """yields nodes from included are the specified source.""" @@ -713,6 +724,7 @@ class MethodManager: MethodName.FQN: QualifiedNameSelectorMethod, MethodName.Tag: TagSelectorMethod, MethodName.Group: GroupSelectorMethod, + MethodName.Access: AccessSelectorMethod, MethodName.Source: SourceSelectorMethod, MethodName.Path: PathSelectorMethod, MethodName.File: FileSelectorMethod, diff --git a/test/unit/test_graph_selector_methods.py b/test/unit/test_graph_selector_methods.py index 5bc881747da..eaac2479979 100644 --- a/test/unit/test_graph_selector_methods.py +++ b/test/unit/test_graph_selector_methods.py @@ -32,6 +32,7 @@ QualifiedNameSelectorMethod, TagSelectorMethod, GroupSelectorMethod, + AccessSelectorMethod, SourceSelectorMethod, PathSelectorMethod, FileSelectorMethod, @@ -63,6 +64,7 @@ def make_model( depends_on_macros=None, version=None, latest_version=None, + access=None, ): if refs is None: refs = [] @@ -121,6 +123,7 @@ def make_model( checksum=FileHash.from_contents(""), version=version, latest_version=latest_version, + access=access, ) @@ -921,6 +924,22 @@ def test_select_group(manifest, view_model): assert not search_manifest_using_method(manifest, method, "not_my_group") +def test_select_access(manifest, view_model): + change_node( + manifest, + view_model.replace( + access="public", + ), + ) + methods = MethodManager(manifest, None) + method = methods.get_method("access", []) + assert isinstance(method, AccessSelectorMethod) + assert method.arguments == [] + + assert search_manifest_using_method(manifest, method, "public") == {"view_model"} + assert not search_manifest_using_method(manifest, method, "private") + + def test_select_source(manifest): methods = MethodManager(manifest, None) method = methods.get_method("source", []) From 7a06d354aa90dce0e2f5196c0dd49a115d7ff621 Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Thu, 1 Jun 2023 11:08:02 -0700 Subject: [PATCH 34/67] pass optional sql_header to empty subquery sql rendering (#7734) --- .../unreleased/Fixes-20230531-131919.yaml | 6 +++ .../macros/adapters/columns.sql | 13 +++--- .../models/table/columns_spec_ddl.sql | 2 +- .../dbt/tests/adapter/constraints/fixtures.py | 39 +++++++++++++++++ .../adapter/constraints/test_constraints.py | 42 +++++++++++++++++++ 5 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230531-131919.yaml diff --git a/.changes/unreleased/Fixes-20230531-131919.yaml b/.changes/unreleased/Fixes-20230531-131919.yaml new file mode 100644 index 00000000000..0d5c1aec1b8 --- /dev/null +++ b/.changes/unreleased/Fixes-20230531-131919.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: send sql header on contract enforcement +time: 2023-05-31T13:19:19.801391-04:00 +custom: + Author: michelleark + Issue: "7714" diff --git a/core/dbt/include/global_project/macros/adapters/columns.sql b/core/dbt/include/global_project/macros/adapters/columns.sql index 8605ab21d02..0d7e5532b9c 100644 --- a/core/dbt/include/global_project/macros/adapters/columns.sql +++ b/core/dbt/include/global_project/macros/adapters/columns.sql @@ -17,15 +17,18 @@ {% endmacro %} -{% macro get_empty_subquery_sql(select_sql) -%} - {{ return(adapter.dispatch('get_empty_subquery_sql', 'dbt')(select_sql)) }} +{% macro get_empty_subquery_sql(select_sql, select_sql_header=none) -%} + {{ return(adapter.dispatch('get_empty_subquery_sql', 'dbt')(select_sql, select_sql_header)) }} {% endmacro %} {# Builds a query that results in the same schema as the given select_sql statement, without necessitating a data scan. Useful for running a query in a 'pre-flight' context, such as model contract enforcement (assert_columns_equivalent macro). #} -{% macro default__get_empty_subquery_sql(select_sql) %} +{% macro default__get_empty_subquery_sql(select_sql, select_sql_header=none) %} + {%- if select_sql_header is not none -%} + {{ select_sql_header }} + {%- endif -%} select * from ( {{ select_sql }} ) as __dbt_sbq @@ -53,10 +56,10 @@ {%- endif -%} {% endmacro %} -{% macro get_column_schema_from_query(select_sql) -%} +{% macro get_column_schema_from_query(select_sql, select_sql_header=none) -%} {% set columns = [] %} {# -- Using an 'empty subquery' here to get the same schema as the given select_sql statement, without necessitating a data scan.#} - {% set sql = get_empty_subquery_sql(select_sql) %} + {% set sql = get_empty_subquery_sql(select_sql, select_sql_header) %} {% set column_schema = adapter.get_column_schema_from_query(sql) %} {{ return(column_schema) }} {% endmacro %} diff --git a/core/dbt/include/global_project/macros/materializations/models/table/columns_spec_ddl.sql b/core/dbt/include/global_project/macros/materializations/models/table/columns_spec_ddl.sql index 1ce7875868d..410d2d058f9 100644 --- a/core/dbt/include/global_project/macros/materializations/models/table/columns_spec_ddl.sql +++ b/core/dbt/include/global_project/macros/materializations/models/table/columns_spec_ddl.sql @@ -34,7 +34,7 @@ #} {% macro assert_columns_equivalent(sql) %} {#-- Obtain the column schema provided by sql file. #} - {%- set sql_file_provided_columns = get_column_schema_from_query(sql) -%} + {%- set sql_file_provided_columns = get_column_schema_from_query(sql, config.get('sql_header', none)) -%} {#--Obtain the column schema provided by the schema file by generating an 'empty schema' query from the model's columns. #} {%- set schema_file_provided_columns = get_column_schema_from_query(get_empty_schema_sql(model['columns'])) -%} diff --git a/tests/adapter/dbt/tests/adapter/constraints/fixtures.py b/tests/adapter/dbt/tests/adapter/constraints/fixtures.py index 3310c59f3df..2edc6c41493 100644 --- a/tests/adapter/dbt/tests/adapter/constraints/fixtures.py +++ b/tests/adapter/dbt/tests/adapter/constraints/fixtures.py @@ -133,6 +133,33 @@ {sql_value} as wrong_data_type_column_name """ +my_model_contract_sql_header_sql = """ +{{ + config( + materialized = "table" + ) +}} + +{% call set_sql_header(config) %} +set session time zone 'Asia/Kolkata'; +{%- endcall %} +select current_setting('timezone') as column_name +""" + +my_model_incremental_contract_sql_header_sql = """ +{{ + config( + materialized = "incremental", + on_schema_change="append_new_columns" + ) +}} + +{% call set_sql_header(config) %} +set session time zone 'Asia/Kolkata'; +{%- endcall %} +select current_setting('timezone') as column_name +""" + # model breaking constraints my_model_with_nulls_sql = """ {{ @@ -303,3 +330,15 @@ - name: wrong_data_type_column_name data_type: {data_type} """ + +model_contract_header_schema_yml = """ +version: 2 +models: + - name: my_model_contract_sql_header + config: + contract: + enforced: true + columns: + - name: column_name + data_type: text +""" diff --git a/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py b/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py index 79140f03bbd..9ca4f23a95f 100644 --- a/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py +++ b/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py @@ -25,6 +25,9 @@ my_model_incremental_with_nulls_sql, model_schema_yml, constrained_model_schema_yml, + my_model_contract_sql_header_sql, + my_model_incremental_contract_sql_header_sql, + model_contract_header_schema_yml, ) @@ -358,6 +361,45 @@ class TestIncrementalConstraintsRollback(BaseIncrementalConstraintsRollback): pass +class BaseContractSqlHeader: + """Tests a contracted model with a sql header dependency.""" + + def test__contract_sql_header(self, project): + run_dbt(["run", "-s", "my_model_contract_sql_header"]) + + manifest = get_manifest(project.project_root) + model_id = "model.test.my_model_contract_sql_header" + model_config = manifest.nodes[model_id].config + + assert model_config.contract.enforced + + +class BaseTableContractSqlHeader(BaseContractSqlHeader): + @pytest.fixture(scope="class") + def models(self): + return { + "my_model_contract_sql_header.sql": my_model_contract_sql_header_sql, + "constraints_schema.yml": model_contract_header_schema_yml, + } + + +class BaseIncrementalContractSqlHeader(BaseContractSqlHeader): + @pytest.fixture(scope="class") + def models(self): + return { + "my_model_contract_sql_header.sql": my_model_incremental_contract_sql_header_sql, + "constraints_schema.yml": model_contract_header_schema_yml, + } + + +class TestTableContractSqlHeader(BaseTableContractSqlHeader): + pass + + +class TestIncrementalContractSqlHeader(BaseIncrementalContractSqlHeader): + pass + + class BaseModelConstraintsRuntimeEnforcement: """ These model-level constraints pass muster for dbt's preflight checks. Make sure they're From e1d7a53325476fed229db2b1c5c1d220cc0340a2 Mon Sep 17 00:00:00 2001 From: Quazi Irfan Date: Fri, 2 Jun 2023 09:00:58 -0500 Subject: [PATCH 35/67] Fix doc link in selector.py (#7755) * Fix doc link in selector.py * Ran changie to modify changelog entry --- .changes/unreleased/Fixes-20230601-130549.yaml | 6 ++++++ core/dbt/config/selectors.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Fixes-20230601-130549.yaml diff --git a/.changes/unreleased/Fixes-20230601-130549.yaml b/.changes/unreleased/Fixes-20230601-130549.yaml new file mode 100644 index 00000000000..02193f16768 --- /dev/null +++ b/.changes/unreleased/Fixes-20230601-130549.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Fixed doc link in selector.py +time: 2023-06-01T13:05:49.952-05:00 +custom: + Author: quazi-irfan + Issue: "7533" diff --git a/core/dbt/config/selectors.py b/core/dbt/config/selectors.py index e26ee01d316..63f67c14902 100644 --- a/core/dbt/config/selectors.py +++ b/core/dbt/config/selectors.py @@ -21,7 +21,7 @@ the contents of this file and fix any errors before retrying. You can find more information on the syntax for this file here: -https://docs.getdbt.com/docs/package-management +https://docs.getdbt.com/reference/node-selection/yaml-selectors Validator Error: {error} From 05b0ebb184897680462efa6f2ffb133234bfbbbd Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Fri, 2 Jun 2023 12:05:09 -0700 Subject: [PATCH 36/67] Fix constraint rendering for expressions and foreign key constraint types (#7512) --- .../unreleased/Fixes-20230504-140642.yaml | 7 + core/dbt/adapters/base/impl.py | 40 ++-- core/dbt/contracts/graph/nodes.py | 3 + .../dbt/tests/adapter/constraints/fixtures.py | 159 +++++++++++++++ .../adapter/constraints/test_constraints.py | 80 +++++--- tests/unit/test_base_adapter.py | 184 ++++++++++++++++++ 6 files changed, 435 insertions(+), 38 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230504-140642.yaml create mode 100644 tests/unit/test_base_adapter.py diff --git a/.changes/unreleased/Fixes-20230504-140642.yaml b/.changes/unreleased/Fixes-20230504-140642.yaml new file mode 100644 index 00000000000..84c5b26a80b --- /dev/null +++ b/.changes/unreleased/Fixes-20230504-140642.yaml @@ -0,0 +1,7 @@ +kind: Fixes +body: 'Constraint rendering fixes: wrap check expression in parentheses, foreign key + ''references'', support expression in all constraint types' +time: 2023-05-04T14:06:42.545193-04:00 +custom: + Author: MichelleArk + Issue: 7417 7480 7416 diff --git a/core/dbt/adapters/base/impl.py b/core/dbt/adapters/base/impl.py index 7bb16c7ea4e..59e2a0a93a6 100644 --- a/core/dbt/adapters/base/impl.py +++ b/core/dbt/adapters/base/impl.py @@ -1319,20 +1319,26 @@ def _parse_column_constraint(cls, raw_constraint: Dict[str, Any]) -> ColumnLevel def render_column_constraint(cls, constraint: ColumnLevelConstraint) -> Optional[str]: """Render the given constraint as DDL text. Should be overriden by adapters which need custom constraint rendering.""" - if constraint.type == ConstraintType.check and constraint.expression: - return f"check {constraint.expression}" + constraint_expression = constraint.expression or "" + + rendered_column_constraint = None + if constraint.type == ConstraintType.check and constraint_expression: + rendered_column_constraint = f"check ({constraint_expression})" elif constraint.type == ConstraintType.not_null: - return "not null" + rendered_column_constraint = f"not null {constraint_expression}" elif constraint.type == ConstraintType.unique: - return "unique" + rendered_column_constraint = f"unique {constraint_expression}" elif constraint.type == ConstraintType.primary_key: - return "primary key" - elif constraint.type == ConstraintType.foreign_key: - return "foreign key" - elif constraint.type == ConstraintType.custom and constraint.expression: - return constraint.expression - else: - return None + rendered_column_constraint = f"primary key {constraint_expression}" + elif constraint.type == ConstraintType.foreign_key and constraint_expression: + rendered_column_constraint = f"references {constraint_expression}" + elif constraint.type == ConstraintType.custom and constraint_expression: + rendered_column_constraint = constraint_expression + + if rendered_column_constraint: + rendered_column_constraint = rendered_column_constraint.strip() + + return rendered_column_constraint @available @classmethod @@ -1399,13 +1405,15 @@ def render_model_constraint(cls, constraint: ModelLevelConstraint) -> Optional[s constraint_prefix = f"constraint {constraint.name} " if constraint.name else "" column_list = ", ".join(constraint.columns) if constraint.type == ConstraintType.check and constraint.expression: - return f"{constraint_prefix}check {constraint.expression}" + return f"{constraint_prefix}check ({constraint.expression})" elif constraint.type == ConstraintType.unique: - return f"{constraint_prefix}unique ({column_list})" + constraint_expression = f" {constraint.expression}" if constraint.expression else "" + return f"{constraint_prefix}unique{constraint_expression} ({column_list})" elif constraint.type == ConstraintType.primary_key: - return f"{constraint_prefix}primary key ({column_list})" - elif constraint.type == ConstraintType.foreign_key: - return f"{constraint_prefix}foreign key ({column_list})" + constraint_expression = f" {constraint.expression}" if constraint.expression else "" + return f"{constraint_prefix}primary key{constraint_expression} ({column_list})" + elif constraint.type == ConstraintType.foreign_key and constraint.expression: + return f"{constraint_prefix}foreign key ({column_list}) references {constraint.expression}" elif constraint.type == ConstraintType.custom and constraint.expression: return f"{constraint_prefix}{constraint.expression}" else: diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 9d5701c65a6..24cd8f7ddcb 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -193,6 +193,9 @@ def is_valid(cls, item): class ColumnLevelConstraint(dbtClassMixin): type: ConstraintType name: Optional[str] = None + # expression is a user-provided field that will depend on the constraint type. + # It could be a predicate (check type), or a sequence sql keywords (e.g. unique type), + # so the vague naming of 'expression' is intended to capture this range. expression: Optional[str] = None warn_unenforced: bool = ( True # Warn if constraint cannot be enforced by platform but will be in DDL diff --git a/tests/adapter/dbt/tests/adapter/constraints/fixtures.py b/tests/adapter/dbt/tests/adapter/constraints/fixtures.py index 2edc6c41493..7896eb04516 100644 --- a/tests/adapter/dbt/tests/adapter/constraints/fixtures.py +++ b/tests/adapter/dbt/tests/adapter/constraints/fixtures.py @@ -12,6 +12,17 @@ '2019-01-01' as date_day """ +foreign_key_model_sql = """ +{{ + config( + materialized = "table" + ) +}} + +select + 1 as id +""" + my_model_view_sql = """ {{ config( @@ -53,6 +64,22 @@ '2019-01-01' as date_day """ +# force dependency on foreign_key_model so that foreign key constraint is enforceable +my_model_wrong_order_depends_on_fk_sql = """ +{{ + config( + materialized = "table" + ) +}} + +-- depends_on: {{ ref('foreign_key_model') }} + +select + 'blue' as color, + 1 as id, + '2019-01-01' as date_day +""" + my_model_view_wrong_order_sql = """ {{ config( @@ -80,6 +107,24 @@ '2019-01-01' as date_day """ +# force dependency on foreign_key_model so that foreign key constraint is enforceable +my_model_incremental_wrong_order_depends_on_fk_sql = """ +{{ + config( + materialized = "incremental", + on_schema_change='append_new_columns' + ) +}} + +-- depends_on: {{ ref('foreign_key_model') }} + +select + 'blue' as color, + 1 as id, + '2019-01-01' as date_day +""" + + # model columns name different to schema definitions my_model_wrong_name_sql = """ {{ @@ -223,6 +268,95 @@ - type: primary_key - type: check expression: (id > 0) + - type: check + expression: id >= 1 + tests: + - unique + - name: color + data_type: text + - name: date_day + data_type: text + - name: my_model_error + config: + contract: + enforced: true + columns: + - name: id + data_type: integer + description: hello + constraints: + - type: not_null + - type: primary_key + - type: check + expression: (id > 0) + tests: + - unique + - name: color + data_type: text + - name: date_day + data_type: text + - name: my_model_wrong_order + config: + contract: + enforced: true + columns: + - name: id + data_type: integer + description: hello + constraints: + - type: not_null + - type: primary_key + - type: check + expression: (id > 0) + tests: + - unique + - name: color + data_type: text + - name: date_day + data_type: text + - name: my_model_wrong_name + config: + contract: + enforced: true + columns: + - name: id + data_type: integer + description: hello + constraints: + - type: not_null + - type: primary_key + - type: check + expression: (id > 0) + tests: + - unique + - name: color + data_type: text + - name: date_day + data_type: text +""" + +model_fk_constraint_schema_yml = """ +version: 2 +models: + - name: my_model + config: + contract: + enforced: true + columns: + - name: id + quote: true + data_type: integer + description: hello + constraints: + - type: not_null + - type: primary_key + - type: check + expression: (id > 0) + - type: check + expression: id >= 1 + - type: foreign_key + expression: {schema}.foreign_key_model (id) + - type: unique tests: - unique - name: color @@ -286,6 +420,16 @@ data_type: text - name: date_day data_type: text + - name: foreign_key_model + config: + contract: + enforced: true + columns: + - name: id + data_type: integer + constraints: + - type: unique + - type: primary_key """ constrained_model_schema_yml = """ @@ -298,11 +442,16 @@ constraints: - type: check expression: (id > 0) + - type: check + expression: id >= 1 - type: primary_key columns: [ id ] - type: unique columns: [ color, date_day ] name: strange_uniqueness_requirement + - type: foreign_key + columns: [ id ] + expression: {schema}.foreign_key_model (id) columns: - name: id quote: true @@ -316,6 +465,16 @@ data_type: text - name: date_day data_type: text + - name: foreign_key_model + config: + contract: + enforced: true + columns: + - name: id + data_type: integer + constraints: + - type: unique + - type: primary_key """ diff --git a/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py b/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py index 9ca4f23a95f..49e78d19a34 100644 --- a/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py +++ b/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py @@ -24,7 +24,11 @@ my_model_with_nulls_sql, my_model_incremental_with_nulls_sql, model_schema_yml, + model_fk_constraint_schema_yml, constrained_model_schema_yml, + foreign_key_model_sql, + my_model_wrong_order_depends_on_fk_sql, + my_model_incremental_wrong_order_depends_on_fk_sql, my_model_contract_sql_header_sql, my_model_incremental_contract_sql_header_sql, model_contract_header_schema_yml, @@ -164,6 +168,13 @@ def _normalize_whitespace(input: str) -> str: return re.sub(r"\s+", " ", input).lower().strip() +def _find_and_replace(sql, find, replace): + sql_tokens = sql.split(" ") + for idx in [n for n, x in enumerate(sql_tokens) if find in x]: + sql_tokens[idx] = replace + return " ".join(sql_tokens) + + class BaseConstraintsRuntimeDdlEnforcement: """ These constraints pass muster for dbt's preflight checks. Make sure they're @@ -174,15 +185,16 @@ class BaseConstraintsRuntimeDdlEnforcement: @pytest.fixture(scope="class") def models(self): return { - "my_model.sql": my_model_wrong_order_sql, - "constraints_schema.yml": model_schema_yml, + "my_model.sql": my_model_wrong_order_depends_on_fk_sql, + "foreign_key_model.sql": foreign_key_model_sql, + "constraints_schema.yml": model_fk_constraint_schema_yml, } @pytest.fixture(scope="class") def expected_sql(self): return """ create table ( - id integer not null primary key check (id > 0), + id integer not null primary key check ((id > 0)) check (id >= 1) references (id) unique, color text, date_day text ) ; @@ -198,6 +210,7 @@ def expected_sql(self): date_day from ( + -- depends_on: select 'blue' as color, 1 as id, @@ -207,18 +220,27 @@ def expected_sql(self): """ def test__constraints_ddl(self, project, expected_sql): - results = run_dbt(["run", "-s", "my_model"]) - assert len(results) == 1 + unformatted_constraint_schema_yml = read_file("models", "constraints_schema.yml") + write_file( + unformatted_constraint_schema_yml.format(schema=project.test_schema), + "models", + "constraints_schema.yml", + ) + + results = run_dbt(["run", "-s", "+my_model"]) + assert len(results) == 2 # grab the sql and replace the model identifier to make it generic for all adapters # the name is not what we're testing here anyways and varies based on materialization # TODO: consider refactoring this to introspect logs instead generated_sql = read_file("target", "run", "test", "models", "my_model.sql") generated_sql_modified = _normalize_whitespace(generated_sql) - generated_sql_list = generated_sql_modified.split(" ") - for idx in [n for n, x in enumerate(generated_sql_list) if "my_model" in x]: - generated_sql_list[idx] = "" - generated_sql_generic = " ".join(generated_sql_list) + generated_sql_generic = _find_and_replace( + generated_sql_modified, "my_model", "" + ) + generated_sql_generic = _find_and_replace( + generated_sql_generic, "foreign_key_model", "" + ) expected_sql_check = _normalize_whitespace(expected_sql) @@ -313,8 +335,9 @@ class BaseIncrementalConstraintsRuntimeDdlEnforcement(BaseConstraintsRuntimeDdlE @pytest.fixture(scope="class") def models(self): return { - "my_model.sql": my_model_incremental_wrong_order_sql, - "constraints_schema.yml": model_schema_yml, + "my_model.sql": my_model_incremental_wrong_order_depends_on_fk_sql, + "foreign_key_model.sql": foreign_key_model_sql, + "constraints_schema.yml": model_fk_constraint_schema_yml, } @@ -410,7 +433,8 @@ class BaseModelConstraintsRuntimeEnforcement: @pytest.fixture(scope="class") def models(self): return { - "my_model.sql": my_model_sql, + "my_model.sql": my_model_wrong_order_depends_on_fk_sql, + "foreign_key_model.sql": foreign_key_model_sql, "constraints_schema.yml": constrained_model_schema_yml, } @@ -421,9 +445,11 @@ def expected_sql(self): id integer not null, color text, date_day text, - check (id > 0), + check ((id > 0)), + check (id >= 1), primary key (id), - constraint strange_uniqueness_requirement unique (color, date_day) + constraint strange_uniqueness_requirement unique (color, date_day), + foreign key (id) references (id) ) ; insert into ( id , @@ -437,23 +463,33 @@ def expected_sql(self): date_day from ( + -- depends_on: select - 1 as id, 'blue' as color, + 1 as id, '2019-01-01' as date_day ) as model_subq ); """ def test__model_constraints_ddl(self, project, expected_sql): - results = run_dbt(["run", "-s", "my_model"]) - assert len(results) == 1 + unformatted_constraint_schema_yml = read_file("models", "constraints_schema.yml") + write_file( + unformatted_constraint_schema_yml.format(schema=project.test_schema), + "models", + "constraints_schema.yml", + ) + + results = run_dbt(["run", "-s", "+my_model"]) + assert len(results) == 2 generated_sql = read_file("target", "run", "test", "models", "my_model.sql") - generated_sql_list = _normalize_whitespace(generated_sql).split(" ") - generated_sql_list = [ - "" if "my_model" in s else s for s in generated_sql_list - ] - generated_sql_generic = " ".join(generated_sql_list) + generated_sql_modified = _normalize_whitespace(generated_sql) + generated_sql_generic = _find_and_replace( + generated_sql_modified, "my_model", "" + ) + generated_sql_generic = _find_and_replace( + generated_sql_generic, "foreign_key_model", "" + ) assert _normalize_whitespace(expected_sql) == generated_sql_generic diff --git a/tests/unit/test_base_adapter.py b/tests/unit/test_base_adapter.py new file mode 100644 index 00000000000..66d8af5c5d8 --- /dev/null +++ b/tests/unit/test_base_adapter.py @@ -0,0 +1,184 @@ +from argparse import Namespace +from unittest import mock +import pytest + +from dbt.adapters.base.impl import BaseAdapter, ConstraintSupport +import dbt.flags as flags + + +class TestBaseAdapterConstraintRendering: + @pytest.fixture(scope="class", autouse=True) + def setUp(self): + flags.set_from_args(Namespace(), None) + + @pytest.fixture(scope="class") + def connection_manager(request): + mock_connection_manager = mock.Mock() + mock_connection_manager.TYPE = "base" + return mock_connection_manager + + column_constraints = [ + ([{"type": "check"}], ["column_name integer"]), + ([{"type": "check", "name": "test_name"}], ["column_name integer"]), + ( + [{"type": "check", "expression": "test expression"}], + ["column_name integer check (test expression)"], + ), + ([{"type": "not_null"}], ["column_name integer not null"]), + ( + [{"type": "not_null", "expression": "test expression"}], + ["column_name integer not null test expression"], + ), + ([{"type": "unique"}], ["column_name integer unique"]), + ( + [{"type": "unique", "expression": "test expression"}], + ["column_name integer unique test expression"], + ), + ([{"type": "primary_key"}], ["column_name integer primary key"]), + ( + [{"type": "primary_key", "expression": "test expression"}], + ["column_name integer primary key test expression"], + ), + ([{"type": "foreign_key"}], ["column_name integer"]), + ( + [{"type": "foreign_key", "expression": "other_table (c1)"}], + ["column_name integer references other_table (c1)"], + ), + ([{"type": "check"}, {"type": "unique"}], ["column_name integer unique"]), + ] + + @pytest.mark.parametrize("constraints,expected_rendered_constraints", column_constraints) + def test_render_raw_columns_constraints( + self, constraints, expected_rendered_constraints, request + ): + BaseAdapter.ConnectionManager = request.getfixturevalue("connection_manager") + BaseAdapter.CONSTRAINT_SUPPORT = { + constraint: ConstraintSupport.ENFORCED for constraint in BaseAdapter.CONSTRAINT_SUPPORT + } + + rendered_constraints = BaseAdapter.render_raw_columns_constraints( + { + "column_name": { + "name": "column_name", + "data_type": "integer", + "constraints": constraints, + } + } + ) + assert rendered_constraints == expected_rendered_constraints + + column_constraints_unsupported = [ + ([{"type": "check"}], ["column_name integer"]), + ([{"type": "check", "expression": "test expression"}], ["column_name integer"]), + ([{"type": "not_null"}], ["column_name integer"]), + ([{"type": "not_null", "expression": "test expression"}], ["column_name integer"]), + ([{"type": "unique"}], ["column_name integer"]), + ([{"type": "unique", "expression": "test expression"}], ["column_name integer"]), + ([{"type": "primary_key"}], ["column_name integer"]), + ([{"type": "primary_key", "expression": "test expression"}], ["column_name integer"]), + ([{"type": "foreign_key"}], ["column_name integer"]), + ([{"type": "check"}, {"type": "unique"}], ["column_name integer"]), + ] + + @pytest.mark.parametrize( + "constraints,expected_rendered_constraints", column_constraints_unsupported + ) + def test_render_raw_columns_constraints_unsupported( + self, constraints, expected_rendered_constraints, request + ): + BaseAdapter.ConnectionManager = request.getfixturevalue("connection_manager") + BaseAdapter.CONSTRAINT_SUPPORT = { + constraint: ConstraintSupport.NOT_SUPPORTED + for constraint in BaseAdapter.CONSTRAINT_SUPPORT + } + + rendered_constraints = BaseAdapter.render_raw_columns_constraints( + { + "column_name": { + "name": "column_name", + "data_type": "integer", + "constraints": constraints, + } + } + ) + assert rendered_constraints == expected_rendered_constraints + + model_constraints = [ + ([{"type": "check"}], []), + ([{"type": "check", "expression": "test expression"}], ["check (test expression)"]), + ( + [{"type": "check", "expression": "test expression", "name": "test_name"}], + ["constraint test_name check (test expression)"], + ), + ([{"type": "not_null"}], []), + ([{"type": "not_null", "expression": "test expression"}], []), + ([{"type": "unique", "columns": ["c1", "c2"]}], ["unique (c1, c2)"]), + ([{"type": "unique", "columns": ["c1", "c2"]}], ["unique (c1, c2)"]), + ( + [ + { + "type": "unique", + "columns": ["c1", "c2"], + "expression": "test expression", + "name": "test_name", + } + ], + ["constraint test_name unique test expression (c1, c2)"], + ), + ([{"type": "primary_key", "columns": ["c1", "c2"]}], ["primary key (c1, c2)"]), + ( + [{"type": "primary_key", "columns": ["c1", "c2"], "expression": "test expression"}], + ["primary key test expression (c1, c2)"], + ), + ( + [ + { + "type": "primary_key", + "columns": ["c1", "c2"], + "expression": "test expression", + "name": "test_name", + } + ], + ["constraint test_name primary key test expression (c1, c2)"], + ), + ( + [{"type": "foreign_key", "columns": ["c1", "c2"], "expression": "other_table (c1)"}], + ["foreign key (c1, c2) references other_table (c1)"], + ), + ( + [ + { + "type": "foreign_key", + "columns": ["c1", "c2"], + "expression": "other_table (c1)", + "name": "test_name", + } + ], + ["constraint test_name foreign key (c1, c2) references other_table (c1)"], + ), + ] + + @pytest.mark.parametrize("constraints,expected_rendered_constraints", model_constraints) + def test_render_raw_model_constraints( + self, constraints, expected_rendered_constraints, request + ): + BaseAdapter.ConnectionManager = request.getfixturevalue("connection_manager") + BaseAdapter.CONSTRAINT_SUPPORT = { + constraint: ConstraintSupport.ENFORCED for constraint in BaseAdapter.CONSTRAINT_SUPPORT + } + + rendered_constraints = BaseAdapter.render_raw_model_constraints(constraints) + assert rendered_constraints == expected_rendered_constraints + + @pytest.mark.parametrize("constraints,expected_rendered_constraints", model_constraints) + def test_render_raw_model_constraints_unsupported( + self, constraints, expected_rendered_constraints, request + ): + BaseAdapter.ConnectionManager = request.getfixturevalue("connection_manager") + BaseAdapter.CONSTRAINT_SUPPORT = { + constraint: ConstraintSupport.NOT_SUPPORTED + for constraint in BaseAdapter.CONSTRAINT_SUPPORT + } + + rendered_constraints = BaseAdapter.render_raw_model_constraints(constraints) + assert rendered_constraints == [] From 7917bd5033f18a9accc262d2f242e4896d63068f Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Fri, 2 Jun 2023 13:16:14 -0700 Subject: [PATCH 37/67] add project_name to manifest metadata (#7754) --- .../unreleased/Features-20230601-132223.yaml | 6 + core/dbt/config/runtime.py | 6 +- core/dbt/contracts/graph/manifest.py | 8 +- schemas/dbt/manifest/v10.json | 340 ++++++++---------- tests/functional/artifacts/test_artifacts.py | 1 + 5 files changed, 165 insertions(+), 196 deletions(-) create mode 100644 .changes/unreleased/Features-20230601-132223.yaml diff --git a/.changes/unreleased/Features-20230601-132223.yaml b/.changes/unreleased/Features-20230601-132223.yaml new file mode 100644 index 00000000000..e4501bd8581 --- /dev/null +++ b/.changes/unreleased/Features-20230601-132223.yaml @@ -0,0 +1,6 @@ +kind: Features +body: add project_name to manifest metadata +time: 2023-06-01T13:22:23.259448-04:00 +custom: + Author: michelleark jtcohen6 + Issue: "7752" diff --git a/core/dbt/config/runtime.py b/core/dbt/config/runtime.py index d58a9009922..2f95ab6d664 100644 --- a/core/dbt/config/runtime.py +++ b/core/dbt/config/runtime.py @@ -271,7 +271,11 @@ def from_args(cls, args: Any) -> "RuntimeConfig": ) def get_metadata(self) -> ManifestMetadata: - return ManifestMetadata(project_id=self.hashed_name(), adapter_type=self.credentials.type) + return ManifestMetadata( + project_name=self.project_name, + project_id=self.hashed_name(), + adapter_type=self.credentials.type, + ) def _get_v2_config_paths( self, diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index 401d6924f1b..3f4f3adec2c 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -368,10 +368,16 @@ class ManifestMetadata(BaseArtifactMetadata): dbt_schema_version: str = field( default_factory=lambda: str(WritableManifest.dbt_schema_version) ) + project_name: Optional[str] = field( + default=None, + metadata={ + "description": "Name of the root project", + }, + ) project_id: Optional[str] = field( default=None, metadata={ - "description": "A unique identifier for the project", + "description": "A unique identifier for the project, hashed from the project name", }, ) user_id: Optional[UUID] = field( diff --git a/schemas/dbt/manifest/v10.json b/schemas/dbt/manifest/v10.json index 7ea2441e02b..3b6773d66a6 100644 --- a/schemas/dbt/manifest/v10.json +++ b/schemas/dbt/manifest/v10.json @@ -224,12 +224,12 @@ }, "dbt_version": { "type": "string", - "default": "1.6.0a1" + "default": "1.6.0b2" }, "generated_at": { "type": "string", "format": "date-time", - "default": "2023-04-19T14:31:46.624262Z" + "default": "2023-06-01T17:10:44.803525Z" }, "invocation_id": { "oneOf": [ @@ -240,7 +240,7 @@ "type": "null" } ], - "default": "6bf8103b-748b-4b8c-b684-ec7814ec77ca" + "default": "2cd4fe5a-501b-422f-a628-80b34230967b" }, "env": { "type": "object", @@ -249,6 +249,17 @@ }, "default": {} }, + "project_name": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Name of the root project" + }, "project_id": { "oneOf": [ { @@ -258,7 +269,7 @@ "type": "null" } ], - "description": "A unique identifier for the project" + "description": "A unique identifier for the project, hashed from the project name" }, "user_id": { "oneOf": [ @@ -459,7 +470,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.630888 + "default": 1685639444.805417 }, "config_call_dict": { "type": "object", @@ -1171,7 +1182,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.637792 + "default": 1685639444.807345 }, "config_call_dict": { "type": "object", @@ -1559,7 +1570,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.642067 + "default": 1685639444.807956 }, "config_call_dict": { "type": "object", @@ -1835,7 +1846,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.645828 + "default": 1685639444.8085592 }, "config_call_dict": { "type": "object", @@ -1981,7 +1992,18 @@ "deprecation_date": { "oneOf": [ { - "type": "string" + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ] + }, + "state_relation": { + "oneOf": [ + { + "$ref": "#/definitions/StateRelation" }, { "type": "null" @@ -1990,7 +2012,7 @@ } }, "additionalProperties": false, - "description": "ModelNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = , access: dbt.node_types.AccessType = , constraints: List[dbt.contracts.graph.nodes.ModelLevelConstraint] = , version: Union[str, float, NoneType] = None, latest_version: Union[str, float, NoneType] = None)" + "description": "ModelNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = , access: dbt.node_types.AccessType = , constraints: List[dbt.contracts.graph.nodes.ModelLevelConstraint] = , version: Union[str, float, NoneType] = None, latest_version: Union[str, float, NoneType] = None, deprecation_date: Optional[datetime.datetime] = None, state_relation: Optional[dbt.contracts.graph.nodes.StateRelation] = None)" }, "ModelLevelConstraint": { "type": "object", @@ -2048,6 +2070,33 @@ "additionalProperties": false, "description": "ModelLevelConstraint(type: dbt.contracts.graph.nodes.ConstraintType, name: Optional[str] = None, expression: Optional[str] = None, warn_unenforced: bool = True, warn_unsupported: bool = True, columns: List[str] = )" }, + "StateRelation": { + "type": "object", + "required": [ + "alias", + "schema" + ], + "properties": { + "alias": { + "type": "string" + }, + "database": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "schema": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "StateRelation(alias: str, database: Optional[str], schema: str)" + }, "RPCNode": { "type": "object", "required": [ @@ -2209,7 +2258,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.648939 + "default": 1685639444.809459 }, "config_call_dict": { "type": "object", @@ -2475,7 +2524,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.651103 + "default": 1685639444.810038 }, "config_call_dict": { "type": "object", @@ -2734,7 +2783,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.653884 + "default": 1685639444.810735 }, "config_call_dict": { "type": "object", @@ -3030,7 +3079,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.661021 + "default": 1685639444.8118432 }, "config_call_dict": { "type": "object", @@ -3130,10 +3179,20 @@ "enforced": false, "checksum": null } + }, + "state_relation": { + "oneOf": [ + { + "$ref": "#/definitions/StateRelation" + }, + { + "type": "null" + } + ] } }, "additionalProperties": false, - "description": "SnapshotNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.SnapshotConfig, _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = )" + "description": "SnapshotNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.SnapshotConfig, _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = , state_relation: Optional[dbt.contracts.graph.nodes.StateRelation] = None)" }, "SnapshotConfig": { "type": "object", @@ -3518,7 +3577,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.667295 + "default": 1685639444.812869 }, "config_call_dict": { "type": "object", @@ -3553,10 +3612,20 @@ "default": { "macros": [] } + }, + "state_relation": { + "oneOf": [ + { + "$ref": "#/definitions/StateRelation" + }, + { + "type": "null" + } + ] } }, "additionalProperties": false, - "description": "SeedNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.SeedConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', root_path: Optional[str] = None, depends_on: dbt.contracts.graph.nodes.MacroDependsOn = )" + "description": "SeedNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.SeedConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', root_path: Optional[str] = None, depends_on: dbt.contracts.graph.nodes.MacroDependsOn = , state_relation: Optional[dbt.contracts.graph.nodes.StateRelation] = None)" }, "SeedConfig": { "type": "object", @@ -3920,7 +3989,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.670914 + "default": 1685639444.814112 } }, "additionalProperties": false, @@ -4020,138 +4089,6 @@ "additionalProperties": false, "description": "FreshnessThreshold(warn_after: Optional[dbt.contracts.graph.unparsed.Time] = , error_after: Optional[dbt.contracts.graph.unparsed.Time] = , filter: Optional[str] = None)" }, - "FreshnessMetadata": { - "type": "object", - "required": [], - "properties": { - "dbt_schema_version": { - "type": "string", - "default": "https://schemas.getdbt.com/dbt/sources/v3.json" - }, - "dbt_version": { - "type": "string", - "default": "1.6.0a1" - }, - "generated_at": { - "type": "string", - "format": "date-time", - "default": "2023-04-19T14:31:46.615335Z" - }, - "invocation_id": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": "6bf8103b-748b-4b8c-b684-ec7814ec77ca" - }, - "env": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "default": {} - } - }, - "additionalProperties": false, - "description": "FreshnessMetadata(dbt_schema_version: str = , dbt_version: str = '1.6.0a1', generated_at: datetime.datetime = , invocation_id: Optional[str] = , env: Dict[str, str] = )" - }, - "SourceFreshnessRuntimeError": { - "type": "object", - "required": [ - "unique_id", - "status" - ], - "properties": { - "unique_id": { - "type": "string" - }, - "error": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "status": { - "type": "string", - "enum": [ - "runtime error" - ] - } - }, - "additionalProperties": false, - "description": "SourceFreshnessRuntimeError(unique_id: str, error: Union[str, int, NoneType], status: dbt.contracts.results.FreshnessErrorEnum)" - }, - "SourceFreshnessOutput": { - "type": "object", - "required": [ - "unique_id", - "max_loaded_at", - "snapshotted_at", - "max_loaded_at_time_ago_in_s", - "status", - "criteria", - "adapter_response", - "timing", - "thread_id", - "execution_time" - ], - "properties": { - "unique_id": { - "type": "string" - }, - "max_loaded_at": { - "type": "string", - "format": "date-time" - }, - "snapshotted_at": { - "type": "string", - "format": "date-time" - }, - "max_loaded_at_time_ago_in_s": { - "type": "number" - }, - "status": { - "type": "string", - "enum": [ - "pass", - "warn", - "error", - "runtime error" - ] - }, - "criteria": { - "$ref": "#/definitions/FreshnessThreshold" - }, - "adapter_response": { - "type": "object" - }, - "timing": { - "type": "array", - "items": { - "$ref": "#/definitions/TimingInfo" - } - }, - "thread_id": { - "type": "string" - }, - "execution_time": { - "type": "number" - } - }, - "additionalProperties": false, - "description": "SourceFreshnessOutput(unique_id: str, max_loaded_at: datetime.datetime, snapshotted_at: datetime.datetime, max_loaded_at_time_ago_in_s: float, status: dbt.contracts.results.FreshnessStatus, criteria: dbt.contracts.graph.unparsed.FreshnessThreshold, adapter_response: Dict[str, Any], timing: List[dbt.contracts.results.TimingInfo], thread_id: str, execution_time: float)" - }, "Time": { "type": "object", "required": [], @@ -4185,41 +4122,6 @@ "additionalProperties": false, "description": "Time(count: Optional[int] = None, period: Optional[dbt.contracts.graph.unparsed.TimePeriod] = None)" }, - "TimingInfo": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "started_at": { - "oneOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ] - }, - "completed_at": { - "oneOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ] - } - }, - "additionalProperties": false, - "description": "TimingInfo(name: str, started_at: Optional[datetime.datetime] = None, completed_at: Optional[datetime.datetime] = None)" - }, "ExternalTable": { "type": "object", "required": [], @@ -4399,7 +4301,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.671911 + "default": 1685639444.814394 }, "supported_languages": { "oneOf": [ @@ -4640,7 +4542,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.6743622 + "default": 1685639444.815081 } }, "additionalProperties": false, @@ -4861,7 +4763,7 @@ }, "created_at": { "type": "number", - "default": 1681914706.6769578 + "default": 1685639444.8157508 }, "group": { "oneOf": [ @@ -5015,6 +4917,36 @@ "relation_name": { "type": "string" }, + "database": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "schema": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "identifier": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, "version": { "oneOf": [ { @@ -5028,11 +4960,20 @@ } ] }, - "is_latest_version": { - "type": "boolean", - "default": false + "latest_version": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "null" + } + ] }, - "public_dependencies": { + "public_node_dependencies": { "type": "array", "items": { "type": "string" @@ -5042,11 +4983,22 @@ "generated_at": { "type": "string", "format": "date-time", - "default": "2023-04-19T14:31:46.679989Z" + "default": "2023-06-01T17:10:44.816336Z" + }, + "deprecation_date": { + "oneOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ] } }, "additionalProperties": false, - "description": "PublicModel(name: str, package_name: str, unique_id: str, relation_name: str, version: Union[str, float, NoneType] = None, is_latest_version: bool = False, public_dependencies: List[str] = , generated_at: datetime.datetime = )" + "description": "Used to represent cross-project models" } }, "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/tests/functional/artifacts/test_artifacts.py b/tests/functional/artifacts/test_artifacts.py index 1ccc4c75309..df272f3a2f7 100644 --- a/tests/functional/artifacts/test_artifacts.py +++ b/tests/functional/artifacts/test_artifacts.py @@ -484,6 +484,7 @@ def verify_manifest(project, expected_manifest, start_time, manifest_schema_path "project_id" in metadata and metadata["project_id"] == "098f6bcd4621d373cade4e832627b4f6" ) + assert "project_name" in metadata and metadata["project_name"] == "test" assert ( "send_anonymous_usage_stats" in metadata and metadata["send_anonymous_usage_stats"] is False From 79bd98560be123a94b7577f3c5fe3ad29a2cd43a Mon Sep 17 00:00:00 2001 From: Gerda Shank Date: Mon, 5 Jun 2023 10:21:39 -0400 Subject: [PATCH 38/67] Version 0 for model works for latest_version (#7712) --- .../unreleased/Fixes-20230526-164727.yaml | 6 +++++ core/dbt/contracts/graph/manifest.py | 2 +- .../graph_selection/test_version_selection.py | 22 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Fixes-20230526-164727.yaml diff --git a/.changes/unreleased/Fixes-20230526-164727.yaml b/.changes/unreleased/Fixes-20230526-164727.yaml new file mode 100644 index 00000000000..20eb43b908f --- /dev/null +++ b/.changes/unreleased/Fixes-20230526-164727.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Using version 0 works when resolving single model +time: 2023-05-26T16:47:27.6065-04:00 +custom: + Author: gshank + Issue: "7372" diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index 3f4f3adec2c..5edc3f44db7 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -204,7 +204,7 @@ def find( if v.name == node.name and v.version is not None ] ) - assert node.latest_version # for mypy, whenever i may find it + assert node.latest_version is not None # for mypy, whenever i may find it if max_version > UnparsedVersion(node.latest_version): fire_event( UnpinnedRefNewVersionAvailable( diff --git a/tests/functional/graph_selection/test_version_selection.py b/tests/functional/graph_selection/test_version_selection.py index 6a122eae48b..4f9325a1fb8 100644 --- a/tests/functional/graph_selection/test_version_selection.py +++ b/tests/functional/graph_selection/test_version_selection.py @@ -109,3 +109,25 @@ def test_select_group_and_children_selector_str(self, project): # noqa def test_select_models_two_versions(self, project): results = run_dbt(["ls", "--models", "version:latest version:old"]) assert sorted(results) == ["test.versioned.v1", "test.versioned.v2"] + + +my_model_yml = """ +models: + - name: my_model + versions: + - v: 0 +""" + + +class TestVersionZero: + @pytest.fixture(scope="class") + def models(self): + return { + "my_model.sql": "select 1 as id", + "another.sql": "select * from {{ ref('my_model') }}", + "schema.yml": my_model_yml, + } + + def test_version_zero(self, project): + results = run_dbt(["run"]) + assert len(results) == 2 From 89541faec9664c92b67f15d7b4b51877f6f66917 Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Mon, 5 Jun 2023 07:45:59 -0700 Subject: [PATCH 39/67] force dependency between test models (#7767) --- .changes/unreleased/Under the Hood-20230602-145743.yaml | 6 ++++++ tests/functional/fail_fast/test_fail_fast_run.py | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 .changes/unreleased/Under the Hood-20230602-145743.yaml diff --git a/.changes/unreleased/Under the Hood-20230602-145743.yaml b/.changes/unreleased/Under the Hood-20230602-145743.yaml new file mode 100644 index 00000000000..7fc63e289a3 --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230602-145743.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Fix flaky test for --fail-fast +time: 2023-06-02T14:57:43.266412-04:00 +custom: + Author: michelleark + Issue: "7744" diff --git a/tests/functional/fail_fast/test_fail_fast_run.py b/tests/functional/fail_fast/test_fail_fast_run.py index 92ed1c7aea4..ad0a84e169d 100644 --- a/tests/functional/fail_fast/test_fail_fast_run.py +++ b/tests/functional/fail_fast/test_fail_fast_run.py @@ -12,6 +12,7 @@ """ models__two_sql = """ +-- depends_on: {{ ref('one') }} select 1 /failed """ @@ -35,6 +36,7 @@ def test_fail_fast_run( assert run_results_file.is_file() with run_results_file.open() as run_results_str: run_results = json.loads(run_results_str.read()) + assert len(run_results["results"]) == 2 assert run_results["results"][0]["status"] == "success" assert run_results["results"][1]["status"] == "error" From 4dbc4a41c4642d258666946b634d0c20ee5db2cf Mon Sep 17 00:00:00 2001 From: Emily Rockman Date: Mon, 5 Jun 2023 09:51:30 -0500 Subject: [PATCH 40/67] remove entire changes folder (#7766) Co-authored-by: Kshitij Aranke --- .github/CODEOWNERS | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b301d321511..01da3492720 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -18,7 +18,6 @@ /.github/ @dbt-labs/guild-oss-tooling .bumpversion.cfg @dbt-labs/guild-oss-tooling -/.changes/ @dbt-labs/guild-oss-tooling .changie.yaml @dbt-labs/guild-oss-tooling pre-commit-config.yaml @dbt-labs/guild-oss-tooling From 60d116b5b53ed61aaf354532eb3d21d8cec5f00f Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Mon, 5 Jun 2023 11:59:38 -0700 Subject: [PATCH 41/67] log PublicationArtifactAvailable even when partially parsing & public models unchanged (#7783) --- .../unreleased/Fixes-20230605-121127.yaml | 7 ++++++ core/dbt/parser/manifest.py | 7 +++--- tests/functional/partial_parsing/fixtures.py | 8 ++++++ .../partial_parsing/test_partial_parsing.py | 25 +++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230605-121127.yaml diff --git a/.changes/unreleased/Fixes-20230605-121127.yaml b/.changes/unreleased/Fixes-20230605-121127.yaml new file mode 100644 index 00000000000..02b64c088e2 --- /dev/null +++ b/.changes/unreleased/Fixes-20230605-121127.yaml @@ -0,0 +1,7 @@ +kind: Fixes +body: Log PublicationArtifactAvailable even when partially parsing unchanged public + models +time: 2023-06-05T12:11:27.739183-04:00 +custom: + Author: michelleark + Issue: "7782" diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index bc6c9233388..ada54f575d8 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -553,9 +553,10 @@ def load(self): self.process_refs(self.root_project.project_name) # parent and child maps will be rebuilt by write_manifest - if not skip_parsing or public_nodes_changed: - # Write out the _publication.json file for this project - log_publication_artifact(self.root_project, self.manifest) + # Log the publication artifact for this project + log_publication_artifact(self.root_project, self.manifest) + + if not skip_parsing: # write out the fully parsed manifest self.write_manifest_for_partial_parse() diff --git a/tests/functional/partial_parsing/fixtures.py b/tests/functional/partial_parsing/fixtures.py index 11ff492443d..74cef0bff00 100644 --- a/tests/functional/partial_parsing/fixtures.py +++ b/tests/functional/partial_parsing/fixtures.py @@ -1233,3 +1233,11 @@ """ + +public_models_schema_yml = """ + +models: + - name: orders + access: public + description: "Some order data" +""" diff --git a/tests/functional/partial_parsing/test_partial_parsing.py b/tests/functional/partial_parsing/test_partial_parsing.py index 748747311c7..941d9ff1aa9 100644 --- a/tests/functional/partial_parsing/test_partial_parsing.py +++ b/tests/functional/partial_parsing/test_partial_parsing.py @@ -69,6 +69,7 @@ groups_schema_yml_one_group_model_in_group2, groups_schema_yml_two_groups_private_orders_valid_access, groups_schema_yml_two_groups_private_orders_invalid_access, + public_models_schema_yml, ) from dbt.exceptions import CompilationError, ParsingError, DuplicateVersionedUnversionedError @@ -804,3 +805,27 @@ def test_pp_groups(self, project): ) with pytest.raises(ParsingError): results = run_dbt(["--partial-parse", "run"]) + + +class TestPublicationArtifactAvailable: + @pytest.fixture(scope="class") + def models(self): + return { + "orders.sql": orders_sql, + "schema.yml": public_models_schema_yml, + } + + def test_pp_publication_artifact_available(self, project): + # initial run with public model logs PublicationArtifactAvailable + manifest, log_output = run_dbt_and_capture(["--debug", "--log-format", "json", "parse"]) + orders_node = manifest.nodes["model.test.orders"] + assert orders_node.access == "public" + assert "PublicationArtifactAvailable" in log_output + + # unchanged project - partial parse run with public model logs PublicationArtifactAvailable + manifest, log_output = run_dbt_and_capture( + ["--partial-parse", "--debug", "--log-format", "json", "parse"] + ) + orders_node = manifest.nodes["model.test.orders"] + assert orders_node.access == "public" + assert "PublicationArtifactAvailable" in log_output From dc35f56baa6876e6381b46f9b99b45f29d58f857 Mon Sep 17 00:00:00 2001 From: Kshitij Aranke Date: Mon, 5 Jun 2023 15:51:00 -0700 Subject: [PATCH 42/67] Fixes #7299: dbt retry (#7763) --- .../unreleased/Features-20230602-083302.yaml | 6 + core/dbt/cli/flags.py | 5 +- core/dbt/cli/main.py | 32 ++++ core/dbt/cli/types.py | 1 + core/dbt/task/retry.py | 113 +++++++++++ core/dbt/task/run_operation.py | 9 +- tests/functional/retry/fixtures.py | 47 +++++ tests/functional/retry/test_retry.py | 179 ++++++++++++++++++ tests/unit/test_retry_commands.py | 23 +++ 9 files changed, 411 insertions(+), 4 deletions(-) create mode 100644 .changes/unreleased/Features-20230602-083302.yaml create mode 100644 core/dbt/task/retry.py create mode 100644 tests/functional/retry/fixtures.py create mode 100644 tests/functional/retry/test_retry.py create mode 100644 tests/unit/test_retry_commands.py diff --git a/.changes/unreleased/Features-20230602-083302.yaml b/.changes/unreleased/Features-20230602-083302.yaml new file mode 100644 index 00000000000..b0f133b431a --- /dev/null +++ b/.changes/unreleased/Features-20230602-083302.yaml @@ -0,0 +1,6 @@ +kind: Features +body: dbt retry +time: 2023-06-02T08:33:02.410456-07:00 +custom: + Author: stu-k aranke + Issue: "7299" diff --git a/core/dbt/cli/flags.py b/core/dbt/cli/flags.py index 62c72afd5c5..d7178c0dedd 100644 --- a/core/dbt/cli/flags.py +++ b/core/dbt/cli/flags.py @@ -337,7 +337,9 @@ def add_fn(x): spinal_cased = k.replace("_", "-") - if v in (None, False): + if k == "macro" and command == CliCommand.RUN_OPERATION: + add_fn(v) + elif v in (None, False): add_fn(f"--no-{spinal_cased}") elif v is True: add_fn(f"--{spinal_cased}") @@ -384,6 +386,7 @@ def command_args(command: CliCommand) -> ArgsList: CliCommand.SNAPSHOT: cli.snapshot, CliCommand.SOURCE_FRESHNESS: cli.freshness, CliCommand.TEST: cli.test, + CliCommand.RETRY: cli.retry, } click_cmd: Optional[ClickCommand] = CMD_DICT.get(command, None) if click_cmd is None: diff --git a/core/dbt/cli/main.py b/core/dbt/cli/main.py index 47ebacf0067..4bd4d3a6034 100644 --- a/core/dbt/cli/main.py +++ b/core/dbt/cli/main.py @@ -30,6 +30,7 @@ from dbt.task.generate import GenerateTask from dbt.task.init import InitTask from dbt.task.list import ListTask +from dbt.task.retry import RetryTask from dbt.task.run import RunTask from dbt.task.run_operation import RunOperationTask from dbt.task.seed import SeedTask @@ -576,6 +577,36 @@ def run(ctx, **kwargs): return results, success +# dbt run +@cli.command("retry") +@click.pass_context +@p.project_dir +@p.profiles_dir +@p.vars +@p.profile +@p.target +@p.state +@p.threads +@p.fail_fast +@requires.postflight +@requires.preflight +@requires.profile +@requires.project +@requires.runtime_config +@requires.manifest +def retry(ctx, **kwargs): + """Retry the nodes that failed in the previous run.""" + task = RetryTask( + ctx.obj["flags"], + ctx.obj["runtime_config"], + ctx.obj["manifest"], + ) + + results = task.run() + success = task.interpret_results(results) + return results, success + + # dbt run operation @cli.command("run-operation") @click.pass_context @@ -586,6 +617,7 @@ def run(ctx, **kwargs): @p.project_dir @p.target @p.target_path +@p.threads @p.vars @requires.postflight @requires.preflight diff --git a/core/dbt/cli/types.py b/core/dbt/cli/types.py index 570b1f7cfdb..be87d67135e 100644 --- a/core/dbt/cli/types.py +++ b/core/dbt/cli/types.py @@ -22,6 +22,7 @@ class Command(Enum): SNAPSHOT = "snapshot" SOURCE_FRESHNESS = "freshness" TEST = "test" + RETRY = "retry" @classmethod def from_str(cls, s: str) -> "Command": diff --git a/core/dbt/task/retry.py b/core/dbt/task/retry.py new file mode 100644 index 00000000000..df870540c8e --- /dev/null +++ b/core/dbt/task/retry.py @@ -0,0 +1,113 @@ +from pathlib import Path + +from dbt.cli.flags import Flags +from dbt.cli.types import Command as CliCommand +from dbt.config import RuntimeConfig +from dbt.contracts.results import NodeStatus +from dbt.contracts.state import PreviousState +from dbt.exceptions import DbtRuntimeError +from dbt.graph import GraphQueue +from dbt.task.base import ConfiguredTask +from dbt.task.build import BuildTask +from dbt.task.compile import CompileTask +from dbt.task.generate import GenerateTask +from dbt.task.run import RunTask +from dbt.task.run_operation import RunOperationTask +from dbt.task.seed import SeedTask +from dbt.task.snapshot import SnapshotTask +from dbt.task.test import TestTask + +RETRYABLE_STATUSES = {NodeStatus.Error, NodeStatus.Fail, NodeStatus.Skipped, NodeStatus.RuntimeErr} + +TASK_DICT = { + "build": BuildTask, + "compile": CompileTask, + "generate": GenerateTask, + "seed": SeedTask, + "snapshot": SnapshotTask, + "test": TestTask, + "run": RunTask, + "run-operation": RunOperationTask, +} + +CMD_DICT = { + "build": CliCommand.BUILD, + "compile": CliCommand.COMPILE, + "generate": CliCommand.DOCS_GENERATE, + "seed": CliCommand.SEED, + "snapshot": CliCommand.SNAPSHOT, + "test": CliCommand.TEST, + "run": CliCommand.RUN, + "run-operation": CliCommand.RUN_OPERATION, +} + + +class RetryTask(ConfiguredTask): + def __init__(self, args, config, manifest): + super().__init__(args, config, manifest) + + state_path = self.args.state or self.config.target_path + + if self.args.warn_error: + RETRYABLE_STATUSES.add(NodeStatus.Warn) + + self.previous_state = PreviousState( + state_path=Path(state_path), + target_path=Path(self.config.target_path), + project_root=Path(self.config.project_root), + ) + + if not self.previous_state.results: + raise DbtRuntimeError( + f"Could not find previous run in '{state_path}' target directory" + ) + + self.previous_args = self.previous_state.results.args + self.previous_command_name = self.previous_args.get("which") + self.task_class = TASK_DICT.get(self.previous_command_name) + + def run(self): + unique_ids = set( + [ + result.unique_id + for result in self.previous_state.results.results + if result.status in RETRYABLE_STATUSES + ] + ) + + cli_command = CMD_DICT.get(self.previous_command_name) + + # Remove these args when their default values are present, otherwise they'll raise an exception + args_to_remove = { + "show": lambda x: True, + "resource_types": lambda x: x == [], + "warn_error_options": lambda x: x == {"exclude": [], "include": []}, + } + + for k, v in args_to_remove.items(): + if k in self.previous_args and v(self.previous_args[k]): + del self.previous_args[k] + + retry_flags = Flags.from_dict(cli_command, self.previous_args) + retry_config = RuntimeConfig.from_args(args=retry_flags) + + class TaskWrapper(self.task_class): + def get_graph_queue(self): + new_graph = self.graph.get_subset_graph(unique_ids) + return GraphQueue( + new_graph.graph, + self.manifest, + unique_ids, + ) + + task = TaskWrapper( + retry_flags, + retry_config, + self.manifest, + ) + + return_value = task.run() + return return_value + + def interpret_results(self, *args, **kwargs): + return self.task_class.interpret_results(*args, **kwargs) diff --git a/core/dbt/task/run_operation.py b/core/dbt/task/run_operation.py index c614aeda54c..aea21c7c6d5 100644 --- a/core/dbt/task/run_operation.py +++ b/core/dbt/task/run_operation.py @@ -49,6 +49,9 @@ def _run_unsafe(self) -> agate.Table: def run(self) -> RunResultsArtifact: start = datetime.utcnow() self.compile_manifest() + + success = True + try: self._run_unsafe() except dbt.exceptions.Exception as exc: @@ -59,8 +62,7 @@ def run(self) -> RunResultsArtifact: fire_event(RunningOperationUncaughtError(exc=str(exc))) fire_event(LogDebugStackTrace(exc_info=traceback.format_exc())) success = False - else: - success = True + end = datetime.utcnow() package_name, macro_name = self._get_macro_parts() @@ -108,5 +110,6 @@ def run(self) -> RunResultsArtifact: return results - def interpret_results(self, results): + @classmethod + def interpret_results(cls, results): return results.results[0].status == RunStatus.Success diff --git a/tests/functional/retry/fixtures.py b/tests/functional/retry/fixtures.py new file mode 100644 index 00000000000..1c063b4490a --- /dev/null +++ b/tests/functional/retry/fixtures.py @@ -0,0 +1,47 @@ +models__sample_model = """select 1 as id, baz as foo""" +models__second_model = """select 1 as id, 2 as bar""" + +models__union_model = """ +select foo + bar as sum3 from {{ ref('sample_model') }} +left join {{ ref('second_model') }} on sample_model.id = second_model.id +""" + +schema_yml = """ +models: + - name: sample_model + columns: + - name: foo + tests: + - accepted_values: + values: [3] + quote: false + config: + severity: warn + - name: second_model + columns: + - name: bar + tests: + - accepted_values: + values: [3] + quote: false + config: + severity: warn + - name: union_model + columns: + - name: sum3 + tests: + - accepted_values: + values: [3] + quote: false +""" + +macros__alter_timezone_sql = """ +{% macro alter_timezone(timezone='America/Los_Angeles') %} +{% set sql %} + SET TimeZone='{{ timezone }}'; +{% endset %} + +{% do run_query(sql) %} +{% do log("Timezone set to: " + timezone, info=True) %} +{% endmacro %} +""" diff --git a/tests/functional/retry/test_retry.py b/tests/functional/retry/test_retry.py new file mode 100644 index 00000000000..aed051d702b --- /dev/null +++ b/tests/functional/retry/test_retry.py @@ -0,0 +1,179 @@ +import pytest + +from dbt.contracts.results import RunStatus, TestStatus +from dbt.exceptions import DbtRuntimeError, TargetNotFoundError +from dbt.tests.util import run_dbt, write_file, rm_file +from tests.functional.retry.fixtures import ( + models__sample_model, + models__union_model, + schema_yml, + models__second_model, + macros__alter_timezone_sql, +) + + +class TestRetry: + @pytest.fixture(scope="class") + def models(self): + return { + "sample_model.sql": models__sample_model, + "second_model.sql": models__second_model, + "union_model.sql": models__union_model, + "schema.yml": schema_yml, + } + + @pytest.fixture(scope="class") + def macros(self): + return {"alter_timezone.sql": macros__alter_timezone_sql} + + def test_no_previous_run(self, project): + with pytest.raises( + DbtRuntimeError, match="Could not find previous run in 'target' target directory" + ): + run_dbt(["retry"]) + + with pytest.raises( + DbtRuntimeError, match="Could not find previous run in 'walmart' target directory" + ): + run_dbt(["retry", "--state", "walmart"]) + + def test_previous_run(self, project): + # Regular build + results = run_dbt(["build"], expect_pass=False) + + expected_statuses = { + "sample_model": RunStatus.Error, + "second_model": RunStatus.Success, + "union_model": RunStatus.Skipped, + "accepted_values_sample_model_foo__False__3": RunStatus.Skipped, + "accepted_values_second_model_bar__False__3": TestStatus.Warn, + "accepted_values_union_model_sum3__False__3": RunStatus.Skipped, + } + + assert {n.node.name: n.status for n in results.results} == expected_statuses + + # Ignore second_model which succeeded + results = run_dbt(["retry"], expect_pass=False) + + expected_statuses = { + "sample_model": RunStatus.Error, + "union_model": RunStatus.Skipped, + "accepted_values_union_model_sum3__False__3": RunStatus.Skipped, + "accepted_values_sample_model_foo__False__3": RunStatus.Skipped, + } + + assert {n.node.name: n.status for n in results.results} == expected_statuses + + # Fix sample model and retry, everything should pass + fixed_sql = "select 1 as id, 1 as foo" + write_file(fixed_sql, "models", "sample_model.sql") + + results = run_dbt(["retry"]) + + expected_statuses = { + "sample_model": RunStatus.Success, + "union_model": RunStatus.Success, + "accepted_values_union_model_sum3__False__3": TestStatus.Pass, + "accepted_values_sample_model_foo__False__3": TestStatus.Warn, + } + + assert {n.node.name: n.status for n in results.results} == expected_statuses + + # No failures in previous run, nothing to retry + results = run_dbt(["retry"]) + expected_statuses = {} + assert {n.node.name: n.status for n in results.results} == expected_statuses + + write_file(models__sample_model, "models", "sample_model.sql") + + def test_warn_error(self, project): + # Regular build + results = run_dbt(["--warn-error", "build", "--select", "second_model"], expect_pass=False) + + expected_statuses = { + "second_model": RunStatus.Success, + "accepted_values_second_model_bar__False__3": TestStatus.Fail, + } + + assert {n.node.name: n.status for n in results.results} == expected_statuses + + # Retry regular, should pass + run_dbt(["retry"]) + + # Retry with --warn-error, should fail + run_dbt(["--warn-error", "retry"], expect_pass=False) + + def test_custom_target(self, project): + run_dbt(["build", "--select", "second_model"]) + run_dbt( + ["build", "--select", "sample_model", "--target-path", "target2"], expect_pass=False + ) + + # Regular retry + results = run_dbt(["retry"]) + expected_statuses = {"accepted_values_second_model_bar__False__3": TestStatus.Warn} + assert {n.node.name: n.status for n in results.results} == expected_statuses + + # Retry with custom target + fixed_sql = "select 1 as id, 1 as foo" + write_file(fixed_sql, "models", "sample_model.sql") + + results = run_dbt(["retry", "--state", "target2"]) + expected_statuses = { + "sample_model": RunStatus.Success, + "accepted_values_sample_model_foo__False__3": TestStatus.Warn, + } + + assert {n.node.name: n.status for n in results.results} == expected_statuses + + write_file(models__sample_model, "models", "sample_model.sql") + + def test_run_operation(self, project): + results = run_dbt( + ["run-operation", "alter_timezone", "--args", "{timezone: abc}"], expect_pass=False + ) + + expected_statuses = { + "operation.test.alter_timezone": RunStatus.Error, + } + + assert {n.unique_id: n.status for n in results.results} == expected_statuses + + results = run_dbt(["retry"], expect_pass=False) + assert {n.unique_id: n.status for n in results.results} == expected_statuses + + def test_fail_fast(self, project): + result = run_dbt(["--warn-error", "build", "--fail-fast"], expect_pass=False) + + assert result.status == RunStatus.Error + assert result.node.name == "sample_model" + + results = run_dbt(["retry"], expect_pass=False) + + assert len(results.results) == 1 + assert results.results[0].status == RunStatus.Error + assert results.results[0].node.name == "sample_model" + + result = run_dbt(["retry", "--fail-fast"], expect_pass=False) + assert result.status == RunStatus.Error + assert result.node.name == "sample_model" + + def test_removed_file(self, project): + run_dbt(["build"], expect_pass=False) + + rm_file("models", "sample_model.sql") + + with pytest.raises( + TargetNotFoundError, match="depends on a node named 'sample_model' which was not found" + ): + run_dbt(["retry"], expect_pass=False) + + write_file(models__sample_model, "models", "sample_model.sql") + + def test_removed_file_leaf_node(self, project): + write_file(models__sample_model, "models", "third_model.sql") + run_dbt(["build"], expect_pass=False) + + rm_file("models", "third_model.sql") + with pytest.raises(ValueError, match="Couldn't find model 'model.test.third_model'"): + run_dbt(["retry"], expect_pass=False) diff --git a/tests/unit/test_retry_commands.py b/tests/unit/test_retry_commands.py new file mode 100644 index 00000000000..3eb151cb6a3 --- /dev/null +++ b/tests/unit/test_retry_commands.py @@ -0,0 +1,23 @@ +from dbt.cli.types import Command +from dbt.task.retry import TASK_DICT, CMD_DICT + +EXCLUDED_COMMANDS = { + "clean", + "debug", + "deps", + "freshness", + "init", + "list", + "parse", + "retry", + "show", + "serve", +} + + +def test_task_cmd_dicts(): + assert TASK_DICT.keys() == CMD_DICT.keys() + + +def test_exhaustive_commands(): + assert set(TASK_DICT.keys()).union(EXCLUDED_COMMANDS) == set(i.value.lower() for i in Command) From 8e1c4ec116e8968eb1cec39e713dbebed0e6a76c Mon Sep 17 00:00:00 2001 From: Doug Beatty <44704949+dbeatty10@users.noreply.github.com> Date: Tue, 6 Jun 2023 06:11:48 -0600 Subject: [PATCH 43/67] Fix not equals comparison to be null-safe for adapters/utils tests (#7776) * Fix names within functional test * Changelog entry * Test for implementation of null-safe equals comparison * Remove duplicated where filter * Fix null-safe equals comparison * Fix tests for `concat` and `hash` by using empty strings () instead of `null` * Remove macro namespace interpolation --- .../unreleased/Features-20230604-080052.yaml | 6 +++ .../dbt/tests/adapter/utils/base_utils.py | 18 +++++-- .../dbt/tests/adapter/utils/fixture_concat.py | 19 +++++-- .../dbt/tests/adapter/utils/fixture_equals.py | 41 ++++++++++++++ .../dbt/tests/adapter/utils/fixture_hash.py | 14 ++++- .../adapter/utils/fixture_null_compare.py | 2 +- .../dbt/tests/adapter/utils/test_equals.py | 54 +++++++++++++++++++ .../tests/adapter/utils/test_null_compare.py | 6 +-- 8 files changed, 147 insertions(+), 13 deletions(-) create mode 100644 .changes/unreleased/Features-20230604-080052.yaml create mode 100644 tests/adapter/dbt/tests/adapter/utils/fixture_equals.py create mode 100644 tests/adapter/dbt/tests/adapter/utils/test_equals.py diff --git a/.changes/unreleased/Features-20230604-080052.yaml b/.changes/unreleased/Features-20230604-080052.yaml new file mode 100644 index 00000000000..50e8dda5bdb --- /dev/null +++ b/.changes/unreleased/Features-20230604-080052.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Fix null-safe equals comparison via `equals` +time: 2023-06-04T08:00:52.537967-06:00 +custom: + Author: dbeatty10 + Issue: "7778" diff --git a/tests/adapter/dbt/tests/adapter/utils/base_utils.py b/tests/adapter/dbt/tests/adapter/utils/base_utils.py index 75d621c2bf9..622b4ab4224 100644 --- a/tests/adapter/dbt/tests/adapter/utils/base_utils.py +++ b/tests/adapter/dbt/tests/adapter/utils/base_utils.py @@ -2,9 +2,11 @@ from dbt.tests.util import run_dbt macros__equals_sql = """ -{% macro equals(actual, expected) %} -{# -- actual is not distinct from expected #} -(({{ actual }} = {{ expected }}) or ({{ actual }} is null and {{ expected }} is null)) +{% macro equals(expr1, expr2) -%} +case when (({{ expr1 }} = {{ expr2 }}) or ({{ expr1 }} is null and {{ expr2 }} is null)) + then 0 + else 1 +end = 0 {% endmacro %} """ @@ -15,6 +17,15 @@ {% endtest %} """ +macros__replace_empty_sql = """ +{% macro replace_empty(expr) -%} +case + when {{ expr }} = 'EMPTY' then '' + else {{ expr }} +end +{% endmacro %} +""" + class BaseUtils: # setup @@ -23,6 +34,7 @@ def macros(self): return { "equals.sql": macros__equals_sql, "test_assert_equal.sql": macros__test_assert_equal_sql, + "replace_empty.sql": macros__replace_empty_sql, } # make it possible to dynamically update the macro call with a namespace diff --git a/tests/adapter/dbt/tests/adapter/utils/fixture_concat.py b/tests/adapter/dbt/tests/adapter/utils/fixture_concat.py index d1630af3eea..8421d53eb66 100644 --- a/tests/adapter/dbt/tests/adapter/utils/fixture_concat.py +++ b/tests/adapter/dbt/tests/adapter/utils/fixture_concat.py @@ -1,18 +1,29 @@ # concat +# https://github.com/dbt-labs/dbt-core/issues/4725 seeds__data_concat_csv = """input_1,input_2,output a,b,ab -a,,a -,b,b -,, +a,EMPTY,a +EMPTY,b,b +EMPTY,EMPTY,EMPTY """ models__test_concat_sql = """ -with data as ( +with seed_data as ( select * from {{ ref('data_concat') }} +), + +data as ( + + select + {{ replace_empty('input_1') }} as input_1, + {{ replace_empty('input_2') }} as input_2, + {{ replace_empty('output') }} as output + from seed_data + ) select diff --git a/tests/adapter/dbt/tests/adapter/utils/fixture_equals.py b/tests/adapter/dbt/tests/adapter/utils/fixture_equals.py new file mode 100644 index 00000000000..67a6699c6ef --- /dev/null +++ b/tests/adapter/dbt/tests/adapter/utils/fixture_equals.py @@ -0,0 +1,41 @@ +# equals + +SEEDS__DATA_EQUALS_CSV = """key_name,x,y,expected +1,1,1,same +2,1,2,different +3,1,null,different +4,2,1,different +5,2,2,same +6,2,null,different +7,null,1,different +8,null,2,different +9,null,null,same +""" + + +MODELS__EQUAL_VALUES_SQL = """ +with data as ( + + select * from {{ ref('data_equals') }} + +) + +select * +from data +where + {{ equals('x', 'y') }} +""" + + +MODELS__NOT_EQUAL_VALUES_SQL = """ +with data as ( + + select * from {{ ref('data_equals') }} + +) + +select * +from data +where + not {{ equals('x', 'y') }} +""" diff --git a/tests/adapter/dbt/tests/adapter/utils/fixture_hash.py b/tests/adapter/dbt/tests/adapter/utils/fixture_hash.py index 39d8f02704c..91f366fc504 100644 --- a/tests/adapter/dbt/tests/adapter/utils/fixture_hash.py +++ b/tests/adapter/dbt/tests/adapter/utils/fixture_hash.py @@ -1,18 +1,28 @@ # hash +# https://github.com/dbt-labs/dbt-core/issues/4725 seeds__data_hash_csv = """input_1,output ab,187ef4436122d1cc2f40dc2b92f0eba0 a,0cc175b9c0f1b6a831c399e269772661 1,c4ca4238a0b923820dcc509a6f75849b -,d41d8cd98f00b204e9800998ecf8427e +EMPTY,d41d8cd98f00b204e9800998ecf8427e """ models__test_hash_sql = """ -with data as ( +with seed_data as ( select * from {{ ref('data_hash') }} +), + +data as ( + + select + {{ replace_empty('input_1') }} as input_1, + {{ replace_empty('output') }} as output + from seed_data + ) select diff --git a/tests/adapter/dbt/tests/adapter/utils/fixture_null_compare.py b/tests/adapter/dbt/tests/adapter/utils/fixture_null_compare.py index 8a524010082..9af2f9a2e32 100644 --- a/tests/adapter/dbt/tests/adapter/utils/fixture_null_compare.py +++ b/tests/adapter/dbt/tests/adapter/utils/fixture_null_compare.py @@ -8,7 +8,7 @@ MODELS__TEST_MIXED_NULL_COMPARE_YML = """ version: 2 models: - - name: test_null_compare + - name: test_mixed_null_compare tests: - assert_equal: actual: actual diff --git a/tests/adapter/dbt/tests/adapter/utils/test_equals.py b/tests/adapter/dbt/tests/adapter/utils/test_equals.py new file mode 100644 index 00000000000..51e7fe84bd3 --- /dev/null +++ b/tests/adapter/dbt/tests/adapter/utils/test_equals.py @@ -0,0 +1,54 @@ +import pytest +from dbt.tests.adapter.utils.base_utils import macros__equals_sql +from dbt.tests.adapter.utils.fixture_equals import ( + SEEDS__DATA_EQUALS_CSV, + MODELS__EQUAL_VALUES_SQL, + MODELS__NOT_EQUAL_VALUES_SQL, +) +from dbt.tests.util import run_dbt, relation_from_name + + +class BaseEquals: + @pytest.fixture(scope="class") + def macros(self): + return { + "equals.sql": macros__equals_sql, + } + + @pytest.fixture(scope="class") + def seeds(self): + return { + "data_equals.csv": SEEDS__DATA_EQUALS_CSV, + } + + @pytest.fixture(scope="class") + def models(self): + return { + "equal_values.sql": MODELS__EQUAL_VALUES_SQL, + "not_equal_values.sql": MODELS__NOT_EQUAL_VALUES_SQL, + } + + def test_equal_values(self, project): + run_dbt(["seed"]) + run_dbt(["run"]) + + # There are 9 cases total; 3 are equal and 6 are not equal + + # 3 are equal + relation = relation_from_name(project.adapter, "equal_values") + result = project.run_sql( + f"select count(*) as num_rows from {relation} where expected = 'same'", fetch="one" + ) + assert result[0] == 3 + + # 6 are not equal + relation = relation_from_name(project.adapter, "not_equal_values") + result = project.run_sql( + f"select count(*) as num_rows from {relation} where expected = 'different'", + fetch="one", + ) + assert result[0] == 6 + + +class TestEquals(BaseEquals): + pass diff --git a/tests/adapter/dbt/tests/adapter/utils/test_null_compare.py b/tests/adapter/dbt/tests/adapter/utils/test_null_compare.py index 58a1c9daaf9..eac901f3972 100644 --- a/tests/adapter/dbt/tests/adapter/utils/test_null_compare.py +++ b/tests/adapter/dbt/tests/adapter/utils/test_null_compare.py @@ -14,8 +14,8 @@ class BaseMixedNullCompare(BaseUtils): @pytest.fixture(scope="class") def models(self): return { - "test_mixed_null_compare.yml": MODELS__TEST_MIXED_NULL_COMPARE_SQL, - "test_mixed_null_compare.sql": MODELS__TEST_MIXED_NULL_COMPARE_YML, + "test_mixed_null_compare.yml": MODELS__TEST_MIXED_NULL_COMPARE_YML, + "test_mixed_null_compare.sql": MODELS__TEST_MIXED_NULL_COMPARE_SQL, } def test_build_assert_equal(self, project): @@ -32,7 +32,7 @@ def models(self): } -class TestMixedNullCompare(BaseNullCompare): +class TestMixedNullCompare(BaseMixedNullCompare): pass From 587bbcbf0def587c876cfd7ffe984889ac776e9f Mon Sep 17 00:00:00 2001 From: Emily Rockman Date: Tue, 6 Jun 2023 12:50:58 -0500 Subject: [PATCH 44/67] Improve warnings for constraints and materialization types (#7696) * first pass * debugging * regen proto types * refactor to use warn_supported flag * PR feedback --- .../unreleased/Fixes-20230525-073651.yaml | 6 + core/dbt/events/types.proto | 10 + core/dbt/events/types.py | 13 + core/dbt/events/types_pb2.py | 878 +++++++++--------- core/dbt/parser/schemas.py | 30 +- .../configs/test_contract_configs.py | 68 +- tests/unit/test_events.py | 1 + 7 files changed, 555 insertions(+), 451 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230525-073651.yaml diff --git a/.changes/unreleased/Fixes-20230525-073651.yaml b/.changes/unreleased/Fixes-20230525-073651.yaml new file mode 100644 index 00000000000..4d2d7fa3aa0 --- /dev/null +++ b/.changes/unreleased/Fixes-20230525-073651.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Improve warnings for constraints and materialization types +time: 2023-05-25T07:36:51.855641-05:00 +custom: + Author: emmyoop + Issue: "7335" diff --git a/core/dbt/events/types.proto b/core/dbt/events/types.proto index e91168e1ba9..5f12eee1d87 100644 --- a/core/dbt/events/types.proto +++ b/core/dbt/events/types.proto @@ -1216,6 +1216,16 @@ message DeprecatedReferenceMsg { DeprecatedReference data = 2; } +// I068 +message UnsupportedConstraintMaterialization { + string materialized = 1; +} + +message UnsupportedConstraintMaterializationMsg { + EventInfo info = 1; + UnsupportedConstraintMaterialization data = 2; +} + // M - Deps generation diff --git a/core/dbt/events/types.py b/core/dbt/events/types.py index 8b976cc86a1..89a00d86b3c 100644 --- a/core/dbt/events/types.py +++ b/core/dbt/events/types.py @@ -1203,6 +1203,19 @@ def message(self) -> str: return msg +class UnsupportedConstraintMaterialization(WarnLevel): + def code(self): + return "I068" + + def message(self) -> str: + msg = ( + f"Constraint types are not supported for {self.materialized} materializations and will " + "be ignored. Set 'warn_unsupported: false' on this constraint to ignore this warning." + ) + + return line_wrap_message(warning_tag(msg)) + + # ======================================================= # M - Deps generation # ======================================================= diff --git a/core/dbt/events/types_pb2.py b/core/dbt/events/types_pb2.py index 769d6187420..a91c8543d78 100644 --- a/core/dbt/events/types_pb2.py +++ b/core/dbt/events/types_pb2.py @@ -15,7 +15,7 @@ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btypes.proto\x12\x0bproto_types\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x02\n\tEventInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\t\x12\x15\n\rinvocation_id\x18\x05 \x01(\t\x12\x0b\n\x03pid\x18\x06 \x01(\x05\x12\x0e\n\x06thread\x18\x07 \x01(\t\x12&\n\x02ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x05\x65xtra\x18\t \x03(\x0b\x32!.proto_types.EventInfo.ExtraEntry\x12\x10\n\x08\x63\x61tegory\x18\n \x01(\t\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x7f\n\rTimingInfoMsg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x0cNodeRelation\x12\x10\n\x08\x64\x61tabase\x18\n \x01(\t\x12\x0e\n\x06schema\x18\x0b \x01(\t\x12\r\n\x05\x61lias\x18\x0c \x01(\t\x12\x15\n\rrelation_name\x18\r \x01(\t\"\x91\x02\n\x08NodeInfo\x12\x11\n\tnode_path\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x11\n\tunique_id\x18\x03 \x01(\t\x12\x15\n\rresource_type\x18\x04 \x01(\t\x12\x14\n\x0cmaterialized\x18\x05 \x01(\t\x12\x13\n\x0bnode_status\x18\x06 \x01(\t\x12\x17\n\x0fnode_started_at\x18\x07 \x01(\t\x12\x18\n\x10node_finished_at\x18\x08 \x01(\t\x12%\n\x04meta\x18\t \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x30\n\rnode_relation\x18\n \x01(\x0b\x32\x19.proto_types.NodeRelation\"\xd1\x01\n\x0cRunResultMsg\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12/\n\x0btiming_info\x18\x03 \x03(\x0b\x32\x1a.proto_types.TimingInfoMsg\x12\x0e\n\x06thread\x18\x04 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x31\n\x10\x61\x64\x61pter_response\x18\x06 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"G\n\x0fReferenceKeyMsg\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x12\n\nidentifier\x18\x03 \x01(\t\"6\n\x0eGenericMessage\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\"9\n\x11MainReportVersion\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0blog_version\x18\x02 \x01(\x05\"j\n\x14MainReportVersionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.MainReportVersion\"r\n\x0eMainReportArgs\x12\x33\n\x04\x61rgs\x18\x01 \x03(\x0b\x32%.proto_types.MainReportArgs.ArgsEntry\x1a+\n\tArgsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11MainReportArgsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainReportArgs\"+\n\x15MainTrackingUserState\x12\x12\n\nuser_state\x18\x01 \x01(\t\"r\n\x18MainTrackingUserStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainTrackingUserState\"5\n\x0fMergedFromState\x12\x12\n\nnum_merged\x18\x01 \x01(\x05\x12\x0e\n\x06sample\x18\x02 \x03(\t\"f\n\x12MergedFromStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.MergedFromState\"A\n\x14MissingProfileTarget\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\"p\n\x17MissingProfileTargetMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MissingProfileTarget\"(\n\x11InvalidOptionYAML\x12\x13\n\x0boption_name\x18\x01 \x01(\t\"j\n\x14InvalidOptionYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.InvalidOptionYAML\"!\n\x12LogDbtProjectError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15LogDbtProjectErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProjectError\"3\n\x12LogDbtProfileError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08profiles\x18\x02 \x03(\t\"l\n\x15LogDbtProfileErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProfileError\"!\n\x12StarterProjectPath\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"l\n\x15StarterProjectPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StarterProjectPath\"$\n\x15\x43onfigFolderDirectory\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"r\n\x18\x43onfigFolderDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConfigFolderDirectory\"\'\n\x14NoSampleProfileFound\x12\x0f\n\x07\x61\x64\x61pter\x18\x01 \x01(\t\"p\n\x17NoSampleProfileFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NoSampleProfileFound\"6\n\x18ProfileWrittenWithSample\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"x\n\x1bProfileWrittenWithSampleMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProfileWrittenWithSample\"B\n$ProfileWrittenWithTargetTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x90\x01\n\'ProfileWrittenWithTargetTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.ProfileWrittenWithTargetTemplateYAML\"C\n%ProfileWrittenWithProjectTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x92\x01\n(ProfileWrittenWithProjectTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.ProfileWrittenWithProjectTemplateYAML\"\x12\n\x10SettingUpProfile\"h\n\x13SettingUpProfileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SettingUpProfile\"\x1c\n\x1aInvalidProfileTemplateYAML\"|\n\x1dInvalidProfileTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.InvalidProfileTemplateYAML\"(\n\x18ProjectNameAlreadyExists\x12\x0c\n\x04name\x18\x01 \x01(\t\"x\n\x1bProjectNameAlreadyExistsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProjectNameAlreadyExists\"K\n\x0eProjectCreated\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocs_url\x18\x02 \x01(\t\x12\x11\n\tslack_url\x18\x03 \x01(\t\"d\n\x11ProjectCreatedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ProjectCreated\"@\n\x1aPackageRedirectDeprecation\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1dPackageRedirectDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PackageRedirectDeprecation\"\x1f\n\x1dPackageInstallPathDeprecation\"\x82\x01\n PackageInstallPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.PackageInstallPathDeprecation\"H\n\x1b\x43onfigSourcePathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"~\n\x1e\x43onfigSourcePathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigSourcePathDeprecation\"F\n\x19\x43onfigDataPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"z\n\x1c\x43onfigDataPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConfigDataPathDeprecation\"?\n\x19\x41\x64\x61pterDeprecationWarning\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"z\n\x1c\x41\x64\x61pterDeprecationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.AdapterDeprecationWarning\".\n\x17MetricAttributesRenamed\x12\x13\n\x0bmetric_name\x18\x01 \x01(\t\"v\n\x1aMetricAttributesRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.MetricAttributesRenamed\"+\n\x17\x45xposureNameDeprecation\x12\x10\n\x08\x65xposure\x18\x01 \x01(\t\"v\n\x1a\x45xposureNameDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.ExposureNameDeprecation\"^\n\x13InternalDeprecation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x18\n\x10suggested_action\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\"n\n\x16InternalDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.InternalDeprecation\"@\n\x1a\x45nvironmentVariableRenamed\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1d\x45nvironmentVariableRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.EnvironmentVariableRenamed\"3\n\x18\x43onfigLogPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"x\n\x1b\x43onfigLogPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ConfigLogPathDeprecation\"6\n\x1b\x43onfigTargetPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"~\n\x1e\x43onfigTargetPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigTargetPathDeprecation\"!\n\x1f\x43ollectFreshnessReturnSignature\"\x86\x01\n\"CollectFreshnessReturnSignatureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.CollectFreshnessReturnSignature\"\x87\x01\n\x11\x41\x64\x61pterEventDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"j\n\x14\x41\x64\x61pterEventDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventDebug\"\x86\x01\n\x10\x41\x64\x61pterEventInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"h\n\x13\x41\x64\x61pterEventInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.AdapterEventInfo\"\x89\x01\n\x13\x41\x64\x61pterEventWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"n\n\x16\x41\x64\x61pterEventWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.AdapterEventWarning\"\x99\x01\n\x11\x41\x64\x61pterEventError\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\x12\x10\n\x08\x65xc_info\x18\x05 \x01(\t\"j\n\x14\x41\x64\x61pterEventErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventError\"_\n\rNewConnection\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"b\n\x10NewConnectionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NewConnection\"=\n\x10\x43onnectionReused\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x16\n\x0eorig_conn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionReusedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionReused\"0\n\x1b\x43onnectionLeftOpenInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"~\n\x1e\x43onnectionLeftOpenInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConnectionLeftOpenInCleanup\".\n\x19\x43onnectionClosedInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"z\n\x1c\x43onnectionClosedInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConnectionClosedInCleanup\"_\n\x0eRollbackFailed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"d\n\x11RollbackFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RollbackFailed\"O\n\x10\x43onnectionClosed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionClosedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionClosed\"Q\n\x12\x43onnectionLeftOpen\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"l\n\x15\x43onnectionLeftOpenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ConnectionLeftOpen\"G\n\x08Rollback\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"X\n\x0bRollbackMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.Rollback\"@\n\tCacheMiss\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\"Z\n\x0c\x43\x61\x63heMissMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.CacheMiss\"b\n\rListRelations\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12/\n\trelations\x18\x03 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10ListRelationsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ListRelations\"`\n\x0e\x43onnectionUsed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"d\n\x11\x43onnectionUsedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ConnectionUsed\"T\n\x08SQLQuery\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x0b\n\x03sql\x18\x03 \x01(\t\"X\n\x0bSQLQueryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.SQLQuery\"[\n\x0eSQLQueryStatus\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x03 \x01(\x02\"d\n\x11SQLQueryStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SQLQueryStatus\"H\n\tSQLCommit\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"Z\n\x0cSQLCommitMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.SQLCommit\"a\n\rColTypeChange\x12\x11\n\torig_type\x18\x01 \x01(\t\x12\x10\n\x08new_type\x18\x02 \x01(\t\x12+\n\x05table\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10\x43olTypeChangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ColTypeChange\"@\n\x0eSchemaCreation\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"d\n\x11SchemaCreationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SchemaCreation\"<\n\nSchemaDrop\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"\\\n\rSchemaDropMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SchemaDrop\"\xde\x01\n\x0b\x43\x61\x63heAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12-\n\x07ref_key\x18\x02 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_2\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_3\x18\x04 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12.\n\x08ref_list\x18\x05 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"^\n\x0e\x43\x61\x63heActionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.CacheAction\"\x98\x01\n\x0e\x43\x61\x63heDumpGraph\x12\x33\n\x04\x64ump\x18\x01 \x03(\x0b\x32%.proto_types.CacheDumpGraph.DumpEntry\x12\x14\n\x0c\x62\x65\x66ore_after\x18\x02 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\t\x1a+\n\tDumpEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11\x43\x61\x63heDumpGraphMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CacheDumpGraph\"!\n\x12\x41\x64\x61pterImportError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15\x41\x64\x61pterImportErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.AdapterImportError\"#\n\x0fPluginLoadError\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"f\n\x12PluginLoadErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.PluginLoadError\"Z\n\x14NewConnectionOpening\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x18\n\x10\x63onnection_state\x18\x02 \x01(\t\"p\n\x17NewConnectionOpeningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NewConnectionOpening\"8\n\rCodeExecution\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ode_content\x18\x02 \x01(\t\"b\n\x10\x43odeExecutionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.CodeExecution\"6\n\x13\x43odeExecutionStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x02 \x01(\x02\"n\n\x16\x43odeExecutionStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.CodeExecutionStatus\"%\n\x16\x43\x61talogGenerationError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"t\n\x19\x43\x61talogGenerationErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.CatalogGenerationError\"-\n\x13WriteCatalogFailure\x12\x16\n\x0enum_exceptions\x18\x01 \x01(\x05\"n\n\x16WriteCatalogFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.WriteCatalogFailure\"\x1e\n\x0e\x43\x61talogWritten\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43\x61talogWrittenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CatalogWritten\"\x14\n\x12\x43\x61nnotGenerateDocs\"l\n\x15\x43\x61nnotGenerateDocsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.CannotGenerateDocs\"\x11\n\x0f\x42uildingCatalog\"f\n\x12\x42uildingCatalogMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.BuildingCatalog\"-\n\x18\x44\x61tabaseErrorRunningHook\x12\x11\n\thook_type\x18\x01 \x01(\t\"x\n\x1b\x44\x61tabaseErrorRunningHookMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DatabaseErrorRunningHook\"4\n\x0cHooksRunning\x12\x11\n\tnum_hooks\x18\x01 \x01(\x05\x12\x11\n\thook_type\x18\x02 \x01(\t\"`\n\x0fHooksRunningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.HooksRunning\"T\n\x14\x46inishedRunningStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\x12\x11\n\texecution\x18\x02 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x03 \x01(\x02\"p\n\x17\x46inishedRunningStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.FinishedRunningStats\"<\n\x15\x43onstraintNotEnforced\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"r\n\x18\x43onstraintNotEnforcedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConstraintNotEnforced\"=\n\x16\x43onstraintNotSupported\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"t\n\x19\x43onstraintNotSupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.ConstraintNotSupported\"7\n\x12InputFileDiffError\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x02 \x01(\t\"l\n\x15InputFileDiffErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InputFileDiffError\"t\n\x1aPublicationArtifactChanged\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"|\n\x1dPublicationArtifactChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PublicationArtifactChanged\"?\n\x14InvalidValueForField\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x13\n\x0b\x66ield_value\x18\x02 \x01(\t\"p\n\x17InvalidValueForFieldMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.InvalidValueForField\"Q\n\x11ValidationWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x11\n\tnode_name\x18\x03 \x01(\t\"j\n\x14ValidationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ValidationWarning\"!\n\x11ParsePerfInfoPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"j\n\x14ParsePerfInfoPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ParsePerfInfoPath\"1\n!PartialParsingErrorProcessingFile\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\"\x8a\x01\n$PartialParsingErrorProcessingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.PartialParsingErrorProcessingFile\"\x86\x01\n\x13PartialParsingError\x12?\n\x08\x65xc_info\x18\x01 \x03(\x0b\x32-.proto_types.PartialParsingError.ExcInfoEntry\x1a.\n\x0c\x45xcInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"n\n\x16PartialParsingErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.PartialParsingError\"\x1b\n\x19PartialParsingSkipParsing\"z\n\x1cPartialParsingSkipParsingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.PartialParsingSkipParsing\"&\n\x14UnableToPartialParse\x12\x0e\n\x06reason\x18\x01 \x01(\t\"p\n\x17UnableToPartialParseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.UnableToPartialParse\"f\n\x12StateCheckVarsHash\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\x12\x0c\n\x04vars\x18\x02 \x01(\t\x12\x0f\n\x07profile\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\"l\n\x15StateCheckVarsHashMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StateCheckVarsHash\"\x1a\n\x18PartialParsingNotEnabled\"x\n\x1bPartialParsingNotEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.PartialParsingNotEnabled\"C\n\x14ParsedFileLoadFailed\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"p\n\x17ParsedFileLoadFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.ParsedFileLoadFailed\"H\n\x15PartialParsingEnabled\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x05\x12\r\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x05\x12\x0f\n\x07\x63hanged\x18\x03 \x01(\x05\"r\n\x18PartialParsingEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.PartialParsingEnabled\"8\n\x12PartialParsingFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\"l\n\x15PartialParsingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.PartialParsingFile\"\xaf\x01\n\x1fInvalidDisabledTargetInTestNode\x12\x1b\n\x13resource_type_title\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1a\n\x12original_file_path\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\x12\x13\n\x0btarget_name\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\"\x86\x01\n\"InvalidDisabledTargetInTestNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.InvalidDisabledTargetInTestNode\"7\n\x18UnusedResourceConfigPath\x12\x1b\n\x13unused_config_paths\x18\x01 \x03(\t\"x\n\x1bUnusedResourceConfigPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.UnusedResourceConfigPath\"3\n\rSeedIncreased\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"b\n\x10SeedIncreasedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.SeedIncreased\">\n\x18SeedExceedsLimitSamePath\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"x\n\x1bSeedExceedsLimitSamePathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.SeedExceedsLimitSamePath\"D\n\x1eSeedExceedsLimitAndPathChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x84\x01\n!SeedExceedsLimitAndPathChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.SeedExceedsLimitAndPathChanged\"\\\n\x1fSeedExceedsLimitChecksumChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rchecksum_name\x18\x03 \x01(\t\"\x86\x01\n\"SeedExceedsLimitChecksumChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.SeedExceedsLimitChecksumChanged\"%\n\x0cUnusedTables\x12\x15\n\runused_tables\x18\x01 \x03(\t\"`\n\x0fUnusedTablesMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.UnusedTables\"\x87\x01\n\x17WrongResourceSchemaFile\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x1c\n\x14plural_resource_type\x18\x03 \x01(\t\x12\x10\n\x08yaml_key\x18\x04 \x01(\t\x12\x11\n\tfile_path\x18\x05 \x01(\t\"v\n\x1aWrongResourceSchemaFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.WrongResourceSchemaFile\"K\n\x10NoNodeForYamlKey\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x10\n\x08yaml_key\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x03 \x01(\t\"h\n\x13NoNodeForYamlKeyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.NoNodeForYamlKey\"+\n\x15MacroNotFoundForPatch\x12\x12\n\npatch_name\x18\x01 \x01(\t\"r\n\x18MacroNotFoundForPatchMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MacroNotFoundForPatch\"\xb8\x01\n\x16NodeNotFoundOrDisabled\x12\x1a\n\x12original_file_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1b\n\x13resource_type_title\x18\x03 \x01(\t\x12\x13\n\x0btarget_name\x18\x04 \x01(\t\x12\x13\n\x0btarget_kind\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\x12\x10\n\x08\x64isabled\x18\x07 \x01(\t\"t\n\x19NodeNotFoundOrDisabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.NodeNotFoundOrDisabled\"H\n\x0fJinjaLogWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"f\n\x12JinjaLogWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.JinjaLogWarning\"E\n\x0cJinjaLogInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"`\n\x0fJinjaLogInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.JinjaLogInfo\"F\n\rJinjaLogDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"b\n\x10JinjaLogDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.JinjaLogDebug\"\xae\x01\n\x1eUnpinnedRefNewVersionAvailable\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rref_node_name\x18\x02 \x01(\t\x12\x18\n\x10ref_node_package\x18\x03 \x01(\t\x12\x18\n\x10ref_node_version\x18\x04 \x01(\t\x12\x17\n\x0fref_max_version\x18\x05 \x01(\t\"\x84\x01\n!UnpinnedRefNewVersionAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.UnpinnedRefNewVersionAvailable\"V\n\x0f\x44\x65precatedModel\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\x18\n\x10\x64\x65precation_date\x18\x03 \x01(\t\"f\n\x12\x44\x65precatedModelMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DeprecatedModel\"\xc6\x01\n\x1cUpcomingReferenceDeprecation\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"\x80\x01\n\x1fUpcomingReferenceDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.UpcomingReferenceDeprecation\"\xbd\x01\n\x13\x44\x65precatedReference\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"n\n\x16\x44\x65precatedReferenceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DeprecatedReference\"/\n\x1dGitSparseCheckoutSubdirectory\x12\x0e\n\x06subdir\x18\x01 \x01(\t\"\x82\x01\n GitSparseCheckoutSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.GitSparseCheckoutSubdirectory\"/\n\x1bGitProgressCheckoutRevision\x12\x10\n\x08revision\x18\x01 \x01(\t\"~\n\x1eGitProgressCheckoutRevisionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.GitProgressCheckoutRevision\"4\n%GitProgressUpdatingExistingDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x92\x01\n(GitProgressUpdatingExistingDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.GitProgressUpdatingExistingDependency\".\n\x1fGitProgressPullingNewDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x86\x01\n\"GitProgressPullingNewDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressPullingNewDependency\"\x1d\n\x0eGitNothingToDo\x12\x0b\n\x03sha\x18\x01 \x01(\t\"d\n\x11GitNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.GitNothingToDo\"E\n\x1fGitProgressUpdatedCheckoutRange\x12\x11\n\tstart_sha\x18\x01 \x01(\t\x12\x0f\n\x07\x65nd_sha\x18\x02 \x01(\t\"\x86\x01\n\"GitProgressUpdatedCheckoutRangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressUpdatedCheckoutRange\"*\n\x17GitProgressCheckedOutAt\x12\x0f\n\x07\x65nd_sha\x18\x01 \x01(\t\"v\n\x1aGitProgressCheckedOutAtMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.GitProgressCheckedOutAt\")\n\x1aRegistryProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"|\n\x1dRegistryProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.RegistryProgressGETRequest\"=\n\x1bRegistryProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"~\n\x1eRegistryProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RegistryProgressGETResponse\"_\n\x1dSelectorReportInvalidSelector\x12\x17\n\x0fvalid_selectors\x18\x01 \x01(\t\x12\x13\n\x0bspec_method\x18\x02 \x01(\t\x12\x10\n\x08raw_spec\x18\x03 \x01(\t\"\x82\x01\n SelectorReportInvalidSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.SelectorReportInvalidSelector\"\x15\n\x13\x44\x65psNoPackagesFound\"n\n\x16\x44\x65psNoPackagesFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsNoPackagesFound\"/\n\x17\x44\x65psStartPackageInstall\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\"v\n\x1a\x44\x65psStartPackageInstallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsStartPackageInstall\"\'\n\x0f\x44\x65psInstallInfo\x12\x14\n\x0cversion_name\x18\x01 \x01(\t\"f\n\x12\x44\x65psInstallInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DepsInstallInfo\"-\n\x13\x44\x65psUpdateAvailable\x12\x16\n\x0eversion_latest\x18\x01 \x01(\t\"n\n\x16\x44\x65psUpdateAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsUpdateAvailable\"\x0e\n\x0c\x44\x65psUpToDate\"`\n\x0f\x44\x65psUpToDateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUpToDate\",\n\x14\x44\x65psListSubdirectory\x12\x14\n\x0csubdirectory\x18\x01 \x01(\t\"p\n\x17\x44\x65psListSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.DepsListSubdirectory\".\n\x1a\x44\x65psNotifyUpdatesAvailable\x12\x10\n\x08packages\x18\x01 \x03(\t\"|\n\x1d\x44\x65psNotifyUpdatesAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.DepsNotifyUpdatesAvailable\"1\n\x11RetryExternalCall\x12\x0f\n\x07\x61ttempt\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"j\n\x14RetryExternalCallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.RetryExternalCall\"#\n\x14RecordRetryException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17RecordRetryExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.RecordRetryException\".\n\x1fRegistryIndexProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"\x86\x01\n\"RegistryIndexProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryIndexProgressGETRequest\"B\n RegistryIndexProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"\x88\x01\n#RegistryIndexProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12;\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32-.proto_types.RegistryIndexProgressGETResponse\"2\n\x1eRegistryResponseUnexpectedType\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseUnexpectedTypeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseUnexpectedType\"2\n\x1eRegistryResponseMissingTopKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseMissingTopKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseMissingTopKeys\"5\n!RegistryResponseMissingNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x8a\x01\n$RegistryResponseMissingNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.RegistryResponseMissingNestedKeys\"3\n\x1fRegistryResponseExtraNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x86\x01\n\"RegistryResponseExtraNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryResponseExtraNestedKeys\"(\n\x18\x44\x65psSetDownloadDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\"x\n\x1b\x44\x65psSetDownloadDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsSetDownloadDirectory\"-\n\x0c\x44\x65psUnpinned\x12\x10\n\x08revision\x18\x01 \x01(\t\x12\x0b\n\x03git\x18\x02 \x01(\t\"`\n\x0f\x44\x65psUnpinnedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUnpinned\"/\n\x1bNoNodesForSelectionCriteria\x12\x10\n\x08spec_raw\x18\x01 \x01(\t\"~\n\x1eNoNodesForSelectionCriteriaMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.NoNodesForSelectionCriteria\"M\n\x1cPublicationArtifactAvailable\x12-\n\x0cpub_artifact\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\"\x80\x01\n\x1fPublicationArtifactAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.PublicationArtifactAvailable\"*\n\x1bRunningOperationCaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"~\n\x1eRunningOperationCaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RunningOperationCaughtError\"\x11\n\x0f\x43ompileComplete\"f\n\x12\x43ompileCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.CompileComplete\"\x18\n\x16\x46reshnessCheckComplete\"t\n\x19\x46reshnessCheckCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.FreshnessCheckComplete\"\x1c\n\nSeedHeader\x12\x0e\n\x06header\x18\x01 \x01(\t\"\\\n\rSeedHeaderMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SeedHeader\"3\n\x12SQLRunnerException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x02 \x01(\t\"l\n\x15SQLRunnerExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SQLRunnerException\"\xa8\x01\n\rLogTestResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x12\n\nnum_models\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"b\n\x10LogTestResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogTestResult\"k\n\x0cLogStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"`\n\x0fLogStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.LogStartLine\"\x95\x01\n\x0eLogModelResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogModelResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogModelResult\"\xfa\x01\n\x11LogSnapshotResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x34\n\x03\x63\x66g\x18\x07 \x03(\x0b\x32\'.proto_types.LogSnapshotResult.CfgEntry\x1a*\n\x08\x43\x66gEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"j\n\x14LogSnapshotResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.LogSnapshotResult\"\xb9\x01\n\rLogSeedResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x16\n\x0eresult_message\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x10\n\x08relation\x18\x08 \x01(\t\"b\n\x10LogSeedResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogSeedResult\"\xad\x01\n\x12LogFreshnessResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12(\n\tnode_info\x18\x02 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x13\n\x0bsource_name\x18\x06 \x01(\t\x12\x12\n\ntable_name\x18\x07 \x01(\t\"l\n\x15LogFreshnessResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogFreshnessResult\"\"\n\rLogCancelLine\x12\x11\n\tconn_name\x18\x01 \x01(\t\"b\n\x10LogCancelLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogCancelLine\"\x1f\n\x0f\x44\x65\x66\x61ultSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"f\n\x12\x44\x65\x66\x61ultSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DefaultSelector\"5\n\tNodeStart\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"Z\n\x0cNodeStartMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.NodeStart\"g\n\x0cNodeFinished\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12-\n\nrun_result\x18\x02 \x01(\x0b\x32\x19.proto_types.RunResultMsg\"`\n\x0fNodeFinishedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.NodeFinished\"+\n\x1bQueryCancelationUnsupported\x12\x0c\n\x04type\x18\x01 \x01(\t\"~\n\x1eQueryCancelationUnsupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.QueryCancelationUnsupported\"O\n\x0f\x43oncurrencyLine\x12\x13\n\x0bnum_threads\x18\x01 \x01(\x05\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\x12\x12\n\nnode_count\x18\x03 \x01(\x05\"f\n\x12\x43oncurrencyLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ConcurrencyLine\"E\n\x19WritingInjectedSQLForNode\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"z\n\x1cWritingInjectedSQLForNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.WritingInjectedSQLForNode\"9\n\rNodeCompiling\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeCompilingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeCompiling\"9\n\rNodeExecuting\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeExecutingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeExecuting\"m\n\x10LogHookStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"h\n\x13LogHookStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.LogHookStartLine\"\x93\x01\n\x0eLogHookEndLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogHookEndLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogHookEndLine\"\x93\x01\n\x0fSkippingDetails\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\x12\x11\n\tnode_name\x18\x04 \x01(\t\x12\r\n\x05index\x18\x05 \x01(\x05\x12\r\n\x05total\x18\x06 \x01(\x05\"f\n\x12SkippingDetailsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SkippingDetails\"\r\n\x0bNothingToDo\"^\n\x0eNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.NothingToDo\",\n\x1dRunningOperationUncaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"\x82\x01\n RunningOperationUncaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.RunningOperationUncaughtError\"\x93\x01\n\x0c\x45ndRunResult\x12*\n\x07results\x18\x01 \x03(\x0b\x32\x19.proto_types.RunResultMsg\x12\x14\n\x0c\x65lapsed_time\x18\x02 \x01(\x02\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07success\x18\x04 \x01(\x08\"`\n\x0f\x45ndRunResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.EndRunResult\"\x11\n\x0fNoNodesSelected\"f\n\x12NoNodesSelectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.NoNodesSelected\"w\n\x10\x43ommandCompleted\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x65lapsed\x18\x04 \x01(\x02\"h\n\x13\x43ommandCompletedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.CommandCompleted\"k\n\x08ShowNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0f\n\x07preview\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"X\n\x0bShowNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.ShowNode\"p\n\x0c\x43ompiledNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x10\n\x08\x63ompiled\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"`\n\x0f\x43ompiledNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.CompiledNode\"b\n\x17\x43\x61tchableExceptionOnRun\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"v\n\x1a\x43\x61tchableExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.CatchableExceptionOnRun\"5\n\x12InternalErrorOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\"l\n\x15InternalErrorOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InternalErrorOnRun\"K\n\x15GenericExceptionOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"r\n\x18GenericExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.GenericExceptionOnRun\"N\n\x1aNodeConnectionReleaseError\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"|\n\x1dNodeConnectionReleaseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.NodeConnectionReleaseError\"\x1f\n\nFoundStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\"\\\n\rFoundStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.FoundStats\"\x17\n\x15MainKeyboardInterrupt\"r\n\x18MainKeyboardInterruptMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainKeyboardInterrupt\"#\n\x14MainEncounteredError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17MainEncounteredErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MainEncounteredError\"%\n\x0eMainStackTrace\x12\x13\n\x0bstack_trace\x18\x01 \x01(\t\"d\n\x11MainStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainStackTrace\"@\n\x13SystemCouldNotWrite\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"n\n\x16SystemCouldNotWriteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.SystemCouldNotWrite\"!\n\x12SystemExecutingCmd\x12\x0b\n\x03\x63md\x18\x01 \x03(\t\"l\n\x15SystemExecutingCmdMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SystemExecutingCmd\"\x1c\n\x0cSystemStdOut\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdOut\"\x1c\n\x0cSystemStdErr\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdErrMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdErr\",\n\x16SystemReportReturnCode\x12\x12\n\nreturncode\x18\x01 \x01(\x05\"t\n\x19SystemReportReturnCodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.SystemReportReturnCode\"p\n\x13TimingInfoCollected\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12/\n\x0btiming_info\x18\x02 \x01(\x0b\x32\x1a.proto_types.TimingInfoMsg\"n\n\x16TimingInfoCollectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.TimingInfoCollected\"&\n\x12LogDebugStackTrace\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"l\n\x15LogDebugStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDebugStackTrace\"\x1e\n\x0e\x43heckCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43heckCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CheckCleanPath\" \n\x10\x43onfirmCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"h\n\x13\x43onfirmCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConfirmCleanPath\"\"\n\x12ProtectedCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"l\n\x15ProtectedCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ProtectedCleanPath\"\x14\n\x12\x46inishedCleanPaths\"l\n\x15\x46inishedCleanPathsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FinishedCleanPaths\"5\n\x0bOpenCommand\x12\x10\n\x08open_cmd\x18\x01 \x01(\t\x12\x14\n\x0cprofiles_dir\x18\x02 \x01(\t\"^\n\x0eOpenCommandMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.OpenCommand\"\x19\n\nFormatting\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rFormattingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.Formatting\"0\n\x0fServingDocsPort\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"f\n\x12ServingDocsPortMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ServingDocsPort\"%\n\x15ServingDocsAccessInfo\x12\x0c\n\x04port\x18\x01 \x01(\t\"r\n\x18ServingDocsAccessInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ServingDocsAccessInfo\"\x15\n\x13ServingDocsExitInfo\"n\n\x16ServingDocsExitInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.ServingDocsExitInfo\"J\n\x10RunResultWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultWarning\"J\n\x10RunResultFailure\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultFailure\"k\n\tStatsLine\x12\x30\n\x05stats\x18\x01 \x03(\x0b\x32!.proto_types.StatsLine.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"Z\n\x0cStatsLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.StatsLine\"\x1d\n\x0eRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11RunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RunResultError\")\n\x17RunResultErrorNoMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"v\n\x1aRunResultErrorNoMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultErrorNoMessage\"\x1f\n\x0fSQLCompiledPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"f\n\x12SQLCompiledPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SQLCompiledPath\"-\n\x14\x43heckNodeTestFailure\x12\x15\n\rrelation_name\x18\x01 \x01(\t\"p\n\x17\x43heckNodeTestFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.CheckNodeTestFailure\"\"\n\x13\x46irstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"n\n\x16\x46irstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.FirstRunResultError\"\'\n\x18\x41\x66terFirstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"x\n\x1b\x41\x66terFirstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.AfterFirstRunResultError\"W\n\x0f\x45ndOfRunSummary\x12\x12\n\nnum_errors\x18\x01 \x01(\x05\x12\x14\n\x0cnum_warnings\x18\x02 \x01(\x05\x12\x1a\n\x12keyboard_interrupt\x18\x03 \x01(\x08\"f\n\x12\x45ndOfRunSummaryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.EndOfRunSummary\"U\n\x13LogSkipBecauseError\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12\x10\n\x08relation\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"n\n\x16LogSkipBecauseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.LogSkipBecauseError\"\x14\n\x12\x45nsureGitInstalled\"l\n\x15\x45nsureGitInstalledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.EnsureGitInstalled\"\x1a\n\x18\x44\x65psCreatingLocalSymlink\"x\n\x1b\x44\x65psCreatingLocalSymlinkMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsCreatingLocalSymlink\"\x19\n\x17\x44\x65psSymlinkNotAvailable\"v\n\x1a\x44\x65psSymlinkNotAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsSymlinkNotAvailable\"\x11\n\x0f\x44isableTracking\"f\n\x12\x44isableTrackingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DisableTracking\"\x1e\n\x0cSendingEvent\x12\x0e\n\x06kwargs\x18\x01 \x01(\t\"`\n\x0fSendingEventMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SendingEvent\"\x12\n\x10SendEventFailure\"h\n\x13SendEventFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SendEventFailure\"\r\n\x0b\x46lushEvents\"^\n\x0e\x46lushEventsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.FlushEvents\"\x14\n\x12\x46lushEventsFailure\"l\n\x15\x46lushEventsFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FlushEventsFailure\"-\n\x19TrackingInitializeFailure\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"z\n\x1cTrackingInitializeFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.TrackingInitializeFailure\"&\n\x17RunResultWarningMessage\x12\x0b\n\x03msg\x18\x01 \x01(\t\"v\n\x1aRunResultWarningMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultWarningMessage\"\x1a\n\x0b\x44\x65\x62ugCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"^\n\x0e\x44\x65\x62ugCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.DebugCmdOut\"\x1d\n\x0e\x44\x65\x62ugCmdResult\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11\x44\x65\x62ugCmdResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.DebugCmdResult\"\x19\n\nListCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rListCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.ListCmdOut\"\x13\n\x04Note\x12\x0b\n\x03msg\x18\x01 \x01(\t\"P\n\x07NoteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x1f\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x11.proto_types.Noteb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btypes.proto\x12\x0bproto_types\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x02\n\tEventInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\t\x12\x15\n\rinvocation_id\x18\x05 \x01(\t\x12\x0b\n\x03pid\x18\x06 \x01(\x05\x12\x0e\n\x06thread\x18\x07 \x01(\t\x12&\n\x02ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x05\x65xtra\x18\t \x03(\x0b\x32!.proto_types.EventInfo.ExtraEntry\x12\x10\n\x08\x63\x61tegory\x18\n \x01(\t\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x7f\n\rTimingInfoMsg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x0cNodeRelation\x12\x10\n\x08\x64\x61tabase\x18\n \x01(\t\x12\x0e\n\x06schema\x18\x0b \x01(\t\x12\r\n\x05\x61lias\x18\x0c \x01(\t\x12\x15\n\rrelation_name\x18\r \x01(\t\"\x91\x02\n\x08NodeInfo\x12\x11\n\tnode_path\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x11\n\tunique_id\x18\x03 \x01(\t\x12\x15\n\rresource_type\x18\x04 \x01(\t\x12\x14\n\x0cmaterialized\x18\x05 \x01(\t\x12\x13\n\x0bnode_status\x18\x06 \x01(\t\x12\x17\n\x0fnode_started_at\x18\x07 \x01(\t\x12\x18\n\x10node_finished_at\x18\x08 \x01(\t\x12%\n\x04meta\x18\t \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x30\n\rnode_relation\x18\n \x01(\x0b\x32\x19.proto_types.NodeRelation\"\xd1\x01\n\x0cRunResultMsg\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12/\n\x0btiming_info\x18\x03 \x03(\x0b\x32\x1a.proto_types.TimingInfoMsg\x12\x0e\n\x06thread\x18\x04 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x31\n\x10\x61\x64\x61pter_response\x18\x06 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"G\n\x0fReferenceKeyMsg\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x12\n\nidentifier\x18\x03 \x01(\t\"6\n\x0eGenericMessage\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\"9\n\x11MainReportVersion\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0blog_version\x18\x02 \x01(\x05\"j\n\x14MainReportVersionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.MainReportVersion\"r\n\x0eMainReportArgs\x12\x33\n\x04\x61rgs\x18\x01 \x03(\x0b\x32%.proto_types.MainReportArgs.ArgsEntry\x1a+\n\tArgsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11MainReportArgsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainReportArgs\"+\n\x15MainTrackingUserState\x12\x12\n\nuser_state\x18\x01 \x01(\t\"r\n\x18MainTrackingUserStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainTrackingUserState\"5\n\x0fMergedFromState\x12\x12\n\nnum_merged\x18\x01 \x01(\x05\x12\x0e\n\x06sample\x18\x02 \x03(\t\"f\n\x12MergedFromStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.MergedFromState\"A\n\x14MissingProfileTarget\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\"p\n\x17MissingProfileTargetMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MissingProfileTarget\"(\n\x11InvalidOptionYAML\x12\x13\n\x0boption_name\x18\x01 \x01(\t\"j\n\x14InvalidOptionYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.InvalidOptionYAML\"!\n\x12LogDbtProjectError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15LogDbtProjectErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProjectError\"3\n\x12LogDbtProfileError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08profiles\x18\x02 \x03(\t\"l\n\x15LogDbtProfileErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProfileError\"!\n\x12StarterProjectPath\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"l\n\x15StarterProjectPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StarterProjectPath\"$\n\x15\x43onfigFolderDirectory\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"r\n\x18\x43onfigFolderDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConfigFolderDirectory\"\'\n\x14NoSampleProfileFound\x12\x0f\n\x07\x61\x64\x61pter\x18\x01 \x01(\t\"p\n\x17NoSampleProfileFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NoSampleProfileFound\"6\n\x18ProfileWrittenWithSample\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"x\n\x1bProfileWrittenWithSampleMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProfileWrittenWithSample\"B\n$ProfileWrittenWithTargetTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x90\x01\n\'ProfileWrittenWithTargetTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.ProfileWrittenWithTargetTemplateYAML\"C\n%ProfileWrittenWithProjectTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x92\x01\n(ProfileWrittenWithProjectTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.ProfileWrittenWithProjectTemplateYAML\"\x12\n\x10SettingUpProfile\"h\n\x13SettingUpProfileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SettingUpProfile\"\x1c\n\x1aInvalidProfileTemplateYAML\"|\n\x1dInvalidProfileTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.InvalidProfileTemplateYAML\"(\n\x18ProjectNameAlreadyExists\x12\x0c\n\x04name\x18\x01 \x01(\t\"x\n\x1bProjectNameAlreadyExistsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProjectNameAlreadyExists\"K\n\x0eProjectCreated\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocs_url\x18\x02 \x01(\t\x12\x11\n\tslack_url\x18\x03 \x01(\t\"d\n\x11ProjectCreatedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ProjectCreated\"@\n\x1aPackageRedirectDeprecation\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1dPackageRedirectDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PackageRedirectDeprecation\"\x1f\n\x1dPackageInstallPathDeprecation\"\x82\x01\n PackageInstallPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.PackageInstallPathDeprecation\"H\n\x1b\x43onfigSourcePathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"~\n\x1e\x43onfigSourcePathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigSourcePathDeprecation\"F\n\x19\x43onfigDataPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"z\n\x1c\x43onfigDataPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConfigDataPathDeprecation\"?\n\x19\x41\x64\x61pterDeprecationWarning\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"z\n\x1c\x41\x64\x61pterDeprecationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.AdapterDeprecationWarning\".\n\x17MetricAttributesRenamed\x12\x13\n\x0bmetric_name\x18\x01 \x01(\t\"v\n\x1aMetricAttributesRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.MetricAttributesRenamed\"+\n\x17\x45xposureNameDeprecation\x12\x10\n\x08\x65xposure\x18\x01 \x01(\t\"v\n\x1a\x45xposureNameDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.ExposureNameDeprecation\"^\n\x13InternalDeprecation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x18\n\x10suggested_action\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\"n\n\x16InternalDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.InternalDeprecation\"@\n\x1a\x45nvironmentVariableRenamed\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1d\x45nvironmentVariableRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.EnvironmentVariableRenamed\"3\n\x18\x43onfigLogPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"x\n\x1b\x43onfigLogPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ConfigLogPathDeprecation\"6\n\x1b\x43onfigTargetPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"~\n\x1e\x43onfigTargetPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigTargetPathDeprecation\"!\n\x1f\x43ollectFreshnessReturnSignature\"\x86\x01\n\"CollectFreshnessReturnSignatureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.CollectFreshnessReturnSignature\"\x87\x01\n\x11\x41\x64\x61pterEventDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"j\n\x14\x41\x64\x61pterEventDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventDebug\"\x86\x01\n\x10\x41\x64\x61pterEventInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"h\n\x13\x41\x64\x61pterEventInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.AdapterEventInfo\"\x89\x01\n\x13\x41\x64\x61pterEventWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"n\n\x16\x41\x64\x61pterEventWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.AdapterEventWarning\"\x99\x01\n\x11\x41\x64\x61pterEventError\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\x12\x10\n\x08\x65xc_info\x18\x05 \x01(\t\"j\n\x14\x41\x64\x61pterEventErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventError\"_\n\rNewConnection\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"b\n\x10NewConnectionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NewConnection\"=\n\x10\x43onnectionReused\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x16\n\x0eorig_conn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionReusedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionReused\"0\n\x1b\x43onnectionLeftOpenInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"~\n\x1e\x43onnectionLeftOpenInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConnectionLeftOpenInCleanup\".\n\x19\x43onnectionClosedInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"z\n\x1c\x43onnectionClosedInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConnectionClosedInCleanup\"_\n\x0eRollbackFailed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"d\n\x11RollbackFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RollbackFailed\"O\n\x10\x43onnectionClosed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionClosedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionClosed\"Q\n\x12\x43onnectionLeftOpen\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"l\n\x15\x43onnectionLeftOpenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ConnectionLeftOpen\"G\n\x08Rollback\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"X\n\x0bRollbackMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.Rollback\"@\n\tCacheMiss\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\"Z\n\x0c\x43\x61\x63heMissMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.CacheMiss\"b\n\rListRelations\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12/\n\trelations\x18\x03 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10ListRelationsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ListRelations\"`\n\x0e\x43onnectionUsed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"d\n\x11\x43onnectionUsedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ConnectionUsed\"T\n\x08SQLQuery\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x0b\n\x03sql\x18\x03 \x01(\t\"X\n\x0bSQLQueryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.SQLQuery\"[\n\x0eSQLQueryStatus\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x03 \x01(\x02\"d\n\x11SQLQueryStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SQLQueryStatus\"H\n\tSQLCommit\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"Z\n\x0cSQLCommitMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.SQLCommit\"a\n\rColTypeChange\x12\x11\n\torig_type\x18\x01 \x01(\t\x12\x10\n\x08new_type\x18\x02 \x01(\t\x12+\n\x05table\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10\x43olTypeChangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ColTypeChange\"@\n\x0eSchemaCreation\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"d\n\x11SchemaCreationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SchemaCreation\"<\n\nSchemaDrop\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"\\\n\rSchemaDropMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SchemaDrop\"\xde\x01\n\x0b\x43\x61\x63heAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12-\n\x07ref_key\x18\x02 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_2\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_3\x18\x04 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12.\n\x08ref_list\x18\x05 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"^\n\x0e\x43\x61\x63heActionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.CacheAction\"\x98\x01\n\x0e\x43\x61\x63heDumpGraph\x12\x33\n\x04\x64ump\x18\x01 \x03(\x0b\x32%.proto_types.CacheDumpGraph.DumpEntry\x12\x14\n\x0c\x62\x65\x66ore_after\x18\x02 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\t\x1a+\n\tDumpEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11\x43\x61\x63heDumpGraphMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CacheDumpGraph\"!\n\x12\x41\x64\x61pterImportError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15\x41\x64\x61pterImportErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.AdapterImportError\"#\n\x0fPluginLoadError\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"f\n\x12PluginLoadErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.PluginLoadError\"Z\n\x14NewConnectionOpening\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x18\n\x10\x63onnection_state\x18\x02 \x01(\t\"p\n\x17NewConnectionOpeningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NewConnectionOpening\"8\n\rCodeExecution\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ode_content\x18\x02 \x01(\t\"b\n\x10\x43odeExecutionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.CodeExecution\"6\n\x13\x43odeExecutionStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x02 \x01(\x02\"n\n\x16\x43odeExecutionStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.CodeExecutionStatus\"%\n\x16\x43\x61talogGenerationError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"t\n\x19\x43\x61talogGenerationErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.CatalogGenerationError\"-\n\x13WriteCatalogFailure\x12\x16\n\x0enum_exceptions\x18\x01 \x01(\x05\"n\n\x16WriteCatalogFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.WriteCatalogFailure\"\x1e\n\x0e\x43\x61talogWritten\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43\x61talogWrittenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CatalogWritten\"\x14\n\x12\x43\x61nnotGenerateDocs\"l\n\x15\x43\x61nnotGenerateDocsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.CannotGenerateDocs\"\x11\n\x0f\x42uildingCatalog\"f\n\x12\x42uildingCatalogMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.BuildingCatalog\"-\n\x18\x44\x61tabaseErrorRunningHook\x12\x11\n\thook_type\x18\x01 \x01(\t\"x\n\x1b\x44\x61tabaseErrorRunningHookMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DatabaseErrorRunningHook\"4\n\x0cHooksRunning\x12\x11\n\tnum_hooks\x18\x01 \x01(\x05\x12\x11\n\thook_type\x18\x02 \x01(\t\"`\n\x0fHooksRunningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.HooksRunning\"T\n\x14\x46inishedRunningStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\x12\x11\n\texecution\x18\x02 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x03 \x01(\x02\"p\n\x17\x46inishedRunningStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.FinishedRunningStats\"<\n\x15\x43onstraintNotEnforced\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"r\n\x18\x43onstraintNotEnforcedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConstraintNotEnforced\"=\n\x16\x43onstraintNotSupported\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"t\n\x19\x43onstraintNotSupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.ConstraintNotSupported\"7\n\x12InputFileDiffError\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x02 \x01(\t\"l\n\x15InputFileDiffErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InputFileDiffError\"t\n\x1aPublicationArtifactChanged\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"|\n\x1dPublicationArtifactChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PublicationArtifactChanged\"?\n\x14InvalidValueForField\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x13\n\x0b\x66ield_value\x18\x02 \x01(\t\"p\n\x17InvalidValueForFieldMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.InvalidValueForField\"Q\n\x11ValidationWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x11\n\tnode_name\x18\x03 \x01(\t\"j\n\x14ValidationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ValidationWarning\"!\n\x11ParsePerfInfoPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"j\n\x14ParsePerfInfoPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ParsePerfInfoPath\"1\n!PartialParsingErrorProcessingFile\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\"\x8a\x01\n$PartialParsingErrorProcessingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.PartialParsingErrorProcessingFile\"\x86\x01\n\x13PartialParsingError\x12?\n\x08\x65xc_info\x18\x01 \x03(\x0b\x32-.proto_types.PartialParsingError.ExcInfoEntry\x1a.\n\x0c\x45xcInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"n\n\x16PartialParsingErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.PartialParsingError\"\x1b\n\x19PartialParsingSkipParsing\"z\n\x1cPartialParsingSkipParsingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.PartialParsingSkipParsing\"&\n\x14UnableToPartialParse\x12\x0e\n\x06reason\x18\x01 \x01(\t\"p\n\x17UnableToPartialParseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.UnableToPartialParse\"f\n\x12StateCheckVarsHash\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\x12\x0c\n\x04vars\x18\x02 \x01(\t\x12\x0f\n\x07profile\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\"l\n\x15StateCheckVarsHashMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StateCheckVarsHash\"\x1a\n\x18PartialParsingNotEnabled\"x\n\x1bPartialParsingNotEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.PartialParsingNotEnabled\"C\n\x14ParsedFileLoadFailed\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"p\n\x17ParsedFileLoadFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.ParsedFileLoadFailed\"H\n\x15PartialParsingEnabled\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x05\x12\r\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x05\x12\x0f\n\x07\x63hanged\x18\x03 \x01(\x05\"r\n\x18PartialParsingEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.PartialParsingEnabled\"8\n\x12PartialParsingFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\"l\n\x15PartialParsingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.PartialParsingFile\"\xaf\x01\n\x1fInvalidDisabledTargetInTestNode\x12\x1b\n\x13resource_type_title\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1a\n\x12original_file_path\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\x12\x13\n\x0btarget_name\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\"\x86\x01\n\"InvalidDisabledTargetInTestNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.InvalidDisabledTargetInTestNode\"7\n\x18UnusedResourceConfigPath\x12\x1b\n\x13unused_config_paths\x18\x01 \x03(\t\"x\n\x1bUnusedResourceConfigPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.UnusedResourceConfigPath\"3\n\rSeedIncreased\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"b\n\x10SeedIncreasedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.SeedIncreased\">\n\x18SeedExceedsLimitSamePath\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"x\n\x1bSeedExceedsLimitSamePathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.SeedExceedsLimitSamePath\"D\n\x1eSeedExceedsLimitAndPathChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x84\x01\n!SeedExceedsLimitAndPathChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.SeedExceedsLimitAndPathChanged\"\\\n\x1fSeedExceedsLimitChecksumChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rchecksum_name\x18\x03 \x01(\t\"\x86\x01\n\"SeedExceedsLimitChecksumChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.SeedExceedsLimitChecksumChanged\"%\n\x0cUnusedTables\x12\x15\n\runused_tables\x18\x01 \x03(\t\"`\n\x0fUnusedTablesMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.UnusedTables\"\x87\x01\n\x17WrongResourceSchemaFile\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x1c\n\x14plural_resource_type\x18\x03 \x01(\t\x12\x10\n\x08yaml_key\x18\x04 \x01(\t\x12\x11\n\tfile_path\x18\x05 \x01(\t\"v\n\x1aWrongResourceSchemaFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.WrongResourceSchemaFile\"K\n\x10NoNodeForYamlKey\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x10\n\x08yaml_key\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x03 \x01(\t\"h\n\x13NoNodeForYamlKeyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.NoNodeForYamlKey\"+\n\x15MacroNotFoundForPatch\x12\x12\n\npatch_name\x18\x01 \x01(\t\"r\n\x18MacroNotFoundForPatchMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MacroNotFoundForPatch\"\xb8\x01\n\x16NodeNotFoundOrDisabled\x12\x1a\n\x12original_file_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1b\n\x13resource_type_title\x18\x03 \x01(\t\x12\x13\n\x0btarget_name\x18\x04 \x01(\t\x12\x13\n\x0btarget_kind\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\x12\x10\n\x08\x64isabled\x18\x07 \x01(\t\"t\n\x19NodeNotFoundOrDisabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.NodeNotFoundOrDisabled\"H\n\x0fJinjaLogWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"f\n\x12JinjaLogWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.JinjaLogWarning\"E\n\x0cJinjaLogInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"`\n\x0fJinjaLogInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.JinjaLogInfo\"F\n\rJinjaLogDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"b\n\x10JinjaLogDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.JinjaLogDebug\"\xae\x01\n\x1eUnpinnedRefNewVersionAvailable\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rref_node_name\x18\x02 \x01(\t\x12\x18\n\x10ref_node_package\x18\x03 \x01(\t\x12\x18\n\x10ref_node_version\x18\x04 \x01(\t\x12\x17\n\x0fref_max_version\x18\x05 \x01(\t\"\x84\x01\n!UnpinnedRefNewVersionAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.UnpinnedRefNewVersionAvailable\"V\n\x0f\x44\x65precatedModel\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\x18\n\x10\x64\x65precation_date\x18\x03 \x01(\t\"f\n\x12\x44\x65precatedModelMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DeprecatedModel\"\xc6\x01\n\x1cUpcomingReferenceDeprecation\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"\x80\x01\n\x1fUpcomingReferenceDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.UpcomingReferenceDeprecation\"\xbd\x01\n\x13\x44\x65precatedReference\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"n\n\x16\x44\x65precatedReferenceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DeprecatedReference\"<\n$UnsupportedConstraintMaterialization\x12\x14\n\x0cmaterialized\x18\x01 \x01(\t\"\x90\x01\n\'UnsupportedConstraintMaterializationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.UnsupportedConstraintMaterialization\"/\n\x1dGitSparseCheckoutSubdirectory\x12\x0e\n\x06subdir\x18\x01 \x01(\t\"\x82\x01\n GitSparseCheckoutSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.GitSparseCheckoutSubdirectory\"/\n\x1bGitProgressCheckoutRevision\x12\x10\n\x08revision\x18\x01 \x01(\t\"~\n\x1eGitProgressCheckoutRevisionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.GitProgressCheckoutRevision\"4\n%GitProgressUpdatingExistingDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x92\x01\n(GitProgressUpdatingExistingDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.GitProgressUpdatingExistingDependency\".\n\x1fGitProgressPullingNewDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x86\x01\n\"GitProgressPullingNewDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressPullingNewDependency\"\x1d\n\x0eGitNothingToDo\x12\x0b\n\x03sha\x18\x01 \x01(\t\"d\n\x11GitNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.GitNothingToDo\"E\n\x1fGitProgressUpdatedCheckoutRange\x12\x11\n\tstart_sha\x18\x01 \x01(\t\x12\x0f\n\x07\x65nd_sha\x18\x02 \x01(\t\"\x86\x01\n\"GitProgressUpdatedCheckoutRangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressUpdatedCheckoutRange\"*\n\x17GitProgressCheckedOutAt\x12\x0f\n\x07\x65nd_sha\x18\x01 \x01(\t\"v\n\x1aGitProgressCheckedOutAtMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.GitProgressCheckedOutAt\")\n\x1aRegistryProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"|\n\x1dRegistryProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.RegistryProgressGETRequest\"=\n\x1bRegistryProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"~\n\x1eRegistryProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RegistryProgressGETResponse\"_\n\x1dSelectorReportInvalidSelector\x12\x17\n\x0fvalid_selectors\x18\x01 \x01(\t\x12\x13\n\x0bspec_method\x18\x02 \x01(\t\x12\x10\n\x08raw_spec\x18\x03 \x01(\t\"\x82\x01\n SelectorReportInvalidSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.SelectorReportInvalidSelector\"\x15\n\x13\x44\x65psNoPackagesFound\"n\n\x16\x44\x65psNoPackagesFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsNoPackagesFound\"/\n\x17\x44\x65psStartPackageInstall\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\"v\n\x1a\x44\x65psStartPackageInstallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsStartPackageInstall\"\'\n\x0f\x44\x65psInstallInfo\x12\x14\n\x0cversion_name\x18\x01 \x01(\t\"f\n\x12\x44\x65psInstallInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DepsInstallInfo\"-\n\x13\x44\x65psUpdateAvailable\x12\x16\n\x0eversion_latest\x18\x01 \x01(\t\"n\n\x16\x44\x65psUpdateAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsUpdateAvailable\"\x0e\n\x0c\x44\x65psUpToDate\"`\n\x0f\x44\x65psUpToDateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUpToDate\",\n\x14\x44\x65psListSubdirectory\x12\x14\n\x0csubdirectory\x18\x01 \x01(\t\"p\n\x17\x44\x65psListSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.DepsListSubdirectory\".\n\x1a\x44\x65psNotifyUpdatesAvailable\x12\x10\n\x08packages\x18\x01 \x03(\t\"|\n\x1d\x44\x65psNotifyUpdatesAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.DepsNotifyUpdatesAvailable\"1\n\x11RetryExternalCall\x12\x0f\n\x07\x61ttempt\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"j\n\x14RetryExternalCallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.RetryExternalCall\"#\n\x14RecordRetryException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17RecordRetryExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.RecordRetryException\".\n\x1fRegistryIndexProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"\x86\x01\n\"RegistryIndexProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryIndexProgressGETRequest\"B\n RegistryIndexProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"\x88\x01\n#RegistryIndexProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12;\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32-.proto_types.RegistryIndexProgressGETResponse\"2\n\x1eRegistryResponseUnexpectedType\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseUnexpectedTypeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseUnexpectedType\"2\n\x1eRegistryResponseMissingTopKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseMissingTopKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseMissingTopKeys\"5\n!RegistryResponseMissingNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x8a\x01\n$RegistryResponseMissingNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.RegistryResponseMissingNestedKeys\"3\n\x1fRegistryResponseExtraNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x86\x01\n\"RegistryResponseExtraNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryResponseExtraNestedKeys\"(\n\x18\x44\x65psSetDownloadDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\"x\n\x1b\x44\x65psSetDownloadDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsSetDownloadDirectory\"-\n\x0c\x44\x65psUnpinned\x12\x10\n\x08revision\x18\x01 \x01(\t\x12\x0b\n\x03git\x18\x02 \x01(\t\"`\n\x0f\x44\x65psUnpinnedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUnpinned\"/\n\x1bNoNodesForSelectionCriteria\x12\x10\n\x08spec_raw\x18\x01 \x01(\t\"~\n\x1eNoNodesForSelectionCriteriaMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.NoNodesForSelectionCriteria\"M\n\x1cPublicationArtifactAvailable\x12-\n\x0cpub_artifact\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\"\x80\x01\n\x1fPublicationArtifactAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.PublicationArtifactAvailable\"*\n\x1bRunningOperationCaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"~\n\x1eRunningOperationCaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RunningOperationCaughtError\"\x11\n\x0f\x43ompileComplete\"f\n\x12\x43ompileCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.CompileComplete\"\x18\n\x16\x46reshnessCheckComplete\"t\n\x19\x46reshnessCheckCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.FreshnessCheckComplete\"\x1c\n\nSeedHeader\x12\x0e\n\x06header\x18\x01 \x01(\t\"\\\n\rSeedHeaderMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SeedHeader\"3\n\x12SQLRunnerException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x02 \x01(\t\"l\n\x15SQLRunnerExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SQLRunnerException\"\xa8\x01\n\rLogTestResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x12\n\nnum_models\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"b\n\x10LogTestResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogTestResult\"k\n\x0cLogStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"`\n\x0fLogStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.LogStartLine\"\x95\x01\n\x0eLogModelResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogModelResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogModelResult\"\xfa\x01\n\x11LogSnapshotResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x34\n\x03\x63\x66g\x18\x07 \x03(\x0b\x32\'.proto_types.LogSnapshotResult.CfgEntry\x1a*\n\x08\x43\x66gEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"j\n\x14LogSnapshotResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.LogSnapshotResult\"\xb9\x01\n\rLogSeedResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x16\n\x0eresult_message\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x10\n\x08relation\x18\x08 \x01(\t\"b\n\x10LogSeedResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogSeedResult\"\xad\x01\n\x12LogFreshnessResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12(\n\tnode_info\x18\x02 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x13\n\x0bsource_name\x18\x06 \x01(\t\x12\x12\n\ntable_name\x18\x07 \x01(\t\"l\n\x15LogFreshnessResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogFreshnessResult\"\"\n\rLogCancelLine\x12\x11\n\tconn_name\x18\x01 \x01(\t\"b\n\x10LogCancelLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogCancelLine\"\x1f\n\x0f\x44\x65\x66\x61ultSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"f\n\x12\x44\x65\x66\x61ultSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DefaultSelector\"5\n\tNodeStart\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"Z\n\x0cNodeStartMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.NodeStart\"g\n\x0cNodeFinished\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12-\n\nrun_result\x18\x02 \x01(\x0b\x32\x19.proto_types.RunResultMsg\"`\n\x0fNodeFinishedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.NodeFinished\"+\n\x1bQueryCancelationUnsupported\x12\x0c\n\x04type\x18\x01 \x01(\t\"~\n\x1eQueryCancelationUnsupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.QueryCancelationUnsupported\"O\n\x0f\x43oncurrencyLine\x12\x13\n\x0bnum_threads\x18\x01 \x01(\x05\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\x12\x12\n\nnode_count\x18\x03 \x01(\x05\"f\n\x12\x43oncurrencyLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ConcurrencyLine\"E\n\x19WritingInjectedSQLForNode\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"z\n\x1cWritingInjectedSQLForNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.WritingInjectedSQLForNode\"9\n\rNodeCompiling\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeCompilingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeCompiling\"9\n\rNodeExecuting\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeExecutingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeExecuting\"m\n\x10LogHookStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"h\n\x13LogHookStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.LogHookStartLine\"\x93\x01\n\x0eLogHookEndLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogHookEndLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogHookEndLine\"\x93\x01\n\x0fSkippingDetails\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\x12\x11\n\tnode_name\x18\x04 \x01(\t\x12\r\n\x05index\x18\x05 \x01(\x05\x12\r\n\x05total\x18\x06 \x01(\x05\"f\n\x12SkippingDetailsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SkippingDetails\"\r\n\x0bNothingToDo\"^\n\x0eNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.NothingToDo\",\n\x1dRunningOperationUncaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"\x82\x01\n RunningOperationUncaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.RunningOperationUncaughtError\"\x93\x01\n\x0c\x45ndRunResult\x12*\n\x07results\x18\x01 \x03(\x0b\x32\x19.proto_types.RunResultMsg\x12\x14\n\x0c\x65lapsed_time\x18\x02 \x01(\x02\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07success\x18\x04 \x01(\x08\"`\n\x0f\x45ndRunResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.EndRunResult\"\x11\n\x0fNoNodesSelected\"f\n\x12NoNodesSelectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.NoNodesSelected\"w\n\x10\x43ommandCompleted\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x65lapsed\x18\x04 \x01(\x02\"h\n\x13\x43ommandCompletedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.CommandCompleted\"k\n\x08ShowNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0f\n\x07preview\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"X\n\x0bShowNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.ShowNode\"p\n\x0c\x43ompiledNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x10\n\x08\x63ompiled\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"`\n\x0f\x43ompiledNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.CompiledNode\"b\n\x17\x43\x61tchableExceptionOnRun\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"v\n\x1a\x43\x61tchableExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.CatchableExceptionOnRun\"5\n\x12InternalErrorOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\"l\n\x15InternalErrorOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InternalErrorOnRun\"K\n\x15GenericExceptionOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"r\n\x18GenericExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.GenericExceptionOnRun\"N\n\x1aNodeConnectionReleaseError\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"|\n\x1dNodeConnectionReleaseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.NodeConnectionReleaseError\"\x1f\n\nFoundStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\"\\\n\rFoundStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.FoundStats\"\x17\n\x15MainKeyboardInterrupt\"r\n\x18MainKeyboardInterruptMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainKeyboardInterrupt\"#\n\x14MainEncounteredError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17MainEncounteredErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MainEncounteredError\"%\n\x0eMainStackTrace\x12\x13\n\x0bstack_trace\x18\x01 \x01(\t\"d\n\x11MainStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainStackTrace\"@\n\x13SystemCouldNotWrite\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"n\n\x16SystemCouldNotWriteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.SystemCouldNotWrite\"!\n\x12SystemExecutingCmd\x12\x0b\n\x03\x63md\x18\x01 \x03(\t\"l\n\x15SystemExecutingCmdMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SystemExecutingCmd\"\x1c\n\x0cSystemStdOut\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdOut\"\x1c\n\x0cSystemStdErr\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdErrMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdErr\",\n\x16SystemReportReturnCode\x12\x12\n\nreturncode\x18\x01 \x01(\x05\"t\n\x19SystemReportReturnCodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.SystemReportReturnCode\"p\n\x13TimingInfoCollected\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12/\n\x0btiming_info\x18\x02 \x01(\x0b\x32\x1a.proto_types.TimingInfoMsg\"n\n\x16TimingInfoCollectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.TimingInfoCollected\"&\n\x12LogDebugStackTrace\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"l\n\x15LogDebugStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDebugStackTrace\"\x1e\n\x0e\x43heckCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43heckCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CheckCleanPath\" \n\x10\x43onfirmCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"h\n\x13\x43onfirmCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConfirmCleanPath\"\"\n\x12ProtectedCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"l\n\x15ProtectedCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ProtectedCleanPath\"\x14\n\x12\x46inishedCleanPaths\"l\n\x15\x46inishedCleanPathsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FinishedCleanPaths\"5\n\x0bOpenCommand\x12\x10\n\x08open_cmd\x18\x01 \x01(\t\x12\x14\n\x0cprofiles_dir\x18\x02 \x01(\t\"^\n\x0eOpenCommandMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.OpenCommand\"\x19\n\nFormatting\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rFormattingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.Formatting\"0\n\x0fServingDocsPort\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"f\n\x12ServingDocsPortMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ServingDocsPort\"%\n\x15ServingDocsAccessInfo\x12\x0c\n\x04port\x18\x01 \x01(\t\"r\n\x18ServingDocsAccessInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ServingDocsAccessInfo\"\x15\n\x13ServingDocsExitInfo\"n\n\x16ServingDocsExitInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.ServingDocsExitInfo\"J\n\x10RunResultWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultWarning\"J\n\x10RunResultFailure\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultFailure\"k\n\tStatsLine\x12\x30\n\x05stats\x18\x01 \x03(\x0b\x32!.proto_types.StatsLine.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"Z\n\x0cStatsLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.StatsLine\"\x1d\n\x0eRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11RunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RunResultError\")\n\x17RunResultErrorNoMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"v\n\x1aRunResultErrorNoMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultErrorNoMessage\"\x1f\n\x0fSQLCompiledPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"f\n\x12SQLCompiledPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SQLCompiledPath\"-\n\x14\x43heckNodeTestFailure\x12\x15\n\rrelation_name\x18\x01 \x01(\t\"p\n\x17\x43heckNodeTestFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.CheckNodeTestFailure\"\"\n\x13\x46irstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"n\n\x16\x46irstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.FirstRunResultError\"\'\n\x18\x41\x66terFirstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"x\n\x1b\x41\x66terFirstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.AfterFirstRunResultError\"W\n\x0f\x45ndOfRunSummary\x12\x12\n\nnum_errors\x18\x01 \x01(\x05\x12\x14\n\x0cnum_warnings\x18\x02 \x01(\x05\x12\x1a\n\x12keyboard_interrupt\x18\x03 \x01(\x08\"f\n\x12\x45ndOfRunSummaryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.EndOfRunSummary\"U\n\x13LogSkipBecauseError\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12\x10\n\x08relation\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"n\n\x16LogSkipBecauseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.LogSkipBecauseError\"\x14\n\x12\x45nsureGitInstalled\"l\n\x15\x45nsureGitInstalledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.EnsureGitInstalled\"\x1a\n\x18\x44\x65psCreatingLocalSymlink\"x\n\x1b\x44\x65psCreatingLocalSymlinkMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsCreatingLocalSymlink\"\x19\n\x17\x44\x65psSymlinkNotAvailable\"v\n\x1a\x44\x65psSymlinkNotAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsSymlinkNotAvailable\"\x11\n\x0f\x44isableTracking\"f\n\x12\x44isableTrackingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DisableTracking\"\x1e\n\x0cSendingEvent\x12\x0e\n\x06kwargs\x18\x01 \x01(\t\"`\n\x0fSendingEventMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SendingEvent\"\x12\n\x10SendEventFailure\"h\n\x13SendEventFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SendEventFailure\"\r\n\x0b\x46lushEvents\"^\n\x0e\x46lushEventsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.FlushEvents\"\x14\n\x12\x46lushEventsFailure\"l\n\x15\x46lushEventsFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FlushEventsFailure\"-\n\x19TrackingInitializeFailure\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"z\n\x1cTrackingInitializeFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.TrackingInitializeFailure\"&\n\x17RunResultWarningMessage\x12\x0b\n\x03msg\x18\x01 \x01(\t\"v\n\x1aRunResultWarningMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultWarningMessage\"\x1a\n\x0b\x44\x65\x62ugCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"^\n\x0e\x44\x65\x62ugCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.DebugCmdOut\"\x1d\n\x0e\x44\x65\x62ugCmdResult\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11\x44\x65\x62ugCmdResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.DebugCmdResult\"\x19\n\nListCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rListCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.ListCmdOut\"\x13\n\x04Note\x12\x0b\n\x03msg\x18\x01 \x01(\t\"P\n\x07NoteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x1f\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x11.proto_types.Noteb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'types_pb2', globals()) @@ -456,440 +456,444 @@ _DEPRECATEDREFERENCE._serialized_end=19941 _DEPRECATEDREFERENCEMSG._serialized_start=19943 _DEPRECATEDREFERENCEMSG._serialized_end=20053 - _GITSPARSECHECKOUTSUBDIRECTORY._serialized_start=20055 - _GITSPARSECHECKOUTSUBDIRECTORY._serialized_end=20102 - _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_start=20105 - _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_end=20235 - _GITPROGRESSCHECKOUTREVISION._serialized_start=20237 - _GITPROGRESSCHECKOUTREVISION._serialized_end=20284 - _GITPROGRESSCHECKOUTREVISIONMSG._serialized_start=20286 - _GITPROGRESSCHECKOUTREVISIONMSG._serialized_end=20412 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_start=20414 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_end=20466 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_start=20469 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_end=20615 - _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_start=20617 - _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_end=20663 - _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_start=20666 - _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_end=20800 - _GITNOTHINGTODO._serialized_start=20802 - _GITNOTHINGTODO._serialized_end=20831 - _GITNOTHINGTODOMSG._serialized_start=20833 - _GITNOTHINGTODOMSG._serialized_end=20933 - _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_start=20935 - _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_end=21004 - _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_start=21007 - _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_end=21141 - _GITPROGRESSCHECKEDOUTAT._serialized_start=21143 - _GITPROGRESSCHECKEDOUTAT._serialized_end=21185 - _GITPROGRESSCHECKEDOUTATMSG._serialized_start=21187 - _GITPROGRESSCHECKEDOUTATMSG._serialized_end=21305 - _REGISTRYPROGRESSGETREQUEST._serialized_start=21307 - _REGISTRYPROGRESSGETREQUEST._serialized_end=21348 - _REGISTRYPROGRESSGETREQUESTMSG._serialized_start=21350 - _REGISTRYPROGRESSGETREQUESTMSG._serialized_end=21474 - _REGISTRYPROGRESSGETRESPONSE._serialized_start=21476 - _REGISTRYPROGRESSGETRESPONSE._serialized_end=21537 - _REGISTRYPROGRESSGETRESPONSEMSG._serialized_start=21539 - _REGISTRYPROGRESSGETRESPONSEMSG._serialized_end=21665 - _SELECTORREPORTINVALIDSELECTOR._serialized_start=21667 - _SELECTORREPORTINVALIDSELECTOR._serialized_end=21762 - _SELECTORREPORTINVALIDSELECTORMSG._serialized_start=21765 - _SELECTORREPORTINVALIDSELECTORMSG._serialized_end=21895 - _DEPSNOPACKAGESFOUND._serialized_start=21897 - _DEPSNOPACKAGESFOUND._serialized_end=21918 - _DEPSNOPACKAGESFOUNDMSG._serialized_start=21920 - _DEPSNOPACKAGESFOUNDMSG._serialized_end=22030 - _DEPSSTARTPACKAGEINSTALL._serialized_start=22032 - _DEPSSTARTPACKAGEINSTALL._serialized_end=22079 - _DEPSSTARTPACKAGEINSTALLMSG._serialized_start=22081 - _DEPSSTARTPACKAGEINSTALLMSG._serialized_end=22199 - _DEPSINSTALLINFO._serialized_start=22201 - _DEPSINSTALLINFO._serialized_end=22240 - _DEPSINSTALLINFOMSG._serialized_start=22242 - _DEPSINSTALLINFOMSG._serialized_end=22344 - _DEPSUPDATEAVAILABLE._serialized_start=22346 - _DEPSUPDATEAVAILABLE._serialized_end=22391 - _DEPSUPDATEAVAILABLEMSG._serialized_start=22393 - _DEPSUPDATEAVAILABLEMSG._serialized_end=22503 - _DEPSUPTODATE._serialized_start=22505 - _DEPSUPTODATE._serialized_end=22519 - _DEPSUPTODATEMSG._serialized_start=22521 - _DEPSUPTODATEMSG._serialized_end=22617 - _DEPSLISTSUBDIRECTORY._serialized_start=22619 - _DEPSLISTSUBDIRECTORY._serialized_end=22663 - _DEPSLISTSUBDIRECTORYMSG._serialized_start=22665 - _DEPSLISTSUBDIRECTORYMSG._serialized_end=22777 - _DEPSNOTIFYUPDATESAVAILABLE._serialized_start=22779 - _DEPSNOTIFYUPDATESAVAILABLE._serialized_end=22825 - _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_start=22827 - _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_end=22951 - _RETRYEXTERNALCALL._serialized_start=22953 - _RETRYEXTERNALCALL._serialized_end=23002 - _RETRYEXTERNALCALLMSG._serialized_start=23004 - _RETRYEXTERNALCALLMSG._serialized_end=23110 - _RECORDRETRYEXCEPTION._serialized_start=23112 - _RECORDRETRYEXCEPTION._serialized_end=23147 - _RECORDRETRYEXCEPTIONMSG._serialized_start=23149 - _RECORDRETRYEXCEPTIONMSG._serialized_end=23261 - _REGISTRYINDEXPROGRESSGETREQUEST._serialized_start=23263 - _REGISTRYINDEXPROGRESSGETREQUEST._serialized_end=23309 - _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_start=23312 - _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_end=23446 - _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_start=23448 - _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_end=23514 - _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_start=23517 - _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_end=23653 - _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_start=23655 - _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_end=23705 - _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_start=23708 - _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_end=23840 - _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_start=23842 - _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_end=23892 - _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_start=23895 - _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_end=24027 - _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_start=24029 - _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_end=24082 - _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_start=24085 - _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_end=24223 - _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_start=24225 - _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_end=24276 - _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_start=24279 - _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_end=24413 - _DEPSSETDOWNLOADDIRECTORY._serialized_start=24415 - _DEPSSETDOWNLOADDIRECTORY._serialized_end=24455 - _DEPSSETDOWNLOADDIRECTORYMSG._serialized_start=24457 - _DEPSSETDOWNLOADDIRECTORYMSG._serialized_end=24577 - _DEPSUNPINNED._serialized_start=24579 - _DEPSUNPINNED._serialized_end=24624 - _DEPSUNPINNEDMSG._serialized_start=24626 - _DEPSUNPINNEDMSG._serialized_end=24722 - _NONODESFORSELECTIONCRITERIA._serialized_start=24724 - _NONODESFORSELECTIONCRITERIA._serialized_end=24771 - _NONODESFORSELECTIONCRITERIAMSG._serialized_start=24773 - _NONODESFORSELECTIONCRITERIAMSG._serialized_end=24899 - _PUBLICATIONARTIFACTAVAILABLE._serialized_start=24901 - _PUBLICATIONARTIFACTAVAILABLE._serialized_end=24978 - _PUBLICATIONARTIFACTAVAILABLEMSG._serialized_start=24981 - _PUBLICATIONARTIFACTAVAILABLEMSG._serialized_end=25109 - _RUNNINGOPERATIONCAUGHTERROR._serialized_start=25111 - _RUNNINGOPERATIONCAUGHTERROR._serialized_end=25153 - _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_start=25155 - _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_end=25281 - _COMPILECOMPLETE._serialized_start=25283 - _COMPILECOMPLETE._serialized_end=25300 - _COMPILECOMPLETEMSG._serialized_start=25302 - _COMPILECOMPLETEMSG._serialized_end=25404 - _FRESHNESSCHECKCOMPLETE._serialized_start=25406 - _FRESHNESSCHECKCOMPLETE._serialized_end=25430 - _FRESHNESSCHECKCOMPLETEMSG._serialized_start=25432 - _FRESHNESSCHECKCOMPLETEMSG._serialized_end=25548 - _SEEDHEADER._serialized_start=25550 - _SEEDHEADER._serialized_end=25578 - _SEEDHEADERMSG._serialized_start=25580 - _SEEDHEADERMSG._serialized_end=25672 - _SQLRUNNEREXCEPTION._serialized_start=25674 - _SQLRUNNEREXCEPTION._serialized_end=25725 - _SQLRUNNEREXCEPTIONMSG._serialized_start=25727 - _SQLRUNNEREXCEPTIONMSG._serialized_end=25835 - _LOGTESTRESULT._serialized_start=25838 - _LOGTESTRESULT._serialized_end=26006 - _LOGTESTRESULTMSG._serialized_start=26008 - _LOGTESTRESULTMSG._serialized_end=26106 - _LOGSTARTLINE._serialized_start=26108 - _LOGSTARTLINE._serialized_end=26215 - _LOGSTARTLINEMSG._serialized_start=26217 - _LOGSTARTLINEMSG._serialized_end=26313 - _LOGMODELRESULT._serialized_start=26316 - _LOGMODELRESULT._serialized_end=26465 - _LOGMODELRESULTMSG._serialized_start=26467 - _LOGMODELRESULTMSG._serialized_end=26567 - _LOGSNAPSHOTRESULT._serialized_start=26570 - _LOGSNAPSHOTRESULT._serialized_end=26820 - _LOGSNAPSHOTRESULT_CFGENTRY._serialized_start=26778 - _LOGSNAPSHOTRESULT_CFGENTRY._serialized_end=26820 - _LOGSNAPSHOTRESULTMSG._serialized_start=26822 - _LOGSNAPSHOTRESULTMSG._serialized_end=26928 - _LOGSEEDRESULT._serialized_start=26931 - _LOGSEEDRESULT._serialized_end=27116 - _LOGSEEDRESULTMSG._serialized_start=27118 - _LOGSEEDRESULTMSG._serialized_end=27216 - _LOGFRESHNESSRESULT._serialized_start=27219 - _LOGFRESHNESSRESULT._serialized_end=27392 - _LOGFRESHNESSRESULTMSG._serialized_start=27394 - _LOGFRESHNESSRESULTMSG._serialized_end=27502 - _LOGCANCELLINE._serialized_start=27504 - _LOGCANCELLINE._serialized_end=27538 - _LOGCANCELLINEMSG._serialized_start=27540 - _LOGCANCELLINEMSG._serialized_end=27638 - _DEFAULTSELECTOR._serialized_start=27640 - _DEFAULTSELECTOR._serialized_end=27671 - _DEFAULTSELECTORMSG._serialized_start=27673 - _DEFAULTSELECTORMSG._serialized_end=27775 - _NODESTART._serialized_start=27777 - _NODESTART._serialized_end=27830 - _NODESTARTMSG._serialized_start=27832 - _NODESTARTMSG._serialized_end=27922 - _NODEFINISHED._serialized_start=27924 - _NODEFINISHED._serialized_end=28027 - _NODEFINISHEDMSG._serialized_start=28029 - _NODEFINISHEDMSG._serialized_end=28125 - _QUERYCANCELATIONUNSUPPORTED._serialized_start=28127 - _QUERYCANCELATIONUNSUPPORTED._serialized_end=28170 - _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_start=28172 - _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_end=28298 - _CONCURRENCYLINE._serialized_start=28300 - _CONCURRENCYLINE._serialized_end=28379 - _CONCURRENCYLINEMSG._serialized_start=28381 - _CONCURRENCYLINEMSG._serialized_end=28483 - _WRITINGINJECTEDSQLFORNODE._serialized_start=28485 - _WRITINGINJECTEDSQLFORNODE._serialized_end=28554 - _WRITINGINJECTEDSQLFORNODEMSG._serialized_start=28556 - _WRITINGINJECTEDSQLFORNODEMSG._serialized_end=28678 - _NODECOMPILING._serialized_start=28680 - _NODECOMPILING._serialized_end=28737 - _NODECOMPILINGMSG._serialized_start=28739 - _NODECOMPILINGMSG._serialized_end=28837 - _NODEEXECUTING._serialized_start=28839 - _NODEEXECUTING._serialized_end=28896 - _NODEEXECUTINGMSG._serialized_start=28898 - _NODEEXECUTINGMSG._serialized_end=28996 - _LOGHOOKSTARTLINE._serialized_start=28998 - _LOGHOOKSTARTLINE._serialized_end=29107 - _LOGHOOKSTARTLINEMSG._serialized_start=29109 - _LOGHOOKSTARTLINEMSG._serialized_end=29213 - _LOGHOOKENDLINE._serialized_start=29216 - _LOGHOOKENDLINE._serialized_end=29363 - _LOGHOOKENDLINEMSG._serialized_start=29365 - _LOGHOOKENDLINEMSG._serialized_end=29465 - _SKIPPINGDETAILS._serialized_start=29468 - _SKIPPINGDETAILS._serialized_end=29615 - _SKIPPINGDETAILSMSG._serialized_start=29617 - _SKIPPINGDETAILSMSG._serialized_end=29719 - _NOTHINGTODO._serialized_start=29721 - _NOTHINGTODO._serialized_end=29734 - _NOTHINGTODOMSG._serialized_start=29736 - _NOTHINGTODOMSG._serialized_end=29830 - _RUNNINGOPERATIONUNCAUGHTERROR._serialized_start=29832 - _RUNNINGOPERATIONUNCAUGHTERROR._serialized_end=29876 - _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_start=29879 - _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_end=30009 - _ENDRUNRESULT._serialized_start=30012 - _ENDRUNRESULT._serialized_end=30159 - _ENDRUNRESULTMSG._serialized_start=30161 - _ENDRUNRESULTMSG._serialized_end=30257 - _NONODESSELECTED._serialized_start=30259 - _NONODESSELECTED._serialized_end=30276 - _NONODESSELECTEDMSG._serialized_start=30278 - _NONODESSELECTEDMSG._serialized_end=30380 - _COMMANDCOMPLETED._serialized_start=30382 - _COMMANDCOMPLETED._serialized_end=30501 - _COMMANDCOMPLETEDMSG._serialized_start=30503 - _COMMANDCOMPLETEDMSG._serialized_end=30607 - _SHOWNODE._serialized_start=30609 - _SHOWNODE._serialized_end=30716 - _SHOWNODEMSG._serialized_start=30718 - _SHOWNODEMSG._serialized_end=30806 - _COMPILEDNODE._serialized_start=30808 - _COMPILEDNODE._serialized_end=30920 - _COMPILEDNODEMSG._serialized_start=30922 - _COMPILEDNODEMSG._serialized_end=31018 - _CATCHABLEEXCEPTIONONRUN._serialized_start=31020 - _CATCHABLEEXCEPTIONONRUN._serialized_end=31118 - _CATCHABLEEXCEPTIONONRUNMSG._serialized_start=31120 - _CATCHABLEEXCEPTIONONRUNMSG._serialized_end=31238 - _INTERNALERRORONRUN._serialized_start=31240 - _INTERNALERRORONRUN._serialized_end=31293 - _INTERNALERRORONRUNMSG._serialized_start=31295 - _INTERNALERRORONRUNMSG._serialized_end=31403 - _GENERICEXCEPTIONONRUN._serialized_start=31405 - _GENERICEXCEPTIONONRUN._serialized_end=31480 - _GENERICEXCEPTIONONRUNMSG._serialized_start=31482 - _GENERICEXCEPTIONONRUNMSG._serialized_end=31596 - _NODECONNECTIONRELEASEERROR._serialized_start=31598 - _NODECONNECTIONRELEASEERROR._serialized_end=31676 - _NODECONNECTIONRELEASEERRORMSG._serialized_start=31678 - _NODECONNECTIONRELEASEERRORMSG._serialized_end=31802 - _FOUNDSTATS._serialized_start=31804 - _FOUNDSTATS._serialized_end=31835 - _FOUNDSTATSMSG._serialized_start=31837 - _FOUNDSTATSMSG._serialized_end=31929 - _MAINKEYBOARDINTERRUPT._serialized_start=31931 - _MAINKEYBOARDINTERRUPT._serialized_end=31954 - _MAINKEYBOARDINTERRUPTMSG._serialized_start=31956 - _MAINKEYBOARDINTERRUPTMSG._serialized_end=32070 - _MAINENCOUNTEREDERROR._serialized_start=32072 - _MAINENCOUNTEREDERROR._serialized_end=32107 - _MAINENCOUNTEREDERRORMSG._serialized_start=32109 - _MAINENCOUNTEREDERRORMSG._serialized_end=32221 - _MAINSTACKTRACE._serialized_start=32223 - _MAINSTACKTRACE._serialized_end=32260 - _MAINSTACKTRACEMSG._serialized_start=32262 - _MAINSTACKTRACEMSG._serialized_end=32362 - _SYSTEMCOULDNOTWRITE._serialized_start=32364 - _SYSTEMCOULDNOTWRITE._serialized_end=32428 - _SYSTEMCOULDNOTWRITEMSG._serialized_start=32430 - _SYSTEMCOULDNOTWRITEMSG._serialized_end=32540 - _SYSTEMEXECUTINGCMD._serialized_start=32542 - _SYSTEMEXECUTINGCMD._serialized_end=32575 - _SYSTEMEXECUTINGCMDMSG._serialized_start=32577 - _SYSTEMEXECUTINGCMDMSG._serialized_end=32685 - _SYSTEMSTDOUT._serialized_start=32687 - _SYSTEMSTDOUT._serialized_end=32715 - _SYSTEMSTDOUTMSG._serialized_start=32717 - _SYSTEMSTDOUTMSG._serialized_end=32813 - _SYSTEMSTDERR._serialized_start=32815 - _SYSTEMSTDERR._serialized_end=32843 - _SYSTEMSTDERRMSG._serialized_start=32845 - _SYSTEMSTDERRMSG._serialized_end=32941 - _SYSTEMREPORTRETURNCODE._serialized_start=32943 - _SYSTEMREPORTRETURNCODE._serialized_end=32987 - _SYSTEMREPORTRETURNCODEMSG._serialized_start=32989 - _SYSTEMREPORTRETURNCODEMSG._serialized_end=33105 - _TIMINGINFOCOLLECTED._serialized_start=33107 - _TIMINGINFOCOLLECTED._serialized_end=33219 - _TIMINGINFOCOLLECTEDMSG._serialized_start=33221 - _TIMINGINFOCOLLECTEDMSG._serialized_end=33331 - _LOGDEBUGSTACKTRACE._serialized_start=33333 - _LOGDEBUGSTACKTRACE._serialized_end=33371 - _LOGDEBUGSTACKTRACEMSG._serialized_start=33373 - _LOGDEBUGSTACKTRACEMSG._serialized_end=33481 - _CHECKCLEANPATH._serialized_start=33483 - _CHECKCLEANPATH._serialized_end=33513 - _CHECKCLEANPATHMSG._serialized_start=33515 - _CHECKCLEANPATHMSG._serialized_end=33615 - _CONFIRMCLEANPATH._serialized_start=33617 - _CONFIRMCLEANPATH._serialized_end=33649 - _CONFIRMCLEANPATHMSG._serialized_start=33651 - _CONFIRMCLEANPATHMSG._serialized_end=33755 - _PROTECTEDCLEANPATH._serialized_start=33757 - _PROTECTEDCLEANPATH._serialized_end=33791 - _PROTECTEDCLEANPATHMSG._serialized_start=33793 - _PROTECTEDCLEANPATHMSG._serialized_end=33901 - _FINISHEDCLEANPATHS._serialized_start=33903 - _FINISHEDCLEANPATHS._serialized_end=33923 - _FINISHEDCLEANPATHSMSG._serialized_start=33925 - _FINISHEDCLEANPATHSMSG._serialized_end=34033 - _OPENCOMMAND._serialized_start=34035 - _OPENCOMMAND._serialized_end=34088 - _OPENCOMMANDMSG._serialized_start=34090 - _OPENCOMMANDMSG._serialized_end=34184 - _FORMATTING._serialized_start=34186 - _FORMATTING._serialized_end=34211 - _FORMATTINGMSG._serialized_start=34213 - _FORMATTINGMSG._serialized_end=34305 - _SERVINGDOCSPORT._serialized_start=34307 - _SERVINGDOCSPORT._serialized_end=34355 - _SERVINGDOCSPORTMSG._serialized_start=34357 - _SERVINGDOCSPORTMSG._serialized_end=34459 - _SERVINGDOCSACCESSINFO._serialized_start=34461 - _SERVINGDOCSACCESSINFO._serialized_end=34498 - _SERVINGDOCSACCESSINFOMSG._serialized_start=34500 - _SERVINGDOCSACCESSINFOMSG._serialized_end=34614 - _SERVINGDOCSEXITINFO._serialized_start=34616 - _SERVINGDOCSEXITINFO._serialized_end=34637 - _SERVINGDOCSEXITINFOMSG._serialized_start=34639 - _SERVINGDOCSEXITINFOMSG._serialized_end=34749 - _RUNRESULTWARNING._serialized_start=34751 - _RUNRESULTWARNING._serialized_end=34825 - _RUNRESULTWARNINGMSG._serialized_start=34827 - _RUNRESULTWARNINGMSG._serialized_end=34931 - _RUNRESULTFAILURE._serialized_start=34933 - _RUNRESULTFAILURE._serialized_end=35007 - _RUNRESULTFAILUREMSG._serialized_start=35009 - _RUNRESULTFAILUREMSG._serialized_end=35113 - _STATSLINE._serialized_start=35115 - _STATSLINE._serialized_end=35222 - _STATSLINE_STATSENTRY._serialized_start=35178 - _STATSLINE_STATSENTRY._serialized_end=35222 - _STATSLINEMSG._serialized_start=35224 - _STATSLINEMSG._serialized_end=35314 - _RUNRESULTERROR._serialized_start=35316 - _RUNRESULTERROR._serialized_end=35345 - _RUNRESULTERRORMSG._serialized_start=35347 - _RUNRESULTERRORMSG._serialized_end=35447 - _RUNRESULTERRORNOMESSAGE._serialized_start=35449 - _RUNRESULTERRORNOMESSAGE._serialized_end=35490 - _RUNRESULTERRORNOMESSAGEMSG._serialized_start=35492 - _RUNRESULTERRORNOMESSAGEMSG._serialized_end=35610 - _SQLCOMPILEDPATH._serialized_start=35612 - _SQLCOMPILEDPATH._serialized_end=35643 - _SQLCOMPILEDPATHMSG._serialized_start=35645 - _SQLCOMPILEDPATHMSG._serialized_end=35747 - _CHECKNODETESTFAILURE._serialized_start=35749 - _CHECKNODETESTFAILURE._serialized_end=35794 - _CHECKNODETESTFAILUREMSG._serialized_start=35796 - _CHECKNODETESTFAILUREMSG._serialized_end=35908 - _FIRSTRUNRESULTERROR._serialized_start=35910 - _FIRSTRUNRESULTERROR._serialized_end=35944 - _FIRSTRUNRESULTERRORMSG._serialized_start=35946 - _FIRSTRUNRESULTERRORMSG._serialized_end=36056 - _AFTERFIRSTRUNRESULTERROR._serialized_start=36058 - _AFTERFIRSTRUNRESULTERROR._serialized_end=36097 - _AFTERFIRSTRUNRESULTERRORMSG._serialized_start=36099 - _AFTERFIRSTRUNRESULTERRORMSG._serialized_end=36219 - _ENDOFRUNSUMMARY._serialized_start=36221 - _ENDOFRUNSUMMARY._serialized_end=36308 - _ENDOFRUNSUMMARYMSG._serialized_start=36310 - _ENDOFRUNSUMMARYMSG._serialized_end=36412 - _LOGSKIPBECAUSEERROR._serialized_start=36414 - _LOGSKIPBECAUSEERROR._serialized_end=36499 - _LOGSKIPBECAUSEERRORMSG._serialized_start=36501 - _LOGSKIPBECAUSEERRORMSG._serialized_end=36611 - _ENSUREGITINSTALLED._serialized_start=36613 - _ENSUREGITINSTALLED._serialized_end=36633 - _ENSUREGITINSTALLEDMSG._serialized_start=36635 - _ENSUREGITINSTALLEDMSG._serialized_end=36743 - _DEPSCREATINGLOCALSYMLINK._serialized_start=36745 - _DEPSCREATINGLOCALSYMLINK._serialized_end=36771 - _DEPSCREATINGLOCALSYMLINKMSG._serialized_start=36773 - _DEPSCREATINGLOCALSYMLINKMSG._serialized_end=36893 - _DEPSSYMLINKNOTAVAILABLE._serialized_start=36895 - _DEPSSYMLINKNOTAVAILABLE._serialized_end=36920 - _DEPSSYMLINKNOTAVAILABLEMSG._serialized_start=36922 - _DEPSSYMLINKNOTAVAILABLEMSG._serialized_end=37040 - _DISABLETRACKING._serialized_start=37042 - _DISABLETRACKING._serialized_end=37059 - _DISABLETRACKINGMSG._serialized_start=37061 - _DISABLETRACKINGMSG._serialized_end=37163 - _SENDINGEVENT._serialized_start=37165 - _SENDINGEVENT._serialized_end=37195 - _SENDINGEVENTMSG._serialized_start=37197 - _SENDINGEVENTMSG._serialized_end=37293 - _SENDEVENTFAILURE._serialized_start=37295 - _SENDEVENTFAILURE._serialized_end=37313 - _SENDEVENTFAILUREMSG._serialized_start=37315 - _SENDEVENTFAILUREMSG._serialized_end=37419 - _FLUSHEVENTS._serialized_start=37421 - _FLUSHEVENTS._serialized_end=37434 - _FLUSHEVENTSMSG._serialized_start=37436 - _FLUSHEVENTSMSG._serialized_end=37530 - _FLUSHEVENTSFAILURE._serialized_start=37532 - _FLUSHEVENTSFAILURE._serialized_end=37552 - _FLUSHEVENTSFAILUREMSG._serialized_start=37554 - _FLUSHEVENTSFAILUREMSG._serialized_end=37662 - _TRACKINGINITIALIZEFAILURE._serialized_start=37664 - _TRACKINGINITIALIZEFAILURE._serialized_end=37709 - _TRACKINGINITIALIZEFAILUREMSG._serialized_start=37711 - _TRACKINGINITIALIZEFAILUREMSG._serialized_end=37833 - _RUNRESULTWARNINGMESSAGE._serialized_start=37835 - _RUNRESULTWARNINGMESSAGE._serialized_end=37873 - _RUNRESULTWARNINGMESSAGEMSG._serialized_start=37875 - _RUNRESULTWARNINGMESSAGEMSG._serialized_end=37993 - _DEBUGCMDOUT._serialized_start=37995 - _DEBUGCMDOUT._serialized_end=38021 - _DEBUGCMDOUTMSG._serialized_start=38023 - _DEBUGCMDOUTMSG._serialized_end=38117 - _DEBUGCMDRESULT._serialized_start=38119 - _DEBUGCMDRESULT._serialized_end=38148 - _DEBUGCMDRESULTMSG._serialized_start=38150 - _DEBUGCMDRESULTMSG._serialized_end=38250 - _LISTCMDOUT._serialized_start=38252 - _LISTCMDOUT._serialized_end=38277 - _LISTCMDOUTMSG._serialized_start=38279 - _LISTCMDOUTMSG._serialized_end=38371 - _NOTE._serialized_start=38373 - _NOTE._serialized_end=38392 - _NOTEMSG._serialized_start=38394 - _NOTEMSG._serialized_end=38474 + _UNSUPPORTEDCONSTRAINTMATERIALIZATION._serialized_start=20055 + _UNSUPPORTEDCONSTRAINTMATERIALIZATION._serialized_end=20115 + _UNSUPPORTEDCONSTRAINTMATERIALIZATIONMSG._serialized_start=20118 + _UNSUPPORTEDCONSTRAINTMATERIALIZATIONMSG._serialized_end=20262 + _GITSPARSECHECKOUTSUBDIRECTORY._serialized_start=20264 + _GITSPARSECHECKOUTSUBDIRECTORY._serialized_end=20311 + _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_start=20314 + _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_end=20444 + _GITPROGRESSCHECKOUTREVISION._serialized_start=20446 + _GITPROGRESSCHECKOUTREVISION._serialized_end=20493 + _GITPROGRESSCHECKOUTREVISIONMSG._serialized_start=20495 + _GITPROGRESSCHECKOUTREVISIONMSG._serialized_end=20621 + _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_start=20623 + _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_end=20675 + _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_start=20678 + _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_end=20824 + _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_start=20826 + _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_end=20872 + _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_start=20875 + _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_end=21009 + _GITNOTHINGTODO._serialized_start=21011 + _GITNOTHINGTODO._serialized_end=21040 + _GITNOTHINGTODOMSG._serialized_start=21042 + _GITNOTHINGTODOMSG._serialized_end=21142 + _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_start=21144 + _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_end=21213 + _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_start=21216 + _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_end=21350 + _GITPROGRESSCHECKEDOUTAT._serialized_start=21352 + _GITPROGRESSCHECKEDOUTAT._serialized_end=21394 + _GITPROGRESSCHECKEDOUTATMSG._serialized_start=21396 + _GITPROGRESSCHECKEDOUTATMSG._serialized_end=21514 + _REGISTRYPROGRESSGETREQUEST._serialized_start=21516 + _REGISTRYPROGRESSGETREQUEST._serialized_end=21557 + _REGISTRYPROGRESSGETREQUESTMSG._serialized_start=21559 + _REGISTRYPROGRESSGETREQUESTMSG._serialized_end=21683 + _REGISTRYPROGRESSGETRESPONSE._serialized_start=21685 + _REGISTRYPROGRESSGETRESPONSE._serialized_end=21746 + _REGISTRYPROGRESSGETRESPONSEMSG._serialized_start=21748 + _REGISTRYPROGRESSGETRESPONSEMSG._serialized_end=21874 + _SELECTORREPORTINVALIDSELECTOR._serialized_start=21876 + _SELECTORREPORTINVALIDSELECTOR._serialized_end=21971 + _SELECTORREPORTINVALIDSELECTORMSG._serialized_start=21974 + _SELECTORREPORTINVALIDSELECTORMSG._serialized_end=22104 + _DEPSNOPACKAGESFOUND._serialized_start=22106 + _DEPSNOPACKAGESFOUND._serialized_end=22127 + _DEPSNOPACKAGESFOUNDMSG._serialized_start=22129 + _DEPSNOPACKAGESFOUNDMSG._serialized_end=22239 + _DEPSSTARTPACKAGEINSTALL._serialized_start=22241 + _DEPSSTARTPACKAGEINSTALL._serialized_end=22288 + _DEPSSTARTPACKAGEINSTALLMSG._serialized_start=22290 + _DEPSSTARTPACKAGEINSTALLMSG._serialized_end=22408 + _DEPSINSTALLINFO._serialized_start=22410 + _DEPSINSTALLINFO._serialized_end=22449 + _DEPSINSTALLINFOMSG._serialized_start=22451 + _DEPSINSTALLINFOMSG._serialized_end=22553 + _DEPSUPDATEAVAILABLE._serialized_start=22555 + _DEPSUPDATEAVAILABLE._serialized_end=22600 + _DEPSUPDATEAVAILABLEMSG._serialized_start=22602 + _DEPSUPDATEAVAILABLEMSG._serialized_end=22712 + _DEPSUPTODATE._serialized_start=22714 + _DEPSUPTODATE._serialized_end=22728 + _DEPSUPTODATEMSG._serialized_start=22730 + _DEPSUPTODATEMSG._serialized_end=22826 + _DEPSLISTSUBDIRECTORY._serialized_start=22828 + _DEPSLISTSUBDIRECTORY._serialized_end=22872 + _DEPSLISTSUBDIRECTORYMSG._serialized_start=22874 + _DEPSLISTSUBDIRECTORYMSG._serialized_end=22986 + _DEPSNOTIFYUPDATESAVAILABLE._serialized_start=22988 + _DEPSNOTIFYUPDATESAVAILABLE._serialized_end=23034 + _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_start=23036 + _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_end=23160 + _RETRYEXTERNALCALL._serialized_start=23162 + _RETRYEXTERNALCALL._serialized_end=23211 + _RETRYEXTERNALCALLMSG._serialized_start=23213 + _RETRYEXTERNALCALLMSG._serialized_end=23319 + _RECORDRETRYEXCEPTION._serialized_start=23321 + _RECORDRETRYEXCEPTION._serialized_end=23356 + _RECORDRETRYEXCEPTIONMSG._serialized_start=23358 + _RECORDRETRYEXCEPTIONMSG._serialized_end=23470 + _REGISTRYINDEXPROGRESSGETREQUEST._serialized_start=23472 + _REGISTRYINDEXPROGRESSGETREQUEST._serialized_end=23518 + _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_start=23521 + _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_end=23655 + _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_start=23657 + _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_end=23723 + _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_start=23726 + _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_end=23862 + _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_start=23864 + _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_end=23914 + _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_start=23917 + _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_end=24049 + _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_start=24051 + _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_end=24101 + _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_start=24104 + _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_end=24236 + _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_start=24238 + _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_end=24291 + _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_start=24294 + _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_end=24432 + _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_start=24434 + _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_end=24485 + _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_start=24488 + _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_end=24622 + _DEPSSETDOWNLOADDIRECTORY._serialized_start=24624 + _DEPSSETDOWNLOADDIRECTORY._serialized_end=24664 + _DEPSSETDOWNLOADDIRECTORYMSG._serialized_start=24666 + _DEPSSETDOWNLOADDIRECTORYMSG._serialized_end=24786 + _DEPSUNPINNED._serialized_start=24788 + _DEPSUNPINNED._serialized_end=24833 + _DEPSUNPINNEDMSG._serialized_start=24835 + _DEPSUNPINNEDMSG._serialized_end=24931 + _NONODESFORSELECTIONCRITERIA._serialized_start=24933 + _NONODESFORSELECTIONCRITERIA._serialized_end=24980 + _NONODESFORSELECTIONCRITERIAMSG._serialized_start=24982 + _NONODESFORSELECTIONCRITERIAMSG._serialized_end=25108 + _PUBLICATIONARTIFACTAVAILABLE._serialized_start=25110 + _PUBLICATIONARTIFACTAVAILABLE._serialized_end=25187 + _PUBLICATIONARTIFACTAVAILABLEMSG._serialized_start=25190 + _PUBLICATIONARTIFACTAVAILABLEMSG._serialized_end=25318 + _RUNNINGOPERATIONCAUGHTERROR._serialized_start=25320 + _RUNNINGOPERATIONCAUGHTERROR._serialized_end=25362 + _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_start=25364 + _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_end=25490 + _COMPILECOMPLETE._serialized_start=25492 + _COMPILECOMPLETE._serialized_end=25509 + _COMPILECOMPLETEMSG._serialized_start=25511 + _COMPILECOMPLETEMSG._serialized_end=25613 + _FRESHNESSCHECKCOMPLETE._serialized_start=25615 + _FRESHNESSCHECKCOMPLETE._serialized_end=25639 + _FRESHNESSCHECKCOMPLETEMSG._serialized_start=25641 + _FRESHNESSCHECKCOMPLETEMSG._serialized_end=25757 + _SEEDHEADER._serialized_start=25759 + _SEEDHEADER._serialized_end=25787 + _SEEDHEADERMSG._serialized_start=25789 + _SEEDHEADERMSG._serialized_end=25881 + _SQLRUNNEREXCEPTION._serialized_start=25883 + _SQLRUNNEREXCEPTION._serialized_end=25934 + _SQLRUNNEREXCEPTIONMSG._serialized_start=25936 + _SQLRUNNEREXCEPTIONMSG._serialized_end=26044 + _LOGTESTRESULT._serialized_start=26047 + _LOGTESTRESULT._serialized_end=26215 + _LOGTESTRESULTMSG._serialized_start=26217 + _LOGTESTRESULTMSG._serialized_end=26315 + _LOGSTARTLINE._serialized_start=26317 + _LOGSTARTLINE._serialized_end=26424 + _LOGSTARTLINEMSG._serialized_start=26426 + _LOGSTARTLINEMSG._serialized_end=26522 + _LOGMODELRESULT._serialized_start=26525 + _LOGMODELRESULT._serialized_end=26674 + _LOGMODELRESULTMSG._serialized_start=26676 + _LOGMODELRESULTMSG._serialized_end=26776 + _LOGSNAPSHOTRESULT._serialized_start=26779 + _LOGSNAPSHOTRESULT._serialized_end=27029 + _LOGSNAPSHOTRESULT_CFGENTRY._serialized_start=26987 + _LOGSNAPSHOTRESULT_CFGENTRY._serialized_end=27029 + _LOGSNAPSHOTRESULTMSG._serialized_start=27031 + _LOGSNAPSHOTRESULTMSG._serialized_end=27137 + _LOGSEEDRESULT._serialized_start=27140 + _LOGSEEDRESULT._serialized_end=27325 + _LOGSEEDRESULTMSG._serialized_start=27327 + _LOGSEEDRESULTMSG._serialized_end=27425 + _LOGFRESHNESSRESULT._serialized_start=27428 + _LOGFRESHNESSRESULT._serialized_end=27601 + _LOGFRESHNESSRESULTMSG._serialized_start=27603 + _LOGFRESHNESSRESULTMSG._serialized_end=27711 + _LOGCANCELLINE._serialized_start=27713 + _LOGCANCELLINE._serialized_end=27747 + _LOGCANCELLINEMSG._serialized_start=27749 + _LOGCANCELLINEMSG._serialized_end=27847 + _DEFAULTSELECTOR._serialized_start=27849 + _DEFAULTSELECTOR._serialized_end=27880 + _DEFAULTSELECTORMSG._serialized_start=27882 + _DEFAULTSELECTORMSG._serialized_end=27984 + _NODESTART._serialized_start=27986 + _NODESTART._serialized_end=28039 + _NODESTARTMSG._serialized_start=28041 + _NODESTARTMSG._serialized_end=28131 + _NODEFINISHED._serialized_start=28133 + _NODEFINISHED._serialized_end=28236 + _NODEFINISHEDMSG._serialized_start=28238 + _NODEFINISHEDMSG._serialized_end=28334 + _QUERYCANCELATIONUNSUPPORTED._serialized_start=28336 + _QUERYCANCELATIONUNSUPPORTED._serialized_end=28379 + _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_start=28381 + _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_end=28507 + _CONCURRENCYLINE._serialized_start=28509 + _CONCURRENCYLINE._serialized_end=28588 + _CONCURRENCYLINEMSG._serialized_start=28590 + _CONCURRENCYLINEMSG._serialized_end=28692 + _WRITINGINJECTEDSQLFORNODE._serialized_start=28694 + _WRITINGINJECTEDSQLFORNODE._serialized_end=28763 + _WRITINGINJECTEDSQLFORNODEMSG._serialized_start=28765 + _WRITINGINJECTEDSQLFORNODEMSG._serialized_end=28887 + _NODECOMPILING._serialized_start=28889 + _NODECOMPILING._serialized_end=28946 + _NODECOMPILINGMSG._serialized_start=28948 + _NODECOMPILINGMSG._serialized_end=29046 + _NODEEXECUTING._serialized_start=29048 + _NODEEXECUTING._serialized_end=29105 + _NODEEXECUTINGMSG._serialized_start=29107 + _NODEEXECUTINGMSG._serialized_end=29205 + _LOGHOOKSTARTLINE._serialized_start=29207 + _LOGHOOKSTARTLINE._serialized_end=29316 + _LOGHOOKSTARTLINEMSG._serialized_start=29318 + _LOGHOOKSTARTLINEMSG._serialized_end=29422 + _LOGHOOKENDLINE._serialized_start=29425 + _LOGHOOKENDLINE._serialized_end=29572 + _LOGHOOKENDLINEMSG._serialized_start=29574 + _LOGHOOKENDLINEMSG._serialized_end=29674 + _SKIPPINGDETAILS._serialized_start=29677 + _SKIPPINGDETAILS._serialized_end=29824 + _SKIPPINGDETAILSMSG._serialized_start=29826 + _SKIPPINGDETAILSMSG._serialized_end=29928 + _NOTHINGTODO._serialized_start=29930 + _NOTHINGTODO._serialized_end=29943 + _NOTHINGTODOMSG._serialized_start=29945 + _NOTHINGTODOMSG._serialized_end=30039 + _RUNNINGOPERATIONUNCAUGHTERROR._serialized_start=30041 + _RUNNINGOPERATIONUNCAUGHTERROR._serialized_end=30085 + _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_start=30088 + _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_end=30218 + _ENDRUNRESULT._serialized_start=30221 + _ENDRUNRESULT._serialized_end=30368 + _ENDRUNRESULTMSG._serialized_start=30370 + _ENDRUNRESULTMSG._serialized_end=30466 + _NONODESSELECTED._serialized_start=30468 + _NONODESSELECTED._serialized_end=30485 + _NONODESSELECTEDMSG._serialized_start=30487 + _NONODESSELECTEDMSG._serialized_end=30589 + _COMMANDCOMPLETED._serialized_start=30591 + _COMMANDCOMPLETED._serialized_end=30710 + _COMMANDCOMPLETEDMSG._serialized_start=30712 + _COMMANDCOMPLETEDMSG._serialized_end=30816 + _SHOWNODE._serialized_start=30818 + _SHOWNODE._serialized_end=30925 + _SHOWNODEMSG._serialized_start=30927 + _SHOWNODEMSG._serialized_end=31015 + _COMPILEDNODE._serialized_start=31017 + _COMPILEDNODE._serialized_end=31129 + _COMPILEDNODEMSG._serialized_start=31131 + _COMPILEDNODEMSG._serialized_end=31227 + _CATCHABLEEXCEPTIONONRUN._serialized_start=31229 + _CATCHABLEEXCEPTIONONRUN._serialized_end=31327 + _CATCHABLEEXCEPTIONONRUNMSG._serialized_start=31329 + _CATCHABLEEXCEPTIONONRUNMSG._serialized_end=31447 + _INTERNALERRORONRUN._serialized_start=31449 + _INTERNALERRORONRUN._serialized_end=31502 + _INTERNALERRORONRUNMSG._serialized_start=31504 + _INTERNALERRORONRUNMSG._serialized_end=31612 + _GENERICEXCEPTIONONRUN._serialized_start=31614 + _GENERICEXCEPTIONONRUN._serialized_end=31689 + _GENERICEXCEPTIONONRUNMSG._serialized_start=31691 + _GENERICEXCEPTIONONRUNMSG._serialized_end=31805 + _NODECONNECTIONRELEASEERROR._serialized_start=31807 + _NODECONNECTIONRELEASEERROR._serialized_end=31885 + _NODECONNECTIONRELEASEERRORMSG._serialized_start=31887 + _NODECONNECTIONRELEASEERRORMSG._serialized_end=32011 + _FOUNDSTATS._serialized_start=32013 + _FOUNDSTATS._serialized_end=32044 + _FOUNDSTATSMSG._serialized_start=32046 + _FOUNDSTATSMSG._serialized_end=32138 + _MAINKEYBOARDINTERRUPT._serialized_start=32140 + _MAINKEYBOARDINTERRUPT._serialized_end=32163 + _MAINKEYBOARDINTERRUPTMSG._serialized_start=32165 + _MAINKEYBOARDINTERRUPTMSG._serialized_end=32279 + _MAINENCOUNTEREDERROR._serialized_start=32281 + _MAINENCOUNTEREDERROR._serialized_end=32316 + _MAINENCOUNTEREDERRORMSG._serialized_start=32318 + _MAINENCOUNTEREDERRORMSG._serialized_end=32430 + _MAINSTACKTRACE._serialized_start=32432 + _MAINSTACKTRACE._serialized_end=32469 + _MAINSTACKTRACEMSG._serialized_start=32471 + _MAINSTACKTRACEMSG._serialized_end=32571 + _SYSTEMCOULDNOTWRITE._serialized_start=32573 + _SYSTEMCOULDNOTWRITE._serialized_end=32637 + _SYSTEMCOULDNOTWRITEMSG._serialized_start=32639 + _SYSTEMCOULDNOTWRITEMSG._serialized_end=32749 + _SYSTEMEXECUTINGCMD._serialized_start=32751 + _SYSTEMEXECUTINGCMD._serialized_end=32784 + _SYSTEMEXECUTINGCMDMSG._serialized_start=32786 + _SYSTEMEXECUTINGCMDMSG._serialized_end=32894 + _SYSTEMSTDOUT._serialized_start=32896 + _SYSTEMSTDOUT._serialized_end=32924 + _SYSTEMSTDOUTMSG._serialized_start=32926 + _SYSTEMSTDOUTMSG._serialized_end=33022 + _SYSTEMSTDERR._serialized_start=33024 + _SYSTEMSTDERR._serialized_end=33052 + _SYSTEMSTDERRMSG._serialized_start=33054 + _SYSTEMSTDERRMSG._serialized_end=33150 + _SYSTEMREPORTRETURNCODE._serialized_start=33152 + _SYSTEMREPORTRETURNCODE._serialized_end=33196 + _SYSTEMREPORTRETURNCODEMSG._serialized_start=33198 + _SYSTEMREPORTRETURNCODEMSG._serialized_end=33314 + _TIMINGINFOCOLLECTED._serialized_start=33316 + _TIMINGINFOCOLLECTED._serialized_end=33428 + _TIMINGINFOCOLLECTEDMSG._serialized_start=33430 + _TIMINGINFOCOLLECTEDMSG._serialized_end=33540 + _LOGDEBUGSTACKTRACE._serialized_start=33542 + _LOGDEBUGSTACKTRACE._serialized_end=33580 + _LOGDEBUGSTACKTRACEMSG._serialized_start=33582 + _LOGDEBUGSTACKTRACEMSG._serialized_end=33690 + _CHECKCLEANPATH._serialized_start=33692 + _CHECKCLEANPATH._serialized_end=33722 + _CHECKCLEANPATHMSG._serialized_start=33724 + _CHECKCLEANPATHMSG._serialized_end=33824 + _CONFIRMCLEANPATH._serialized_start=33826 + _CONFIRMCLEANPATH._serialized_end=33858 + _CONFIRMCLEANPATHMSG._serialized_start=33860 + _CONFIRMCLEANPATHMSG._serialized_end=33964 + _PROTECTEDCLEANPATH._serialized_start=33966 + _PROTECTEDCLEANPATH._serialized_end=34000 + _PROTECTEDCLEANPATHMSG._serialized_start=34002 + _PROTECTEDCLEANPATHMSG._serialized_end=34110 + _FINISHEDCLEANPATHS._serialized_start=34112 + _FINISHEDCLEANPATHS._serialized_end=34132 + _FINISHEDCLEANPATHSMSG._serialized_start=34134 + _FINISHEDCLEANPATHSMSG._serialized_end=34242 + _OPENCOMMAND._serialized_start=34244 + _OPENCOMMAND._serialized_end=34297 + _OPENCOMMANDMSG._serialized_start=34299 + _OPENCOMMANDMSG._serialized_end=34393 + _FORMATTING._serialized_start=34395 + _FORMATTING._serialized_end=34420 + _FORMATTINGMSG._serialized_start=34422 + _FORMATTINGMSG._serialized_end=34514 + _SERVINGDOCSPORT._serialized_start=34516 + _SERVINGDOCSPORT._serialized_end=34564 + _SERVINGDOCSPORTMSG._serialized_start=34566 + _SERVINGDOCSPORTMSG._serialized_end=34668 + _SERVINGDOCSACCESSINFO._serialized_start=34670 + _SERVINGDOCSACCESSINFO._serialized_end=34707 + _SERVINGDOCSACCESSINFOMSG._serialized_start=34709 + _SERVINGDOCSACCESSINFOMSG._serialized_end=34823 + _SERVINGDOCSEXITINFO._serialized_start=34825 + _SERVINGDOCSEXITINFO._serialized_end=34846 + _SERVINGDOCSEXITINFOMSG._serialized_start=34848 + _SERVINGDOCSEXITINFOMSG._serialized_end=34958 + _RUNRESULTWARNING._serialized_start=34960 + _RUNRESULTWARNING._serialized_end=35034 + _RUNRESULTWARNINGMSG._serialized_start=35036 + _RUNRESULTWARNINGMSG._serialized_end=35140 + _RUNRESULTFAILURE._serialized_start=35142 + _RUNRESULTFAILURE._serialized_end=35216 + _RUNRESULTFAILUREMSG._serialized_start=35218 + _RUNRESULTFAILUREMSG._serialized_end=35322 + _STATSLINE._serialized_start=35324 + _STATSLINE._serialized_end=35431 + _STATSLINE_STATSENTRY._serialized_start=35387 + _STATSLINE_STATSENTRY._serialized_end=35431 + _STATSLINEMSG._serialized_start=35433 + _STATSLINEMSG._serialized_end=35523 + _RUNRESULTERROR._serialized_start=35525 + _RUNRESULTERROR._serialized_end=35554 + _RUNRESULTERRORMSG._serialized_start=35556 + _RUNRESULTERRORMSG._serialized_end=35656 + _RUNRESULTERRORNOMESSAGE._serialized_start=35658 + _RUNRESULTERRORNOMESSAGE._serialized_end=35699 + _RUNRESULTERRORNOMESSAGEMSG._serialized_start=35701 + _RUNRESULTERRORNOMESSAGEMSG._serialized_end=35819 + _SQLCOMPILEDPATH._serialized_start=35821 + _SQLCOMPILEDPATH._serialized_end=35852 + _SQLCOMPILEDPATHMSG._serialized_start=35854 + _SQLCOMPILEDPATHMSG._serialized_end=35956 + _CHECKNODETESTFAILURE._serialized_start=35958 + _CHECKNODETESTFAILURE._serialized_end=36003 + _CHECKNODETESTFAILUREMSG._serialized_start=36005 + _CHECKNODETESTFAILUREMSG._serialized_end=36117 + _FIRSTRUNRESULTERROR._serialized_start=36119 + _FIRSTRUNRESULTERROR._serialized_end=36153 + _FIRSTRUNRESULTERRORMSG._serialized_start=36155 + _FIRSTRUNRESULTERRORMSG._serialized_end=36265 + _AFTERFIRSTRUNRESULTERROR._serialized_start=36267 + _AFTERFIRSTRUNRESULTERROR._serialized_end=36306 + _AFTERFIRSTRUNRESULTERRORMSG._serialized_start=36308 + _AFTERFIRSTRUNRESULTERRORMSG._serialized_end=36428 + _ENDOFRUNSUMMARY._serialized_start=36430 + _ENDOFRUNSUMMARY._serialized_end=36517 + _ENDOFRUNSUMMARYMSG._serialized_start=36519 + _ENDOFRUNSUMMARYMSG._serialized_end=36621 + _LOGSKIPBECAUSEERROR._serialized_start=36623 + _LOGSKIPBECAUSEERROR._serialized_end=36708 + _LOGSKIPBECAUSEERRORMSG._serialized_start=36710 + _LOGSKIPBECAUSEERRORMSG._serialized_end=36820 + _ENSUREGITINSTALLED._serialized_start=36822 + _ENSUREGITINSTALLED._serialized_end=36842 + _ENSUREGITINSTALLEDMSG._serialized_start=36844 + _ENSUREGITINSTALLEDMSG._serialized_end=36952 + _DEPSCREATINGLOCALSYMLINK._serialized_start=36954 + _DEPSCREATINGLOCALSYMLINK._serialized_end=36980 + _DEPSCREATINGLOCALSYMLINKMSG._serialized_start=36982 + _DEPSCREATINGLOCALSYMLINKMSG._serialized_end=37102 + _DEPSSYMLINKNOTAVAILABLE._serialized_start=37104 + _DEPSSYMLINKNOTAVAILABLE._serialized_end=37129 + _DEPSSYMLINKNOTAVAILABLEMSG._serialized_start=37131 + _DEPSSYMLINKNOTAVAILABLEMSG._serialized_end=37249 + _DISABLETRACKING._serialized_start=37251 + _DISABLETRACKING._serialized_end=37268 + _DISABLETRACKINGMSG._serialized_start=37270 + _DISABLETRACKINGMSG._serialized_end=37372 + _SENDINGEVENT._serialized_start=37374 + _SENDINGEVENT._serialized_end=37404 + _SENDINGEVENTMSG._serialized_start=37406 + _SENDINGEVENTMSG._serialized_end=37502 + _SENDEVENTFAILURE._serialized_start=37504 + _SENDEVENTFAILURE._serialized_end=37522 + _SENDEVENTFAILUREMSG._serialized_start=37524 + _SENDEVENTFAILUREMSG._serialized_end=37628 + _FLUSHEVENTS._serialized_start=37630 + _FLUSHEVENTS._serialized_end=37643 + _FLUSHEVENTSMSG._serialized_start=37645 + _FLUSHEVENTSMSG._serialized_end=37739 + _FLUSHEVENTSFAILURE._serialized_start=37741 + _FLUSHEVENTSFAILURE._serialized_end=37761 + _FLUSHEVENTSFAILUREMSG._serialized_start=37763 + _FLUSHEVENTSFAILUREMSG._serialized_end=37871 + _TRACKINGINITIALIZEFAILURE._serialized_start=37873 + _TRACKINGINITIALIZEFAILURE._serialized_end=37918 + _TRACKINGINITIALIZEFAILUREMSG._serialized_start=37920 + _TRACKINGINITIALIZEFAILUREMSG._serialized_end=38042 + _RUNRESULTWARNINGMESSAGE._serialized_start=38044 + _RUNRESULTWARNINGMESSAGE._serialized_end=38082 + _RUNRESULTWARNINGMESSAGEMSG._serialized_start=38084 + _RUNRESULTWARNINGMESSAGEMSG._serialized_end=38202 + _DEBUGCMDOUT._serialized_start=38204 + _DEBUGCMDOUT._serialized_end=38230 + _DEBUGCMDOUTMSG._serialized_start=38232 + _DEBUGCMDOUTMSG._serialized_end=38326 + _DEBUGCMDRESULT._serialized_start=38328 + _DEBUGCMDRESULT._serialized_end=38357 + _DEBUGCMDRESULTMSG._serialized_start=38359 + _DEBUGCMDRESULTMSG._serialized_end=38459 + _LISTCMDOUT._serialized_start=38461 + _LISTCMDOUT._serialized_end=38486 + _LISTCMDOUTMSG._serialized_start=38488 + _LISTCMDOUTMSG._serialized_end=38580 + _NOTE._serialized_start=38582 + _NOTE._serialized_end=38601 + _NOTEMSG._serialized_start=38603 + _NOTEMSG._serialized_end=38683 # @@protoc_insertion_point(module_scope) diff --git a/core/dbt/parser/schemas.py b/core/dbt/parser/schemas.py index ba83212101f..da2cf22b4f8 100644 --- a/core/dbt/parser/schemas.py +++ b/core/dbt/parser/schemas.py @@ -46,10 +46,11 @@ ) from dbt.events.functions import warn_or_error from dbt.events.types import ( - WrongResourceSchemaFile, - NoNodeForYamlKey, MacroNotFoundForPatch, + NoNodeForYamlKey, ValidationWarning, + UnsupportedConstraintMaterialization, + WrongResourceSchemaFile, ) from dbt.node_types import NodeType, AccessType from dbt.parser.base import SimpleParser @@ -817,23 +818,36 @@ def patch_constraints(self, node, constraints): node.constraints = [ModelLevelConstraint.from_dict(c) for c in constraints] def _validate_constraint_prerequisites(self, model_node: ModelNode): + + column_warn_unsupported = [ + constraint.warn_unsupported + for column in model_node.columns.values() + for constraint in column.constraints + ] + model_warn_unsupported = [ + constraint.warn_unsupported for constraint in model_node.constraints + ] + warn_unsupported = column_warn_unsupported + model_warn_unsupported + + # if any constraint has `warn_unsupported` as True then send the warning + if any(warn_unsupported) and not model_node.materialization_enforces_constraints: + warn_or_error( + UnsupportedConstraintMaterialization(materialized=model_node.config.materialized), + node=model_node, + ) + errors = [] if not model_node.columns: errors.append( "Constraints must be defined in a `yml` schema configuration file like `schema.yml`." ) - if model_node.config.materialized not in ["table", "view", "incremental"]: - errors.append( - f"Only table, view, and incremental materializations are supported for constraints, but found '{model_node.config.materialized}'" - ) - if str(model_node.language) != "sql": errors.append(f"Language Error: Expected 'sql' but found '{model_node.language}'") if errors: raise ParsingError( - f"Constraint validation failed for: ({model_node.original_file_path})\n" + f"Contract enforcement failed for: ({model_node.original_file_path})\n" + "\n".join(errors) ) diff --git a/tests/functional/configs/test_contract_configs.py b/tests/functional/configs/test_contract_configs.py index d72b2b5bd60..ae909e6e4bb 100644 --- a/tests/functional/configs/test_contract_configs.py +++ b/tests/functional/configs/test_contract_configs.py @@ -1,6 +1,7 @@ import pytest +import os from dbt.exceptions import ParsingError, ValidationError -from dbt.tests.util import run_dbt, get_manifest, get_artifact, run_dbt_and_capture +from dbt.tests.util import run_dbt, get_manifest, get_artifact, run_dbt_and_capture, write_file my_model_sql = """ {{ @@ -56,10 +57,10 @@ cast('2019-01-01' as date) as date_day """ -my_ephemeral_model_sql = """ +my_view_model_sql = """ {{ config( - materialized = "ephemeral" + materialized = "view" ) }} @@ -108,6 +109,34 @@ def model(dbt, _): data_type: date """ +model_schema_ignore_unsupported_yml = """ +version: 2 +models: + - name: my_model + config: + contract: + enforced: true + columns: + - name: id + quote: true + data_type: integer + description: hello + constraints: + - type: not_null + warn_unsupported: False + - type: primary_key + warn_unsupported: False + - type: check + warn_unsupported: False + expression: (id > 0) + tests: + - unique + - name: color + data_type: text + - name: date_day + data_type: date +""" + model_schema_errors_yml = """ version: 2 models: @@ -367,8 +396,8 @@ class TestModelLevelConstraintsErrorMessages: @pytest.fixture(scope="class") def models(self): return { - "my_model.sql": my_ephemeral_model_sql, - "constraints_schema.yml": model_schema_errors_yml, + "my_model.py": my_model_python_error, + "constraints_schema.yml": model_schema_yml, } def test__config_errors(self, project): @@ -376,13 +405,40 @@ def test__config_errors(self, project): run_dbt(["run"], expect_pass=False) exc_str = " ".join(str(err_info.value).split()) - expected_materialization_error = "Only table, view, and incremental materializations are supported for constraints, but found 'ephemeral'" + expected_materialization_error = "Language Error: Expected 'sql' but found 'python'" assert expected_materialization_error in str(exc_str) # This is a compile time error and we won't get here because the materialization check is parse time expected_empty_data_type_error = "Columns with `data_type` Blank/Null not allowed on contracted models. Columns Blank/Null: ['date_day']" assert expected_empty_data_type_error not in str(exc_str) +class TestModelLevelConstraintsWarningMessages: + @pytest.fixture(scope="class") + def models(self): + return { + "my_model.sql": my_view_model_sql, + "constraints_schema.yml": model_schema_yml, + } + + def test__config_warning(self, project): + _, log_output = run_dbt_and_capture(["run"]) + + expected_materialization_warning = ( + "Constraint types are not supported for view materializations" + ) + assert expected_materialization_warning in str(log_output) + + # change to not show warnings, message should not be in logs + models_dir = os.path.join(project.project_root, "models") + write_file(model_schema_ignore_unsupported_yml, models_dir, "constraints_schema.yml") + _, log_output = run_dbt_and_capture(["run"]) + + expected_materialization_warning = ( + "Constraint types are not supported for view materializations" + ) + assert expected_materialization_warning not in str(log_output) + + class TestSchemaContractEnabledConfigs: @pytest.fixture(scope="class") def models(self): diff --git a/tests/unit/test_events.py b/tests/unit/test_events.py index 54fefe7d471..3e65fbc793c 100644 --- a/tests/unit/test_events.py +++ b/tests/unit/test_events.py @@ -248,6 +248,7 @@ def test_event_codes(self): ref_model_deprecation_date="", ref_model_latest_version="", ), + types.UnsupportedConstraintMaterialization(materialized=""), # M - Deps generation ====================== types.GitSparseCheckoutSubdirectory(subdir=""), types.GitProgressCheckoutRevision(revision=""), From 6a22ec1b2e0163f9c84631d6b0db2b0ade660a91 Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Tue, 6 Jun 2023 12:05:44 -0700 Subject: [PATCH 45/67] Package-namespaced generate_x_name macro resolution (#7509) --- .../unreleased/Features-20230509-212935.yaml | 7 ++++ core/dbt/contracts/graph/manifest.py | 20 ++++++++--- core/dbt/parser/base.py | 34 +++++++++++++++--- test/unit/test_manifest.py | 35 +++++++++++-------- .../macros/generate_schema_name.sql | 12 +++---- .../local_dependency/models/schema.yml | 1 + .../dependencies/test_local_dependency.py | 12 +++++-- 7 files changed, 87 insertions(+), 34 deletions(-) create mode 100644 .changes/unreleased/Features-20230509-212935.yaml diff --git a/.changes/unreleased/Features-20230509-212935.yaml b/.changes/unreleased/Features-20230509-212935.yaml new file mode 100644 index 00000000000..e842214e26d --- /dev/null +++ b/.changes/unreleased/Features-20230509-212935.yaml @@ -0,0 +1,7 @@ +kind: Features +body: nodes in packages respect custom generate_alias_name, generate_schema_name, + generate_database_name macro overrides defined in packages +time: 2023-05-09T21:29:35.557761-04:00 +custom: + Author: michelleark + Issue: "7444" diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index 5edc3f44db7..dec20573dfb 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -608,26 +608,36 @@ def filter(candidate: MacroCandidate) -> bool: return candidates.last() def find_generate_macro_by_name( - self, component: str, root_project_name: str + self, component: str, root_project_name: str, imported_package: Optional[str] = None ) -> Optional[Macro]: """ - The `generate_X_name` macros are similar to regular ones, but ignore - imported packages. + The default `generate_X_name` macros are similar to regular ones, but only + includes imported packages when searching for a package. + - if package is not provided: - if there is a `generate_{component}_name` macro in the root project, return it - return the `generate_{component}_name` macro from the 'dbt' internal project + - if package is provided + - return the `generate_{component}_name` macro from the imported + package, if one exists """ def filter(candidate: MacroCandidate) -> bool: - return candidate.locality != Locality.Imported + if imported_package: + return ( + candidate.locality == Locality.Imported + and imported_package == candidate.macro.package_name + ) + else: + return candidate.locality != Locality.Imported candidates: CandidateList = self._find_macros_by_name( name=f"generate_{component}_name", root_project_name=root_project_name, - # filter out imported packages filter=filter, ) + return candidates.last() def _find_macros_by_name( diff --git a/core/dbt/parser/base.py b/core/dbt/parser/base.py index ee9c45e5dc7..2e8a4663a3e 100644 --- a/core/dbt/parser/base.py +++ b/core/dbt/parser/base.py @@ -71,20 +71,44 @@ def __init__( class RelationUpdate: def __init__(self, config: RuntimeConfig, manifest: Manifest, component: str) -> None: - macro = manifest.find_generate_macro_by_name( + default_macro = manifest.find_generate_macro_by_name( component=component, root_project_name=config.project_name, ) - if macro is None: + if default_macro is None: raise DbtInternalError(f"No macro with name generate_{component}_name found") - root_context = generate_generate_name_macro_context(macro, config, manifest) - self.updater = MacroGenerator(macro, root_context) + default_macro_context = generate_generate_name_macro_context( + default_macro, config, manifest + ) + self.default_updater = MacroGenerator(default_macro, default_macro_context) + + package_names = config.dependencies.keys() if config.dependencies else {} + package_updaters = {} + for package_name in package_names: + package_macro = manifest.find_generate_macro_by_name( + component=component, + root_project_name=config.project_name, + imported_package=package_name, + ) + if package_macro: + imported_macro_context = generate_generate_name_macro_context( + package_macro, config, manifest + ) + package_updaters[package_macro.package_name] = MacroGenerator( + package_macro, imported_macro_context + ) + + self.package_updaters = package_updaters self.component = component def __call__(self, parsed_node: Any, config_dict: Dict[str, Any]) -> None: override = config_dict.get(self.component) - new_value = self.updater(override, parsed_node) + if parsed_node.package_name in self.package_updaters: + new_value = self.package_updaters[parsed_node.package_name](override, parsed_node) + else: + new_value = self.default_updater(override, parsed_node) + if isinstance(new_value, str): new_value = new_value.strip() setattr(parsed_node, self.component, new_value) diff --git a/test/unit/test_manifest.py b/test/unit/test_manifest.py index 3138dba2e85..dcf5342b20a 100644 --- a/test/unit/test_manifest.py +++ b/test/unit/test_manifest.py @@ -1108,61 +1108,66 @@ def test_find_macro_by_name(macros, expectations): assert result.package_name == expected -# these don't use a search package, so we don't need to do as much generate_name_parameter_sets = [ # empty FindMacroSpec( macros=[], - expected=None, + expected={None: None, "root": None, "dep": None, "dbt": None}, ), # just root FindMacroSpec( macros=[MockGenerateMacro("root")], - expected="root", + # "root" is not imported + expected={None: "root", "root": None, "dep": None, "dbt": None}, ), # just dep FindMacroSpec( macros=[MockGenerateMacro("dep")], - expected=None, + expected={None: None, "root": None, "dep": "dep", "dbt": None}, ), # just dbt FindMacroSpec( macros=[MockGenerateMacro("dbt")], - expected="dbt", + # "dbt" is not imported + expected={None: "dbt", "root": None, "dep": None, "dbt": None}, ), # root overrides dep FindMacroSpec( macros=[MockGenerateMacro("root"), MockGenerateMacro("dep")], - expected="root", + expected={None: "root", "root": None, "dep": "dep", "dbt": None}, ), # root overrides core FindMacroSpec( macros=[MockGenerateMacro("root"), MockGenerateMacro("dbt")], - expected="root", + expected={None: "root", "root": None, "dep": None, "dbt": None}, ), # dep overrides core FindMacroSpec( macros=[MockGenerateMacro("dep"), MockGenerateMacro("dbt")], - expected="dbt", + expected={None: "dbt", "root": None, "dep": "dep", "dbt": None}, ), # root overrides dep overrides core FindMacroSpec( macros=[MockGenerateMacro("root"), MockGenerateMacro("dep"), MockGenerateMacro("dbt")], - expected="root", + expected={None: "root", "root": None, "dep": "dep", "dbt": None}, ), ] -@pytest.mark.parametrize("macros,expected", generate_name_parameter_sets, ids=id_macro) -def test_find_generate_macro_by_name(macros, expected): +@pytest.mark.parametrize("macros,expectations", generate_name_parameter_sets, ids=id_macro) +def test_find_generate_macros_by_name(macros, expectations): manifest = make_manifest(macros=macros) result = manifest.find_generate_macro_by_name( component="some_component", root_project_name="root" ) - if expected is None: - assert result is expected - else: - assert result.package_name == expected + for package, expected in expectations.items(): + result = manifest.find_generate_macro_by_name( + component="some_component", root_project_name="root", imported_package=package + ) + if expected is None: + assert result is expected + else: + assert result.package_name == expected FindMaterializationSpec = namedtuple("FindMaterializationSpec", "macros,adapter_type,expected") diff --git a/tests/functional/dependencies/local_dependency/macros/generate_schema_name.sql b/tests/functional/dependencies/local_dependency/macros/generate_schema_name.sql index 127ba8c5575..1e8d62a6bea 100644 --- a/tests/functional/dependencies/local_dependency/macros/generate_schema_name.sql +++ b/tests/functional/dependencies/local_dependency/macros/generate_schema_name.sql @@ -1,15 +1,15 @@ -{# This should be ignored as it's in a subpackage #} +{# This should not be ignored, even as it's in a subpackage #} {% macro generate_schema_name(custom_schema_name=none, node=none) -%} - {{ exceptions.raise_compiler_error('invalid', node=node) }} + {{ var('schema_override', target.schema) }} {%- endmacro %} -{# This should be ignored as it's in a subpackage #} +{# This should not be ignored, even as it's in a subpackage #} {% macro generate_database_name(custom_database_name=none, node=none) -%} - {{ exceptions.raise_compiler_error('invalid', node=node) }} + {{ 'dbt' }} {%- endmacro %} -{# This should be ignored as it's in a subpackage #} +{# This should not be ignored, even as it's in a subpackage #} {% macro generate_alias_name(custom_alias_name=none, node=none) -%} - {{ exceptions.raise_compiler_error('invalid', node=node) }} + {{ node.name ~ '_subpackage_generate_alias_name' }} {%- endmacro %} diff --git a/tests/functional/dependencies/local_dependency/models/schema.yml b/tests/functional/dependencies/local_dependency/models/schema.yml index 32655f6067e..4b3278eda3c 100644 --- a/tests/functional/dependencies/local_dependency/models/schema.yml +++ b/tests/functional/dependencies/local_dependency/models/schema.yml @@ -8,3 +8,4 @@ sources: schema: "{{ var('schema_override', target.schema) }}" tables: - name: "seed" + identifier: "seed_subpackage_generate_alias_name" diff --git a/tests/functional/dependencies/test_local_dependency.py b/tests/functional/dependencies/test_local_dependency.py index 1347d41ef43..c7a9f01cc0a 100644 --- a/tests/functional/dependencies/test_local_dependency.py +++ b/tests/functional/dependencies/test_local_dependency.py @@ -64,7 +64,7 @@ schema: "{{ var('schema_override', target.schema) }}" tables: - name: my_table - identifier: seed + identifier: seed_subpackage_generate_alias_name """ macros__macro_sql = """ @@ -156,11 +156,17 @@ def test_local_dependency(self, project): check_relations_equal( project.adapter, - [f"{project.test_schema}.source_override_model", f"{project.test_schema}.seed"], + [ + f"{project.test_schema}.source_override_model", + f"{project.test_schema}.seed_subpackage_generate_alias_name", + ], ) check_relations_equal( project.adapter, - [f"{project.test_schema}.dep_source_model", f"{project.test_schema}.seed"], + [ + f"{project.test_schema}.dep_source_model", + f"{project.test_schema}.seed_subpackage_generate_alias_name", + ], ) def test_no_dependency_paths(self, project): From dd445e1fde0cb5a552d0a25e1d6fcc518989946b Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Tue, 6 Jun 2023 13:30:50 -0700 Subject: [PATCH 46/67] generalize BaseModelConstraintsRuntimeEnforcement (#7805) --- .../dbt/tests/adapter/constraints/test_constraints.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py b/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py index 49e78d19a34..de78143aff7 100644 --- a/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py +++ b/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py @@ -228,7 +228,8 @@ def test__constraints_ddl(self, project, expected_sql): ) results = run_dbt(["run", "-s", "+my_model"]) - assert len(results) == 2 + # assert at least my_model was run - additional upstreams may or may not be provided to the test setup via models fixture + assert len(results) >= 1 # grab the sql and replace the model identifier to make it generic for all adapters # the name is not what we're testing here anyways and varies based on materialization @@ -481,7 +482,8 @@ def test__model_constraints_ddl(self, project, expected_sql): ) results = run_dbt(["run", "-s", "+my_model"]) - assert len(results) == 2 + # assert at least my_model was run - additional upstreams may or may not be provided to the test setup via models fixture + assert len(results) >= 1 generated_sql = read_file("target", "run", "test", "models", "my_model.sql") generated_sql_modified = _normalize_whitespace(generated_sql) generated_sql_generic = _find_and_replace( From 84166bf457c1f8086c2212fb47aa7dffdd25aa41 Mon Sep 17 00:00:00 2001 From: Kshitij Aranke Date: Tue, 6 Jun 2023 15:25:12 -0700 Subject: [PATCH 47/67] Fixes #7551: Create `add_from_artifact` to populate `state_relation` field of nodes (#7796) --- .../Under the Hood-20230605-234706.yaml | 6 ++ core/dbt/contracts/graph/manifest.py | 18 ++++ core/dbt/contracts/graph/nodes.py | 9 ++ test/unit/test_manifest.py | 82 +++++++++++++------ 4 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 .changes/unreleased/Under the Hood-20230605-234706.yaml diff --git a/.changes/unreleased/Under the Hood-20230605-234706.yaml b/.changes/unreleased/Under the Hood-20230605-234706.yaml new file mode 100644 index 00000000000..f61d849ec1b --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230605-234706.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Create `add_from_artifact` to populate `state_relation` field of nodes +time: 2023-06-05T23:47:06.581326-07:00 +custom: + Author: stu-k aranke + Issue: "7551" diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index dec20573dfb..48132b0fbcb 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -39,6 +39,7 @@ BaseNode, ManifestOrPublicNode, ModelNode, + RelationalNode, ) from dbt.contracts.graph.unparsed import SourcePatch, NodeVersion, UnparsedVersion from dbt.contracts.graph.manifest_upgrade import upgrade_manifest_json @@ -1143,6 +1144,23 @@ def merge_from_artifact( sample = list(islice(merged, 5)) fire_event(MergedFromState(num_merged=len(merged), sample=sample)) + # Called by CloneTask.defer_to_manifest + def add_from_artifact( + self, + other: "WritableManifest", + ) -> None: + """Update this manifest by *adding* information about each node's location + in the other manifest. + + Only non-ephemeral refable nodes are examined. + """ + refables = set(NodeType.refable()) + for unique_id, node in other.nodes.items(): + current = self.nodes.get(unique_id) + if current and (node.resource_type in refables and not node.is_ephemeral): + state_relation = RelationalNode(node.database, node.schema, node.alias) + self.nodes[unique_id] = current.replace(state_relation=state_relation) + # Methods that were formerly in ParseResult def add_macro(self, source_file: SourceFile, macro: Macro): diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 24cd8f7ddcb..a3b988f35ff 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -259,6 +259,15 @@ def add_macro(self, value: str): self.macros.append(value) +@dataclass +class RelationalNode(HasRelationMetadata): + alias: str + + @property + def identifier(self): + return self.alias + + @dataclass class DependsOn(MacroDependsOn): nodes: List[str] = field(default_factory=list) diff --git a/test/unit/test_manifest.py b/test/unit/test_manifest.py index dcf5342b20a..781d0a21a70 100644 --- a/test/unit/test_manifest.py +++ b/test/unit/test_manifest.py @@ -1,13 +1,13 @@ import os import unittest -from unittest import mock - from argparse import Namespace -import copy from collections import namedtuple -from itertools import product +from copy import deepcopy from datetime import datetime +from itertools import product +from unittest import mock +import freezegun import pytest import dbt.flags @@ -27,7 +27,6 @@ Group, RefArgs, ) - from dbt.contracts.graph.unparsed import ( ExposureType, Owner, @@ -35,14 +34,10 @@ MetricFilter, MetricTime, ) - from dbt.events.functions import reset_metadata_vars from dbt.exceptions import AmbiguousResourceNameRefError from dbt.flags import set_from_args - from dbt.node_types import NodeType -import freezegun - from .utils import ( MockMacro, MockDocumentation, @@ -53,7 +48,6 @@ inject_plugin, ) - REQUIRED_PARSED_NODE_KEYS = frozenset( { "alias", @@ -103,7 +97,6 @@ | {"compiled", "extra_ctes_injected", "extra_ctes", "compiled_code", "relation_name"} ) - ENV_KEY_NAME = "KEY" if os.name == "nt" else "key" @@ -365,7 +358,7 @@ def tearDown(self): reset_metadata_vars() @freezegun.freeze_time("2018-02-14T09:15:13Z") - def test__no_nodes(self): + def test_no_nodes(self): manifest = Manifest( nodes={}, sources={}, @@ -407,8 +400,8 @@ def test__no_nodes(self): ) @freezegun.freeze_time("2018-02-14T09:15:13Z") - def test__nested_nodes(self): - nodes = copy.copy(self.nested_nodes) + def test_nested_nodes(self): + nodes = deepcopy(self.nested_nodes) manifest = Manifest( nodes=nodes, sources={}, @@ -462,12 +455,12 @@ def test__nested_nodes(self): ) self.assertEqual(child_map["model.snowplow.events"], []) - def test__build_flat_graph(self): - exposures = copy.copy(self.exposures) - metrics = copy.copy(self.metrics) - groups = copy.copy(self.groups) - nodes = copy.copy(self.nested_nodes) - sources = copy.copy(self.sources) + def test_build_flat_graph(self): + exposures = deepcopy(self.exposures) + metrics = deepcopy(self.metrics) + groups = deepcopy(self.groups) + nodes = deepcopy(self.nested_nodes) + sources = deepcopy(self.sources) manifest = Manifest( nodes=nodes, sources=sources, @@ -588,7 +581,7 @@ def test_get_resource_fqns_empty(self): self.assertEqual(manifest.get_resource_fqns(), {}) def test_get_resource_fqns(self): - nodes = copy.copy(self.nested_nodes) + nodes = deepcopy(self.nested_nodes) nodes["seed.root.seed"] = SeedNode( name="seed", database="dbt", @@ -634,7 +627,7 @@ def test_get_resource_fqns(self): resource_fqns = manifest.get_resource_fqns() self.assertEqual(resource_fqns, expect) - def test__deepcopy_copies_flat_graph(self): + def test_deepcopy_copies_flat_graph(self): test_node = ModelNode( name="events", database="dbt", @@ -663,6 +656,41 @@ def test__deepcopy_copies_flat_graph(self): copy = original.deepcopy() self.assertEqual(original.flat_graph, copy.flat_graph) + def test_add_from_artifact(self): + original_nodes = deepcopy(self.nested_nodes) + other_nodes = deepcopy(self.nested_nodes) + + nested2 = other_nodes.pop("model.root.nested") + nested2.name = "nested2" + nested2.alias = "nested2" + nested2.fqn = ["root", "nested2"] + + other_nodes["model.root.nested2"] = nested2 + + for k, v in other_nodes.items(): + v.database = "other_" + v.database + v.schema = "other_" + v.schema + v.alias = "other_" + v.alias + + other_nodes[k] = v + + original_manifest = Manifest(nodes=original_nodes) + other_manifest = Manifest(nodes=other_nodes) + original_manifest.add_from_artifact(other_manifest.writable_manifest()) + + # new node added should not be in original manifest + assert "model.root.nested2" not in original_manifest.nodes + + # old node removed should not have state relation in original manifest + assert original_manifest.nodes["model.root.nested"].state_relation is None + + # for all other nodes, check that state relation is updated + for k, v in original_manifest.nodes.items(): + if k != "model.root.nested": + self.assertEqual("other_" + v.database, v.state_relation.database) + self.assertEqual("other_" + v.schema, v.state_relation.schema) + self.assertEqual("other_" + v.alias, v.state_relation.alias) + class MixedManifestTest(unittest.TestCase): def setUp(self): @@ -869,7 +897,7 @@ def tearDown(self): del os.environ["DBT_ENV_CUSTOM_ENV_key"] @freezegun.freeze_time("2018-02-14T09:15:13Z") - def test__no_nodes(self): + def test_no_nodes(self): metadata = ManifestMetadata( generated_at=datetime.utcnow(), invocation_id="01234567-0123-0123-0123-0123456789ab" ) @@ -911,8 +939,8 @@ def test__no_nodes(self): ) @freezegun.freeze_time("2018-02-14T09:15:13Z") - def test__nested_nodes(self): - nodes = copy.copy(self.nested_nodes) + def test_nested_nodes(self): + nodes = deepcopy(self.nested_nodes) manifest = Manifest( nodes=nodes, sources={}, @@ -963,8 +991,8 @@ def test__nested_nodes(self): ) self.assertEqual(child_map["model.snowplow.events"], []) - def test__build_flat_graph(self): - nodes = copy.copy(self.nested_nodes) + def test_build_flat_graph(self): + nodes = deepcopy(self.nested_nodes) manifest = Manifest( nodes=nodes, sources={}, From 3b63dd9f1179bc899bd0aa32012d0365276ffd6d Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Wed, 7 Jun 2023 09:22:57 -0700 Subject: [PATCH 48/67] Validate public models are not materialized as ephemeral (#7794) --- .../unreleased/Features-20230605-222039.yaml | 6 +++ core/dbt/exceptions.py | 9 ++-- core/dbt/parser/manifest.py | 15 ++++++ tests/functional/groups/test_access.py | 50 +++++++++++++------ 4 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 .changes/unreleased/Features-20230605-222039.yaml diff --git a/.changes/unreleased/Features-20230605-222039.yaml b/.changes/unreleased/Features-20230605-222039.yaml new file mode 100644 index 00000000000..7755a096f96 --- /dev/null +++ b/.changes/unreleased/Features-20230605-222039.yaml @@ -0,0 +1,6 @@ +kind: Features +body: ' Validate public models are not materialized as ephemeral' +time: 2023-06-05T22:20:39.382019-04:00 +custom: + Author: michelleark + Issue: "7226" diff --git a/core/dbt/exceptions.py b/core/dbt/exceptions.py index 130ec4284cd..9109b8dffd0 100644 --- a/core/dbt/exceptions.py +++ b/core/dbt/exceptions.py @@ -1254,12 +1254,15 @@ def get_message(self) -> str: class InvalidAccessTypeError(ParsingError): - def __init__(self, unique_id: str, field_value: str): + def __init__(self, unique_id: str, field_value: str, materialization: Optional[str] = None): self.unique_id = unique_id self.field_value = field_value - msg = ( - f"Node {self.unique_id} has an invalid value ({self.field_value}) for the access field" + self.materialization = materialization + + with_materialization = ( + f"with '{self.materialization}' materialization " if self.materialization else "" ) + msg = f"Node {self.unique_id} {with_materialization}has an invalid value ({self.field_value}) for the access field" super().__init__(msg=msg) diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index ada54f575d8..5e2e666a6d3 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -114,6 +114,7 @@ AmbiguousAliasError, PublicationConfigNotFound, ProjectDependencyCycleError, + InvalidAccessTypeError, ) from dbt.parser.base import Parser from dbt.parser.analysis import AnalysisParser @@ -529,6 +530,7 @@ def load(self): self.process_docs(self.root_project) self.process_metrics(self.root_project) self.check_valid_group_config() + self.check_valid_access_property() # update tracking data self._perf_info.process_manifest_elapsed = time.perf_counter() - start_process @@ -1293,6 +1295,19 @@ def check_valid_group_config_node( node=groupable_node, ) + def check_valid_access_property(self): + for node in self.manifest.nodes.values(): + if ( + isinstance(node, ModelNode) + and node.access == AccessType.Public + and node.get_materialization() == "ephemeral" + ): + raise InvalidAccessTypeError( + unique_id=node.unique_id, + field_value=node.access, + materialization=node.get_materialization(), + ) + def write_perf_info(self, target_path: str): path = os.path.join(target_path, PERF_INFO_FILE_NAME) write_file(path, json.dumps(self._perf_info, cls=dbt.utils.JSONEncoder, indent=4)) diff --git a/tests/functional/groups/test_access.py b/tests/functional/groups/test_access.py index 6814d2f2452..08cc4eb793e 100644 --- a/tests/functional/groups/test_access.py +++ b/tests/functional/groups/test_access.py @@ -18,6 +18,17 @@ description: "yet another model" """ +ephemeral_schema_yml = """ +models: + - name: my_model + description: "my model" + access: public + config: + materialized: ephemeral + - name: another_model + description: "yet another model" +""" + v2_schema_yml = """ models: - name: my_model @@ -161,11 +172,9 @@ def models(self): } def test_access_attribute(self, project): + manifest = run_dbt(["parse"]) + assert len(manifest.nodes) == 2 - results = run_dbt(["run"]) - assert len(results) == 2 - - manifest = get_manifest(project.project_root) my_model_id = "model.test.my_model" another_model_id = "model.test.another_model" assert my_model_id in manifest.nodes @@ -174,25 +183,34 @@ def test_access_attribute(self, project): assert manifest.nodes[my_model_id].access == AccessType.Public assert manifest.nodes[another_model_id].access == AccessType.Protected + # write a file with invalid materialization for public access value + write_file(ephemeral_schema_yml, project.project_root, "models", "schema.yml") + with pytest.raises(InvalidAccessTypeError): + run_dbt(["parse"]) + # write a file with an invalid access value write_file(yet_another_model_sql, project.project_root, "models", "yet_another_model.sql") write_file(v2_schema_yml, project.project_root, "models", "schema.yml") with pytest.raises(InvalidAccessTypeError): - run_dbt(["run"]) + run_dbt(["parse"]) + + write_file(v2_schema_yml, project.project_root, "models", "schema.yml") + with pytest.raises(InvalidAccessTypeError): + run_dbt(["parse"]) # Remove invalid access files and write out model that refs my_model rm_file(project.project_root, "models", "yet_another_model.sql") write_file(schema_yml, project.project_root, "models", "schema.yml") write_file(ref_my_model_sql, project.project_root, "models", "ref_my_model.sql") - results = run_dbt(["run"]) - assert len(results) == 3 + manifest = run_dbt(["parse"]) + assert len(manifest.nodes) == 3 # make my_model private, set same group on my_model and ref_my_model write_file(groups_yml, project.project_root, "models", "groups.yml") write_file(v3_schema_yml, project.project_root, "models", "schema.yml") - results = run_dbt(["run"]) - assert len(results) == 3 + manifest = run_dbt(["parse"]) + assert len(manifest.nodes) == 3 manifest = get_manifest(project.project_root) ref_my_model_id = "model.test.ref_my_model" assert manifest.nodes[my_model_id].group == "analytics" @@ -201,18 +219,18 @@ def test_access_attribute(self, project): # Change group on ref_my_model and it should raise write_file(v4_schema_yml, project.project_root, "models", "schema.yml") with pytest.raises(DbtReferenceError): - run_dbt(["run"]) + run_dbt(["parse"]) # put back group on ref_my_model, add exposure with ref to private model write_file(v3_schema_yml, project.project_root, "models", "schema.yml") # verify it works again - results = run_dbt(["run"]) - assert len(results) == 3 + manifest = run_dbt(["parse"]) + assert len(manifest.nodes) == 3 # Write out exposure refing private my_model write_file(simple_exposure_yml, project.project_root, "models", "simple_exposure.yml") # Fails with reference error with pytest.raises(DbtReferenceError): - run_dbt(["run"]) + run_dbt(["parse"]) # Remove exposure and add people model and metric file write_file(v5_schema_yml, project.project_root, "models", "schema.yml") @@ -220,8 +238,8 @@ def test_access_attribute(self, project): write_file(people_model_sql, "models", "people_model.sql") write_file(people_metric_yml, "models", "people_metric.yml") # Should succeed - results = run_dbt(["run"]) - assert len(results) == 4 + manifest = run_dbt(["parse"]) + assert len(manifest.nodes) == 4 manifest = get_manifest(project.project_root) metric_id = "metric.test.number_of_people" assert manifest.metrics[metric_id].group == "analytics" @@ -230,4 +248,4 @@ def test_access_attribute(self, project): write_file(v2_people_metric_yml, "models", "people_metric.yml") # Should raise a reference error with pytest.raises(DbtReferenceError): - run_dbt(["run"]) + run_dbt(["parse"]) From 444c78772920841d3d50241f6a12a8828d645f22 Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Wed, 7 Jun 2023 09:23:40 -0700 Subject: [PATCH 49/67] fix error message for empty/None: --warn-error-options handling (#7735) --- .../unreleased/Fixes-20230530-104228.yaml | 6 +++++ core/dbt/cli/option_types.py | 9 ++++--- core/dbt/config/utils.py | 2 +- tests/unit/test_option_types.py | 26 +++++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230530-104228.yaml create mode 100644 tests/unit/test_option_types.py diff --git a/.changes/unreleased/Fixes-20230530-104228.yaml b/.changes/unreleased/Fixes-20230530-104228.yaml new file mode 100644 index 00000000000..fac86ed1dc5 --- /dev/null +++ b/.changes/unreleased/Fixes-20230530-104228.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Fix empty --warn-error-options error message +time: 2023-05-30T10:42:28.382804-04:00 +custom: + Author: michelleark + Issue: "7730" diff --git a/core/dbt/cli/option_types.py b/core/dbt/cli/option_types.py index b5eea995624..34d7314e867 100644 --- a/core/dbt/cli/option_types.py +++ b/core/dbt/cli/option_types.py @@ -1,7 +1,7 @@ from click import ParamType, Choice -from dbt.config.utils import parse_cli_vars -from dbt.exceptions import ValidationError +from dbt.config.utils import parse_cli_yaml_string +from dbt.exceptions import ValidationError, DbtValidationError, OptionNotYamlDictError from dbt.helper_types import WarnErrorOptions @@ -16,8 +16,9 @@ def convert(self, value, param, ctx): if not isinstance(value, str): self.fail(f"Cannot load YAML from type {type(value)}", param, ctx) try: - return parse_cli_vars(value) - except ValidationError: + param_option_name = param.opts[0] if param.opts else param.name + return parse_cli_yaml_string(value, param_option_name.strip("-")) + except (ValidationError, DbtValidationError, OptionNotYamlDictError): self.fail(f"String '{value}' is not valid YAML", param, ctx) diff --git a/core/dbt/config/utils.py b/core/dbt/config/utils.py index 8367d0716ba..18951665c53 100644 --- a/core/dbt/config/utils.py +++ b/core/dbt/config/utils.py @@ -19,6 +19,6 @@ def parse_cli_yaml_string(var_string: str, cli_option_name: str) -> Dict[str, An return cli_vars else: raise OptionNotYamlDictError(var_type, cli_option_name) - except DbtValidationError: + except (DbtValidationError, OptionNotYamlDictError): fire_event(InvalidOptionYAML(option_name=cli_option_name)) raise diff --git a/tests/unit/test_option_types.py b/tests/unit/test_option_types.py new file mode 100644 index 00000000000..67d3c5e941f --- /dev/null +++ b/tests/unit/test_option_types.py @@ -0,0 +1,26 @@ +from click import Option, BadParameter +import pytest + +from dbt.cli.option_types import YAML + + +class TestYAML: + @pytest.mark.parametrize( + "raw_value,expected_converted_value", + [ + ("{}", {}), + ("{'test_var_key': 'test_var_value'}", {"test_var_key": "test_var_value"}), + ], + ) + def test_yaml_init(self, raw_value, expected_converted_value): + converted_value = YAML().convert(raw_value, Option(["--vars"]), None) + assert converted_value == expected_converted_value + + @pytest.mark.parametrize( + "invalid_yaml_str", + ["{", ""], + ) + def test_yaml_init_invalid_yaml_str(self, invalid_yaml_str): + with pytest.raises(BadParameter) as e: + YAML().convert(invalid_yaml_str, Option(["--vars"]), None) + assert "--vars" in e.value.format_message() From 919822e583f1e007d3ff5b313d4160b61789f902 Mon Sep 17 00:00:00 2001 From: Mila Page <67295367+VersusFacit@users.noreply.github.com> Date: Wed, 7 Jun 2023 09:56:35 -0700 Subject: [PATCH 50/67] Adap 496/add test connection mode to debug (#7741) * --connection-flag * Standardize the plugin functions used by DebugTask * Cleanup redundant code and help logic along. * Add more output tests to add logic coverage and formatting. * Code review --------- Co-authored-by: Mila Page --- .../unreleased/Features-20230604-025956.yaml | 6 + core/dbt/cli/main.py | 3 +- core/dbt/cli/params.py | 7 + core/dbt/task/debug.py | 435 +++++++++++------- .../dbt/adapters/postgres/connections.py | 7 + .../postgres/dbt/adapters/postgres/impl.py | 3 + .../tests/adapter/dbt_debug/test_dbt_debug.py | 27 +- 7 files changed, 322 insertions(+), 166 deletions(-) create mode 100644 .changes/unreleased/Features-20230604-025956.yaml diff --git a/.changes/unreleased/Features-20230604-025956.yaml b/.changes/unreleased/Features-20230604-025956.yaml new file mode 100644 index 00000000000..fb47bf4855d --- /dev/null +++ b/.changes/unreleased/Features-20230604-025956.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Revamp debug, add --connection flag. Prepare for future refactors/interface changes. +time: 2023-06-04T02:59:56.28283-07:00 +custom: + Author: versusfacit + Issue: 7104 diff --git a/core/dbt/cli/main.py b/core/dbt/cli/main.py index 4bd4d3a6034..f91fbc29e3e 100644 --- a/core/dbt/cli/main.py +++ b/core/dbt/cli/main.py @@ -402,6 +402,7 @@ def show(ctx, **kwargs): # dbt debug @cli.command("debug") @click.pass_context +@p.debug_connection @p.config_dir @p.profile @p.profiles_dir_exists_false @@ -412,7 +413,7 @@ def show(ctx, **kwargs): @requires.postflight @requires.preflight def debug(ctx, **kwargs): - """Test the database connection and show information for debugging purposes. Not to be confused with the --debug option which increases verbosity.""" + """Show information on the current dbt environment and check dependencies, then test the database connection. Not to be confused with the --debug option which increases verbosity.""" task = DebugTask( ctx.obj["flags"], diff --git a/core/dbt/cli/params.py b/core/dbt/cli/params.py index 5100ca5dfce..603c08d29d7 100644 --- a/core/dbt/cli/params.py +++ b/core/dbt/cli/params.py @@ -491,6 +491,13 @@ type=click.Path(), ) +debug_connection = click.option( + "--connection", + envvar=None, + help="Test the connection to the target database independent of dependency checks.", + is_flag=True, +) + threads = click.option( "--threads", envvar=None, diff --git a/core/dbt/task/debug.py b/core/dbt/task/debug.py index 8e70cb68da6..9abc537ebd3 100644 --- a/core/dbt/task/debug.py +++ b/core/dbt/task/debug.py @@ -1,8 +1,12 @@ # coding=utf-8 +import importlib import os import platform import sys -from typing import Optional, Dict, Any, List + +from collections import namedtuple +from enum import Flag +from typing import Optional, Dict, Any, List, Tuple from dbt.events.functions import fire_event from dbt.events.types import ( @@ -15,6 +19,7 @@ from dbt.adapters.factory import get_adapter, register_adapter from dbt.config import PartialProject, Project, Profile from dbt.config.renderer import DbtProjectYamlRenderer, ProfileRenderer +from dbt.contracts.results import RunStatus from dbt.clients.yaml_helper import load_yaml_text from dbt.links import ProfileConfigDocs from dbt.ui import green, red @@ -58,6 +63,16 @@ FILE_NOT_FOUND = "file not found" +SubtaskStatus = namedtuple( + "SubtaskStatus", ["log_msg", "run_status", "details", "summary_message"] +) + + +class DebugRunStatus(Flag): + SUCCESS = True + FAIL = False + + class DebugTask(BaseTask): def __init__(self, args, config): super().__init__(args, config) @@ -77,13 +92,9 @@ def __init__(self, args, config): # set by _load_* self.profile: Optional[Profile] = None - self.profile_fail_details = "" self.raw_profile_data: Optional[Dict[str, Any]] = None self.profile_name: Optional[str] = None self.project: Optional[Project] = None - self.project_fail_details = "" - self.any_failure = False - self.messages: List[str] = [] @property def project_profile(self): @@ -95,81 +106,144 @@ def path_info(self): open_cmd = dbt.clients.system.open_dir_cmd() fire_event(OpenCommand(open_cmd=open_cmd, profiles_dir=self.profiles_dir)) - def run(self): + def run(self) -> bool: if self.args.config_dir: self.path_info() - return not self.any_failure + return DebugRunStatus.SUCCESS.value - version = get_installed_version().to_version_string(skip_matcher=True) + version: str = get_installed_version().to_version_string(skip_matcher=True) fire_event(DebugCmdOut(msg="dbt version: {}".format(version))) fire_event(DebugCmdOut(msg="python version: {}".format(sys.version.split()[0]))) fire_event(DebugCmdOut(msg="python path: {}".format(sys.executable))) fire_event(DebugCmdOut(msg="os info: {}".format(platform.platform()))) + + # Load profile if possible, then load adapter info (which requires the profile) + load_profile_status: SubtaskStatus = self._load_profile() + fire_event(DebugCmdOut(msg="Using profiles dir at {}".format(self.profiles_dir))) fire_event(DebugCmdOut(msg="Using profiles.yml file at {}".format(self.profile_path))) fire_event(DebugCmdOut(msg="Using dbt_project.yml file at {}".format(self.project_path))) - self.test_configuration() - self.test_dependencies() - self.test_connection() + if load_profile_status.run_status == RunStatus.Success: + if self.profile is None: + raise dbt.exceptions.DbtInternalError( + "Profile should not be None if loading profile completed" + ) + else: + adapter_type: str = self.profile.credentials.type - if self.any_failure: - fire_event( - DebugCmdResult(msg=red(f"{(pluralize(len(self.messages), 'check'))} failed:")) + adapter_version: str = self._read_adapter_version( + f"dbt.adapters.{adapter_type}.__version__" ) + fire_event(DebugCmdOut(msg="adapter type: {}".format(adapter_type))) + fire_event(DebugCmdOut(msg="adapter version: {}".format(adapter_version))) + + # Get project loaded to do additional checks + load_project_status: SubtaskStatus = self._load_project() + + dependencies_statuses: List[SubtaskStatus] = [] + if self.args.connection: + fire_event(DebugCmdOut(msg="Skipping steps before connection verification")) else: - fire_event(DebugCmdResult(msg=green("All checks passed!"))) + # this job's status not logged since already accounted for in _load_* commands + self.test_configuration(load_profile_status.log_msg, load_project_status.log_msg) + dependencies_statuses = self.test_dependencies() + + # Test connection + self.test_connection() + + # Log messages from any fails + all_statuses: List[SubtaskStatus] = [ + load_profile_status, + load_project_status, + *dependencies_statuses, + ] + all_failing_statuses: List[SubtaskStatus] = list( + filter(lambda status: status.run_status == RunStatus.Error, all_statuses) + ) - for message in self.messages: - fire_event(DebugCmdResult(msg=f"{message}\n")) + failure_count: int = len(all_failing_statuses) + if failure_count > 0: + fire_event(DebugCmdResult(msg=red(f"{(pluralize(failure_count, 'check'))} failed:"))) + for status in all_failing_statuses: + fire_event(DebugCmdResult(msg=f"{status.summary_message}\n")) + return DebugRunStatus.FAIL.value + else: + fire_event(DebugCmdResult(msg=green("All checks passed!"))) + return DebugRunStatus.SUCCESS.value - return not self.any_failure + # ============================== + # Override for elsewhere in core + # ============================== def interpret_results(self, results): return results - def _load_project(self): - if not os.path.exists(self.project_path): - self.project_fail_details = FILE_NOT_FOUND - return red("ERROR not found") + # =============== + # Loading profile + # =============== - renderer = DbtProjectYamlRenderer(self.profile, self.cli_vars) - - try: - self.project = Project.from_project_root( - self.project_dir, - renderer, - verify_version=self.args.VERSION_CHECK, + def _load_profile(self) -> SubtaskStatus: + """ + Side effects: load self.profile + load self.target_name + load self.raw_profile_data + """ + if not os.path.exists(self.profile_path): + return SubtaskStatus( + log_msg=red("ERROR not found"), + run_status=RunStatus.Error, + details=FILE_NOT_FOUND, + summary_message=MISSING_PROFILE_MESSAGE.format( + path=self.profile_path, url=ProfileConfigDocs + ), ) - except dbt.exceptions.DbtConfigError as exc: - self.project_fail_details = str(exc) - return red("ERROR invalid") - return green("OK found and valid") + raw_profile_data = load_yaml_text(dbt.clients.system.load_file_contents(self.profile_path)) + if isinstance(raw_profile_data, dict): + self.raw_profile_data = raw_profile_data - def _profile_found(self): - if not self.raw_profile_data: - return red("ERROR not found") - assert self.raw_profile_data is not None - if self.profile_name in self.raw_profile_data: - return green("OK found") - else: - return red("ERROR not found") + profile_errors = [] + profile_names, summary_message = self._choose_profile_names() + renderer = ProfileRenderer(self.cli_vars) + for profile_name in profile_names: + try: + profile: Profile = Profile.render( + renderer, + profile_name, + self.args.profile, + self.args.target, + # TODO: Generalize safe access to flags.THREADS: + # https://github.com/dbt-labs/dbt-core/issues/6259 + getattr(self.args, "threads", None), + ) + except dbt.exceptions.DbtConfigError as exc: + profile_errors.append(str(exc)) + else: + if len(profile_names) == 1: + # if a profile was specified, set it on the task + self.target_name = self._choose_target_name(profile_name) + self.profile = profile - def _target_found(self): - requirements = self.raw_profile_data and self.profile_name and self.target_name - if not requirements: - return red("ERROR not found") - # mypy appeasement, we checked just above - assert self.raw_profile_data is not None - assert self.profile_name is not None - assert self.target_name is not None - if self.profile_name not in self.raw_profile_data: - return red("ERROR not found") - profiles = self.raw_profile_data[self.profile_name]["outputs"] - if self.target_name not in profiles: - return red("ERROR not found") - return green("OK found") + if profile_errors: + details = "\n\n".join(profile_errors) + return SubtaskStatus( + log_msg=red("ERROR invalid"), + run_status=RunStatus.Error, + details=details, + summary_message=( + summary_message + f"Profile loading failed for the following reason:" + f"\n{details}" + f"\n" + ), + ) + else: + return SubtaskStatus( + log_msg=green("OK found and valid"), + run_status=RunStatus.Success, + details="", + summary_message="Profile is valid", + ) - def _choose_profile_names(self) -> Optional[List[str]]: + def _choose_profile_names(self) -> Tuple[List[str], str]: project_profile: Optional[str] = None if os.path.exists(self.project_path): try: @@ -185,7 +259,7 @@ def _choose_profile_names(self) -> Optional[List[str]]: args_profile: Optional[str] = getattr(self.args, "profile", None) try: - return [Profile.pick_profile_name(args_profile, project_profile)] + return [Profile.pick_profile_name(args_profile, project_profile)], "" except dbt.exceptions.DbtConfigError: pass # try to guess @@ -194,16 +268,30 @@ def _choose_profile_names(self) -> Optional[List[str]]: if self.raw_profile_data: profiles = [k for k in self.raw_profile_data if k != "config"] if project_profile is None: - self.messages.append("Could not load dbt_project.yml") + summary_message = "Could not load dbt_project.yml\n" elif len(profiles) == 0: - self.messages.append("The profiles.yml has no profiles") + summary_message = "The profiles.yml has no profiles\n" elif len(profiles) == 1: - self.messages.append(ONLY_PROFILE_MESSAGE.format(profiles[0])) + summary_message = ONLY_PROFILE_MESSAGE.format(profiles[0]) else: - self.messages.append( - MULTIPLE_PROFILE_MESSAGE.format("\n".join(" - {}".format(o) for o in profiles)) + summary_message = MULTIPLE_PROFILE_MESSAGE.format( + "\n".join(" - {}".format(o) for o in profiles) ) - return profiles + return profiles, summary_message + + def _read_adapter_version(self, module) -> str: + """read the version out of a standard adapter file""" + try: + version = importlib.import_module(module).version + except ModuleNotFoundError: + version = red("ERROR not found") + except Exception as exc: + version = red("ERROR {}".format(exc)) + raise dbt.exceptions.DbtInternalError( + f"Error when reading adapter version from {module}: {exc}" + ) + + return version def _choose_target_name(self, profile_name: str): has_raw_profile = ( @@ -227,75 +315,109 @@ def _choose_target_name(self, profile_name: str): ) return target_name - def _load_profile(self): - if not os.path.exists(self.profile_path): - self.profile_fail_details = FILE_NOT_FOUND - self.messages.append( - MISSING_PROFILE_MESSAGE.format(path=self.profile_path, url=ProfileConfigDocs) + # =============== + # Loading project + # =============== + + def _load_project(self) -> SubtaskStatus: + """ + Side effect: load self.project + """ + if not os.path.exists(self.project_path): + return SubtaskStatus( + log_msg=red("ERROR not found"), + run_status=RunStatus.Error, + details=FILE_NOT_FOUND, + summary_message=( + f"Project loading failed for the following reason:" + f"\n project path <{self.project_path}> not found" + ), ) - self.any_failure = True - return red("ERROR not found") + + renderer = DbtProjectYamlRenderer(self.profile, self.cli_vars) try: - raw_profile_data = load_yaml_text( - dbt.clients.system.load_file_contents(self.profile_path) + self.project = Project.from_project_root( + self.project_dir, + renderer, + verify_version=self.args.VERSION_CHECK, + ) + except dbt.exceptions.DbtConfigError as exc: + return SubtaskStatus( + log_msg=red("ERROR invalid"), + run_status=RunStatus.Error, + details=str(exc), + summary_message=( + f"Project loading failed for the following reason:" f"\n{str(exc)}" f"\n" + ), ) - except Exception: - pass # we'll report this when we try to load the profile for real else: - if isinstance(raw_profile_data, dict): - self.raw_profile_data = raw_profile_data + return SubtaskStatus( + log_msg=green("OK found and valid"), + run_status=RunStatus.Success, + details="", + summary_message="Project is valid", + ) - profile_errors = [] - profile_names = self._choose_profile_names() - renderer = ProfileRenderer(self.cli_vars) - for profile_name in profile_names: - try: - profile: Profile = Profile.render( - renderer, - profile_name, - self.args.profile, - self.args.target, - # TODO: Generalize safe access to flags.THREADS: - # https://github.com/dbt-labs/dbt-core/issues/6259 - getattr(self.args, "threads", None), - ) - except dbt.exceptions.DbtConfigError as exc: - profile_errors.append(str(exc)) - else: - if len(profile_names) == 1: - # if a profile was specified, set it on the task - self.target_name = self._choose_target_name(profile_name) - self.profile = profile + def _profile_found(self) -> str: + if not self.raw_profile_data: + return red("ERROR not found") + assert self.raw_profile_data is not None + if self.profile_name in self.raw_profile_data: + return green("OK found") + else: + return red("ERROR not found") - if profile_errors: - self.profile_fail_details = "\n\n".join(profile_errors) - return red("ERROR invalid") - return green("OK found and valid") + def _target_found(self) -> str: + requirements = self.raw_profile_data and self.profile_name and self.target_name + if not requirements: + return red("ERROR not found") + # mypy appeasement, we checked just above + assert self.raw_profile_data is not None + assert self.profile_name is not None + assert self.target_name is not None + if self.profile_name not in self.raw_profile_data: + return red("ERROR not found") + profiles = self.raw_profile_data[self.profile_name]["outputs"] + if self.target_name not in profiles: + return red("ERROR not found") + else: + return green("OK found") - def test_git(self): + # ============ + # Config tests + # ============ + + def test_git(self) -> SubtaskStatus: try: dbt.clients.system.run_cmd(os.getcwd(), ["git", "--help"]) except dbt.exceptions.ExecutableError as exc: - self.messages.append("Error from git --help: {!s}".format(exc)) - self.any_failure = True - return red("ERROR") - return green("OK found") + return SubtaskStatus( + log_msg=red("ERROR"), + run_status=RunStatus.Error, + details="git error", + summary_message="Error from git --help: {!s}".format(exc), + ) + else: + return SubtaskStatus( + log_msg=green("OK found"), + run_status=RunStatus.Success, + details="", + summary_message="git is installed and on the path", + ) - def test_dependencies(self): + def test_dependencies(self) -> List[SubtaskStatus]: fire_event(DebugCmdOut(msg="Required dependencies:")) - logline_msg = self.test_git() - fire_event(DebugCmdResult(msg=f" - git [{logline_msg}]\n")) - - def test_configuration(self): - fire_event(DebugCmdOut(msg="Configuration:")) + git_test_status = self.test_git() + fire_event(DebugCmdResult(msg=f" - git [{git_test_status.log_msg}]\n")) - profile_status = self._load_profile() - fire_event(DebugCmdOut(msg=f" profiles.yml file [{profile_status}]")) + return [git_test_status] - project_status = self._load_project() - fire_event(DebugCmdOut(msg=f" dbt_project.yml file [{project_status}]")) + def test_configuration(self, profile_status_msg, project_status_msg): + fire_event(DebugCmdOut(msg="Configuration:")) + fire_event(DebugCmdOut(msg=f" profiles.yml file [{profile_status_msg}]")) + fire_event(DebugCmdOut(msg=f" dbt_project.yml file [{project_status_msg}]")) # skip profile stuff if we can't find a profile name if self.profile_name is not None: @@ -310,72 +432,57 @@ def test_configuration(self): ) ) - self._log_project_fail() - self._log_profile_fail() - - def _log_project_fail(self): - if not self.project_fail_details: - return - - self.any_failure = True - if self.project_fail_details == FILE_NOT_FOUND: - return - msg = ( - f"Project loading failed for the following reason:" - f"\n{self.project_fail_details}" - f"\n" - ) - self.messages.append(msg) - - def _log_profile_fail(self): - if not self.profile_fail_details: - return - - self.any_failure = True - if self.profile_fail_details == FILE_NOT_FOUND: - return - msg = ( - f"Profile loading failed for the following reason:" - f"\n{self.profile_fail_details}" - f"\n" - ) - self.messages.append(msg) + # =============== + # Connection test + # =============== @staticmethod - def attempt_connection(profile): - """Return a string containing the error message, or None if there was - no error. - """ + def attempt_connection(profile) -> Optional[str]: + """Return a string containing the error message, or None if there was no error.""" register_adapter(profile) adapter = get_adapter(profile) try: with adapter.connection_named("debug"): + # is defined in adapter class adapter.debug_query() except Exception as exc: return COULD_NOT_CONNECT_MESSAGE.format( err=str(exc), url=ProfileConfigDocs, ) - return None - def _connection_result(self): - result = self.attempt_connection(self.profile) - if result is not None: - self.messages.append(result) - self.any_failure = True - return red("ERROR") - return green("OK connection ok") - - def test_connection(self): - if not self.profile: - return + def test_connection(self) -> SubtaskStatus: + if self.profile is None: + fire_event(DebugCmdOut(msg="Connection test skipped since no profile was found")) + return SubtaskStatus( + log_msg=red("SKIPPED"), + run_status=RunStatus.Skipped, + details="No profile found", + summary_message="Connection test skipped since no profile was found", + ) + fire_event(DebugCmdOut(msg="Connection:")) for k, v in self.profile.credentials.connection_info(): fire_event(DebugCmdOut(msg=f" {k}: {v}")) - res = self._connection_result() - fire_event(DebugCmdOut(msg=f" Connection test: [{res}]\n")) + connection_result = self.attempt_connection(self.profile) + if connection_result is None: + status = SubtaskStatus( + log_msg=green("OK connection ok"), + run_status=RunStatus.Success, + details="", + summary_message="Connection test passed", + ) + else: + status = SubtaskStatus( + log_msg=red("ERROR"), + run_status=RunStatus.Error, + details="Failure in connecting to db", + summary_message=connection_result, + ) + fire_event(DebugCmdOut(msg=f" Connection test: [{status.log_msg}]\n")) + return status @classmethod def validate_connection(cls, target_dict): diff --git a/plugins/postgres/dbt/adapters/postgres/connections.py b/plugins/postgres/dbt/adapters/postgres/connections.py index cbbdd33fb38..2a1b4e13420 100644 --- a/plugins/postgres/dbt/adapters/postgres/connections.py +++ b/plugins/postgres/dbt/adapters/postgres/connections.py @@ -51,9 +51,16 @@ def _connection_keys(self): "user", "database", "schema", + "connect_timeout", + "role", "search_path", "keepalives_idle", "sslmode", + "sslcert", + "sslkey", + "sslrootcert", + "application_name", + "retries", ) diff --git a/plugins/postgres/dbt/adapters/postgres/impl.py b/plugins/postgres/dbt/adapters/postgres/impl.py index cd49defed83..9a3a0e33f08 100644 --- a/plugins/postgres/dbt/adapters/postgres/impl.py +++ b/plugins/postgres/dbt/adapters/postgres/impl.py @@ -140,3 +140,6 @@ def valid_incremental_strategies(self): Not used to validate custom strategies defined by end users. """ return ["append", "delete+insert"] + + def debug_query(self): + self.execute("select 1 as id") diff --git a/tests/adapter/dbt/tests/adapter/dbt_debug/test_dbt_debug.py b/tests/adapter/dbt/tests/adapter/dbt_debug/test_dbt_debug.py index eb973b91728..3ad39e9c2ab 100644 --- a/tests/adapter/dbt/tests/adapter/dbt_debug/test_dbt_debug.py +++ b/tests/adapter/dbt/tests/adapter/dbt_debug/test_dbt_debug.py @@ -4,7 +4,7 @@ import yaml from dbt.cli.exceptions import DbtUsageException -from dbt.tests.util import run_dbt +from dbt.tests.util import run_dbt, run_dbt_and_capture MODELS__MODEL_SQL = """ seled 1 as id @@ -51,6 +51,24 @@ def test_ok(self, project): run_dbt(["debug"]) assert "ERROR" not in self.capsys.readouterr().out + def test_connection_flag(self, project): + """Testing that the --connection flag works as expected, including that output is not lost""" + _, out = run_dbt_and_capture(["debug", "--connection"]) + assert "Skipping steps before connection verification" in out + + _, out = run_dbt_and_capture( + ["debug", "--connection", "--target", "NONE"], expect_pass=False + ) + assert "1 check failed" in out + assert "The profile 'test' does not have a target named 'NONE'." in out + + _, out = run_dbt_and_capture( + ["debug", "--connection", "--profiles-dir", "NONE"], expect_pass=False + ) + assert "Using profiles dir at NONE" + assert "1 check failed" in out + assert "dbt looked for a profiles.yml file in NONE" in out + def test_nopass(self, project): run_dbt(["debug", "--target", "nopass"], expect_pass=False) self.assertGotValue(re.compile(r"\s+profiles\.yml file"), "ERROR invalid") @@ -100,3 +118,10 @@ def test_invalid_project_outside_current_dir(self, project): run_dbt(["debug", "--project-dir", "custom"], expect_pass=False) splitout = self.capsys.readouterr().out.split("\n") self.check_project(splitout) + + def test_profile_not_found(self, project): + _, out = run_dbt_and_capture( + ["debug", "--connection", "--profile", "NONE"], expect_pass=False + ) + assert "Profile loading failed for the following reason" in out + assert "Could not find profile named 'NONE'" in out From f4253da72ae5caf5bf3833fbf56caea1ed8a9e8b Mon Sep 17 00:00:00 2001 From: Michelle Ark Date: Wed, 7 Jun 2023 10:48:39 -0700 Subject: [PATCH 51/67] fix: removing dependency from dependencies.yml (#7743) --- .../unreleased/Fixes-20230605-124425.yaml | 6 ++ core/dbt/parser/manifest.py | 12 ++-- tests/functional/partial_parsing/fixtures.py | 55 ++++++++++++++++++- .../partial_parsing/test_partial_parsing.py | 27 +++++++++ 4 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230605-124425.yaml diff --git a/.changes/unreleased/Fixes-20230605-124425.yaml b/.changes/unreleased/Fixes-20230605-124425.yaml new file mode 100644 index 00000000000..09c23e3f296 --- /dev/null +++ b/.changes/unreleased/Fixes-20230605-124425.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: fix RuntimeError when removing project dependency from dependencies.yml +time: 2023-06-05T12:44:25.978022-04:00 +custom: + Author: michelleark + Issue: "7743" diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index 5e2e666a6d3..76fa9191d2c 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -787,14 +787,15 @@ def build_public_nodes(self) -> bool: for project in self.manifest.project_dependencies.projects: project_dependency_names.append(project.name) - # clean up previous publications that are no longer specified - # and save previous publications, for later removal of references - saved_manifest_publications: MutableMapping[str, PublicationConfig] = {} + # Save previous publications, for later removal of references + saved_manifest_publications: MutableMapping[str, PublicationConfig] = deepcopy( + self.manifest.publications + ) if self.manifest.publications: for project_name, publication in self.manifest.publications.items(): if project_name not in project_dependency_names: remove_dependent_project_references(self.manifest, publication) - self.manifest.publications.pop(project_name) + saved_manifest_publications.pop(project_name) fire_event( PublicationArtifactChanged( action="removed", @@ -805,7 +806,8 @@ def build_public_nodes(self) -> bool: ) ) public_nodes_changed = True - saved_manifest_publications = self.manifest.publications + + # clean up previous publications that are no longer specified self.manifest.publications = {} # Empty public_nodes since we're re-generating them all self.manifest.public_nodes = {} diff --git a/tests/functional/partial_parsing/fixtures.py b/tests/functional/partial_parsing/fixtures.py index 74cef0bff00..fe68d55be36 100644 --- a/tests/functional/partial_parsing/fixtures.py +++ b/tests/functional/partial_parsing/fixtures.py @@ -1234,8 +1234,61 @@ """ -public_models_schema_yml = """ +dependencies_yml = """ +projects: + - name: marketing +""" + +empty_dependencies_yml = """ +projects: [] +""" + +marketing_pub_json = """ +{ + "project_name": "marketing", + "metadata": { + "dbt_schema_version": "https://schemas.getdbt.com/dbt/publication/v1.json", + "dbt_version": "1.5.0", + "generated_at": "2023-04-13T17:17:58.128706Z", + "invocation_id": "56e3126f-78c7-470c-8eb0-c94af7c3eaac", + "env": {}, + "adapter_type": "postgres", + "quoting": { + "database": true, + "schema": true, + "identifier": true + } + }, + "public_models": { + "model.marketing.fct_one": { + "name": "fct_one", + "package_name": "marketing", + "unique_id": "model.marketing.fct_one", + "relation_name": "\\"dbt\\".\\"test_schema\\".\\"fct_one\\"", + "database": "dbt", + "schema": "test_schema", + "identifier": "fct_one", + "version": null, + "latest_version": null, + "public_node_dependencies": [], + "generated_at": "2023-04-13T17:17:58.128706Z" + }, + "model.marketing.fct_two": { + "name": "fct_two", + "package_name": "marketing", + "unique_id": "model.marketing.fct_two", + "relation_name": "\\"dbt\\".\\"test_schema\\".\\"fct_two\\"", + "version": null, + "latest_version": null, + "public_node_dependencies": ["model.test.fct_one"], + "generated_at": "2023-04-13T17:17:58.128706Z" + } + }, + "dependencies": [] +} +""" +public_models_schema_yml = """ models: - name: orders access: public diff --git a/tests/functional/partial_parsing/test_partial_parsing.py b/tests/functional/partial_parsing/test_partial_parsing.py index 941d9ff1aa9..6d7532edee5 100644 --- a/tests/functional/partial_parsing/test_partial_parsing.py +++ b/tests/functional/partial_parsing/test_partial_parsing.py @@ -69,12 +69,18 @@ groups_schema_yml_one_group_model_in_group2, groups_schema_yml_two_groups_private_orders_valid_access, groups_schema_yml_two_groups_private_orders_invalid_access, + dependencies_yml, + empty_dependencies_yml, + marketing_pub_json, public_models_schema_yml, ) from dbt.exceptions import CompilationError, ParsingError, DuplicateVersionedUnversionedError from dbt.contracts.files import ParseFileType from dbt.contracts.results import TestStatus +from dbt.contracts.publication import PublicationArtifact + +import json import re import os @@ -807,6 +813,27 @@ def test_pp_groups(self, project): results = run_dbt(["--partial-parse", "run"]) +class TestDependencies: + @pytest.fixture(scope="class") + def models(self): + return {"orders.sql": orders_sql} + + @pytest.fixture(scope="class") + def marketing_publication(self): + return PublicationArtifact.from_dict(json.loads(marketing_pub_json)) + + def test_dependencies(self, project, marketing_publication): + # initial run with dependencies + write_file(dependencies_yml, "dependencies.yml") + manifest = run_dbt(["parse"], publications=[marketing_publication]) + assert len(manifest.project_dependencies.projects) == 1 + + # remove dependencies + write_file(empty_dependencies_yml, "dependencies.yml") + manifest = run_dbt(["parse"], publications=[marketing_publication]) + assert len(manifest.project_dependencies.projects) == 0 + + class TestPublicationArtifactAvailable: @pytest.fixture(scope="class") def models(self): From 2d237828ae2a94f39e3ce8e4680a84ac22b6ead4 Mon Sep 17 00:00:00 2001 From: Mike Alfare <13974384+mikealfare@users.noreply.github.com> Date: Wed, 7 Jun 2023 19:19:09 -0400 Subject: [PATCH 52/67] ADAP-2: Materialized Views (#7239) * changie * ADAP-387: Stub materialized view as a materialization (#7211) * init attempt at mv and basic forms of helper macros by mixing view and experimental mv sources * init attempt at mv and basic forms of helper macros by mixing view and experimental mv sources * remove unneeded return statement, rename directory * remove unneeded () * responding to some pr feedback * adjusting order of events for mv base work * move up prexisting drop of backup * change relatiion type to view to be consistent * add base test case * fix jinja exeception message expression, basic test passing * response to feedback, removeal of refresh infavor of combined create_as, etc. * swapping to api layer and stratgeies for default implementation (basing off postgres, redshift) * remove stratgey to limit need for now * remove unneeded story level changelog entry * add strategies to condtional in place of old macros * macro name fix * rename refresh macro in api level * align names between postgres and default to same convention * align names between postgres and default to same convention * change a create call to full refresh * pull adapter rename into strategy, add backup_relation as optional arg * minor typo fix, add intermediate relation to refresh strategy and initial attempt at further conditional logic * updating to feature main --------- Co-authored-by: Matthew McKnight * ADAP-387: reverting db_api implementation (#7322) * changie * init attempt at mv and basic forms of helper macros by mixing view and experimental mv sources * remove unneeded return statement, rename directory * remove unneeded () * responding to some pr feedback * adjusting order of events for mv base work * move up prexisting drop of backup * change relatiion type to view to be consistent * add base test case * fix jinja exeception message expression, basic test passing * response to feedback, removeal of refresh infavor of combined create_as, etc. * swapping to api layer and stratgeies for default implementation (basing off postgres, redshift) * remove stratgey to limit need for now * remove unneeded story level changelog entry * add strategies to condtional in place of old macros * macro name fix * rename refresh macro in api level * align names between postgres and default to same convention * change a create call to full refresh * pull adapter rename into strategy, add backup_relation as optional arg * minor typo fix, add intermediate relation to refresh strategy and initial attempt at further conditional logic * updating to feature main * removing db_api and strategies directories in favor of matching current materialization setups * macro name change * revert to current approach for materializations * added tests * added `is_materialized_view` to `BaseRelation` * updated materialized view stored value to snake case * typo * moved materialized view tests into adapter test framework * add enum to relation for comparison in jinja --------- Co-authored-by: Mike Alfare * ADAP-391: Add configuration change option (#7272) * changie * init attempt at mv and basic forms of helper macros by mixing view and experimental mv sources * move up pre-existing drop of backup * change relation type to view to be consistent * add base test case * fix jinja exception message expression, basic test passing * align names between postgres and default to same convention * init set of Enum for config * work on initial Enum class for on_configuration_change base it off ConstraintTypes which is also a str based Enum in core * add on_configuration_change to unit test expected values * make suggested name change to Enum class * add on_configuration_change to some integration tests * add on_configuration_change to expected_manifest to pass functional tests * added `is_materialized_view` to `BaseRelation` * updated materialized view stored value to snake case * moved materialized view tests into adapter test framework * add alter materialized view macro * change class name, and config setup * play with field setup for on_configuration_change * add method for default selection in enum class * renamed get_refresh_data_in_materialized_view_sql to align with experimental package * changed expected values to default string * added in `on_configuration_change` setting * change ignore to skip * updated default option for on_configuration_change on NodeConfig * removed explicit calls to enum values * add test setup for testing fail config option * updated `config_updates` to `configuration_changes` to align with `on_configuration_change` name * setup configuration change framework * skipped tests that are expected to fail without adapter implementation * cleaned up log checks --------- Co-authored-by: Mike Alfare * ADAP-388: Stub materialized view as a materialization - postgres (#7244) * move the body of the default macros into the postgres implementation, throw errors if the default is used, indicating that materialized views have not been implemented for that adapter --------- Co-authored-by: Matthew McKnight * ADAP-402: Add configuration change option - postgres (#7334) * changie * init attempt at mv and basic forms of helper macros by mixing view and experimental mv sources * remove unneeded return statement, rename directory * remove unneeded () * responding to some pr feedback * adjusting order of events for mv base work * move up prexisting drop of backup * change relatiion type to view to be consistent * add base test case * fix jinja exeception message expression, basic test passing * added materialized view stubs and test * response to feedback, removeal of refresh infavor of combined create_as, etc. * updated postgres to use the new macros structure * swapping to api layer and stratgeies for default implementation (basing off postgres, redshift) * remove stratgey to limit need for now * remove unneeded story level changelog entry * add strategies to condtional in place of old macros * macro name fix * rename refresh macro in api level * align names between postgres and default to same convention * change a create call to full refresh * pull adapter rename into strategy, add backup_relation as optional arg * minor typo fix, add intermediate relation to refresh strategy and initial attempt at further conditional logic * init copy of pr 387 to begin 391 implementation * init set of Enum for config * work on initial Enum class for on_configuration_change base it off ConstraintTypes which is also a str based Enum in core * remove postgres-specific materialization in favor of core default materialization * update db_api to use native types (e.g. str) and avoid direct calls to relation or config, which would alter the run order for all db_api dependencies * add clarifying comment as to why we have a single test that's expected to fail at the dbt-core layer * add on_configuration_change to unit test expected values * make suggested name change to Enum class * add on_configuration_change to some integretion tests * add on_configuration_change to expected_manifest to pass functuional tests * removing db_api and strategies directories in favor of matching current materialization setups * macro name change * revert to current approach for materializations * revert to current approach for materializations * added tests * move materialized view logic into the `/materializations` directory in line with `dbt-core` * moved default macros in `dbt-core` into `dbt-postgres` * added `is_materialized_view` to `BaseRelation` * updated materialized view stored value to snake case * moved materialized view tests into adapter test framework * updated materialized view tests to use adapter test framework * add alter materialized view macro * add alter materialized view macro * change class name, and config setup * change class name, and config setup * play with field setup for on_configuration_change * add method for default selection in enum class * renamed get_refresh_data_in_materialized_view_sql to align with experimental package * changed expected values to default string * added in `on_configuration_change` setting * change ignore to skip * added in `on_configuration_change` setting * updated default option for on_configuration_change on NodeConfig * updated default option for on_configuration_change on NodeConfig * fixed list being passed as string bug * removed explicit calls to enum values * removed unneeded test class * fixed on_configuration_change to be picked up appropriately * add test setup for testing fail config option * remove breakpoint, uncomment tests * update skip scenario to use empty strings * update skip scenario to avoid using sql at all, remove extra whitespace in some templates * push up initial addition of indexes for mv macro * push slight change up * reverting alt macro and moving the do create_index call to be more in line with other materializations * Merge branch 'feature/materialized-views/ADAP-2' into feature/materialized-views/ADAP-402 # Conflicts: # core/dbt/contracts/graph/model_config.py # core/dbt/include/global_project/macros/materializations/models/materialized_view/alter_materialized_view.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/create_materialized_view_as.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/materialized_view.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/refresh_materialized_view.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/replace_materialized_view.sql # plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view.sql # tests/adapter/dbt/tests/adapter/materialized_views/base.py # tests/functional/materializations/test_materialized_view.py * merge feature branch into story branch * merge feature branch into story branch * added indexes into the workflow * fix error in jinja that caused print error * working on test messaging and skipping tests that might not fit quite into current system * add drop and show macros for indexes * add drop and show macros for indexes * add logic to determine the indexes to create or drop * pulled index updates through the workflow properly * convert configuration changes to fixtures, implement index changes into tests * created Model dataclass for readability, added column to swap index columns for testing * fixed typo --------- Co-authored-by: Matthew McKnight * ADAP-395: Implement native materialized view DDL (#7336) * changie * changie * init attempt at mv and basic forms of helper macros by mixing view and experimental mv sources * init attempt at mv and basic forms of helper macros by mixing view and experimental mv sources * remove unneeded return statement, rename directory * remove unneeded () * responding to some pr feedback * adjusting order of events for mv base work * move up prexisting drop of backup * change relatiion type to view to be consistent * add base test case * fix jinja exeception message expression, basic test passing * added materialized view stubs and test * response to feedback, removeal of refresh infavor of combined create_as, etc. * updated postgres to use the new macros structure * swapping to api layer and stratgeies for default implementation (basing off postgres, redshift) * remove stratgey to limit need for now * remove unneeded story level changelog entry * add strategies to condtional in place of old macros * macro name fix * rename refresh macro in api level * align names between postgres and default to same convention * align names between postgres and default to same convention * change a create call to full refresh * pull adapter rename into strategy, add backup_relation as optional arg * minor typo fix, add intermediate relation to refresh strategy and initial attempt at further conditional logic * init copy of pr 387 to begin 391 implementation * updating to feature main * updating to feature main * init set of Enum for config * work on initial Enum class for on_configuration_change base it off ConstraintTypes which is also a str based Enum in core * remove postgres-specific materialization in favor of core default materialization * update db_api to use native types (e.g. str) and avoid direct calls to relation or config, which would alter the run order for all db_api dependencies * add clarifying comment as to why we have a single test that's expected to fail at the dbt-core layer * add on_configuration_change to unit test expected values * make suggested name change to Enum class * add on_configuration_change to some integretion tests * add on_configuration_change to expected_manifest to pass functuional tests * removing db_api and strategies directories in favor of matching current materialization setups * macro name change * revert to current approach for materializations * revert to current approach for materializations * added tests * move materialized view logic into the `/materializations` directory in line with `dbt-core` * moved default macros in `dbt-core` into `dbt-postgres` * added `is_materialized_view` to `BaseRelation` * updated materialized view stored value to snake case * typo * moved materialized view tests into adapter test framework * updated materialized view tests to use adapter test framework * add alter materialized view macro * add alter materialized view macro * added basic sql to default macros, added postgres-specific sql for alter scenario, stubbed a test case for index update * change class name, and config setup * change class name, and config setup * play with field setup for on_configuration_change * add method for default selection in enum class * renamed get_refresh_data_in_materialized_view_sql to align with experimental package * changed expected values to default string * added in `on_configuration_change` setting * change ignore to skip * added in `on_configuration_change` setting * updated default option for on_configuration_change on NodeConfig * updated default option for on_configuration_change on NodeConfig * fixed list being passed as string bug * fixed list being passed as string bug * removed explicit calls to enum values * removed explicit calls to enum values * removed unneeded test class * fixed on_configuration_change to be picked up appropriately * add test setup for testing fail config option * remove breakpoint, uncomment tests * update skip scenario to use empty strings * update skip scenario to avoid using sql at all, remove extra whitespace in some templates * push up initial addition of indexes for mv macro * push slight change up * reverting alt macro and moving the do create_index call to be more in line with other materializations * Merge branch 'feature/materialized-views/ADAP-2' into feature/materialized-views/ADAP-402 # Conflicts: # core/dbt/contracts/graph/model_config.py # core/dbt/include/global_project/macros/materializations/models/materialized_view/alter_materialized_view.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/create_materialized_view_as.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/materialized_view.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/refresh_materialized_view.sql # core/dbt/include/global_project/macros/materializations/models/materialized_view/replace_materialized_view.sql # plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view.sql # tests/adapter/dbt/tests/adapter/materialized_views/base.py # tests/functional/materializations/test_materialized_view.py * merge feature branch into story branch * merge feature branch into story branch * added indexes into the workflow * fix error in jinja that caused print error * working on test messaging and skipping tests that might not fit quite into current system * Merge branch 'feature/materialized-views/ADAP-2' into feature/materialized-views/ADAP-395 # Conflicts: # core/dbt/include/global_project/macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql # plugins/postgres/dbt/include/postgres/macros/adapters.sql # plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view.sql # tests/adapter/dbt/tests/adapter/materialized_views/test_on_configuration_change.py # tests/functional/materializations/test_materialized_view.py * moved postgres implemention into plugin directory * update index methods to align with the configuration update macro * added native ddl to postgres macros * removed extra docstring * updated references to View, now references MaterializedView * decomposed materialization into macros * refactor index create statement parser, add exceptions for unexpected formats * swapped conditional to check for positive state * removed skipped test now that materialized view is being used * return the results and logs of the run so that additional checks can be applied at the adapter level, add check for refresh to a test * add check for indexes in particular for apply on configuration scenario * removed extra argument * add materialized views to get_relations / list_relations * typos in index change logic * moved full refresh check inside the build sql step --------- Co-authored-by: Matthew McKnight * removing returns from tests to stop logs from printing * moved test cases into postgres tests, left non-test functionality in base as new methods or fixtures * fixed overwrite issue, simplified assertion method * updated import order to standard * fixed test import paths * updated naming convention for proper test collection with the test runner * still trying to make the test runner happy * rewrite index updates to use a better source in Postgres * break out a large test suite as a separate run * update `skip` and `fail` scenarios with more descriptive results * typo * removed call to skip status * reverting `exceptions_jinja.py` * added FailFastError back, the right way * removed PostgresIndex in favor of the already existing PostgresIndexConfig, pulled it into its own file to avoid circular imports * removed assumed models in method calls, removed odd insert records and replaced with get row count * fixed index issue, removed some indirection in testing * made test more readable * remove the "apply" from the tests and put it on the base as the default * generalized assertion for reuse with dbt-snowflake, fixed bug in record count utility * fixed type to be more generic to accommodate adapters with their own relation types * fixed all the broken index stuff * updated on_configuration_change to use existing patterns * updated on_configuration_change to use existing patterns * reflected update in tests and materialization logic * reflected update in tests and materialization logic * reverted the change to create a config object from the option object, using just the option object now * reverted the change to create a config object from the option object, using just the option object now * modelled database objects to support monitoring all configuration changes * updated "skip" to "continue", throw an error on non-implemented macro defaults * updated "skip" to "continue", throw an error on non-implemented macro defaults * updated "skip" to "continue", throw an error on non-implemented macro defaults * updated "skip" to "continue", throw an error on non-implemented macro defaults * reverted centralized framework, retained a few reusable base classes * updated names to be more consistent * readability updates * added readme specifying that `relation_configs` only supports materialized views for now --------- Co-authored-by: Matthew McKnight Co-authored-by: Matthew McKnight <91097623+McKnight-42@users.noreply.github.com> --- .../unreleased/Features-20230329-120313.yaml | 6 + core/dbt/adapters/base/relation.py | 8 + core/dbt/adapters/relation_configs/README.md | 25 +++ .../dbt/adapters/relation_configs/__init__.py | 12 ++ .../adapters/relation_configs/config_base.py | 44 ++++ .../relation_configs/config_change.py | 23 ++ .../relation_configs/config_validation.py | 57 +++++ core/dbt/context/exceptions_jinja.py | 6 + core/dbt/contracts/graph/model_config.py | 27 ++- core/dbt/contracts/relation.py | 2 +- .../macros/adapters/indexes.sql | 18 ++ .../alter_materialized_view.sql | 30 +++ .../create_materialized_view.sql | 9 + ...aterialized_view_configuration_changes.sql | 23 ++ .../materialized_view/materialized_view.sql | 121 +++++++++++ .../refresh_materialized_view.sql | 9 + .../replace_materialized_view.sql | 9 + .../macros/materializations/seeds/seed.sql | 2 +- .../postgres/dbt/adapters/postgres/impl.py | 1 + .../dbt/adapters/postgres/relation.py | 71 ++++++- .../postgres/relation_configs/__init__.py | 11 + .../postgres/relation_configs/constants.py | 1 + .../postgres/relation_configs/index.py | 165 +++++++++++++++ .../relation_configs/materialized_view.py | 113 ++++++++++ .../dbt/include/postgres/macros/adapters.sql | 39 ++++ .../materializations/materialized_view.sql | 84 ++++++++ .../materialized_view/create.sql | 0 .../materialized_view/refresh.sql | 0 .../dbt/include/postgres/macros/relations.sql | 2 +- plugins/postgres/setup.py | 2 + test/unit/test_contracts_graph_compiled.py | 2 + test/unit/test_contracts_graph_parsed.py | 15 ++ .../tests/adapter/materialized_view/base.py | 69 ++++++ .../on_configuration_change.py | 91 ++++++++ tests/functional/README.md | 2 +- .../functional/artifacts/expected_manifest.py | 3 + tests/functional/list/test_list.py | 8 + .../materialized_view_tests/fixtures.py | 67 ++++++ .../test_materialized_view.py | 197 ++++++++++++++++++ 39 files changed, 1366 insertions(+), 8 deletions(-) create mode 100644 .changes/unreleased/Features-20230329-120313.yaml create mode 100644 core/dbt/adapters/relation_configs/README.md create mode 100644 core/dbt/adapters/relation_configs/__init__.py create mode 100644 core/dbt/adapters/relation_configs/config_base.py create mode 100644 core/dbt/adapters/relation_configs/config_change.py create mode 100644 core/dbt/adapters/relation_configs/config_validation.py create mode 100644 core/dbt/include/global_project/macros/materializations/models/materialized_view/alter_materialized_view.sql create mode 100644 core/dbt/include/global_project/macros/materializations/models/materialized_view/create_materialized_view.sql create mode 100644 core/dbt/include/global_project/macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql create mode 100644 core/dbt/include/global_project/macros/materializations/models/materialized_view/materialized_view.sql create mode 100644 core/dbt/include/global_project/macros/materializations/models/materialized_view/refresh_materialized_view.sql create mode 100644 core/dbt/include/global_project/macros/materializations/models/materialized_view/replace_materialized_view.sql create mode 100644 plugins/postgres/dbt/adapters/postgres/relation_configs/__init__.py create mode 100644 plugins/postgres/dbt/adapters/postgres/relation_configs/constants.py create mode 100644 plugins/postgres/dbt/adapters/postgres/relation_configs/index.py create mode 100644 plugins/postgres/dbt/adapters/postgres/relation_configs/materialized_view.py create mode 100644 plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view.sql delete mode 100644 plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view/create.sql delete mode 100644 plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view/refresh.sql create mode 100644 tests/adapter/dbt/tests/adapter/materialized_view/base.py create mode 100644 tests/adapter/dbt/tests/adapter/materialized_view/on_configuration_change.py create mode 100644 tests/functional/materializations/materialized_view_tests/fixtures.py create mode 100644 tests/functional/materializations/materialized_view_tests/test_materialized_view.py diff --git a/.changes/unreleased/Features-20230329-120313.yaml b/.changes/unreleased/Features-20230329-120313.yaml new file mode 100644 index 00000000000..436bbc1ffaa --- /dev/null +++ b/.changes/unreleased/Features-20230329-120313.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Add support for materialized views +time: 2023-03-29T12:03:13.862041-04:00 +custom: + Author: mikealfare McKnight-42 + Issue: "6911" diff --git a/core/dbt/adapters/base/relation.py b/core/dbt/adapters/base/relation.py index 1e002c06cc1..ae4e585d524 100644 --- a/core/dbt/adapters/base/relation.py +++ b/core/dbt/adapters/base/relation.py @@ -328,6 +328,10 @@ def is_cte(self) -> bool: def is_view(self) -> bool: return self.type == RelationType.View + @property + def is_materialized_view(self) -> bool: + return self.type == RelationType.MaterializedView + @classproperty def Table(cls) -> str: return str(RelationType.Table) @@ -344,6 +348,10 @@ def View(cls) -> str: def External(cls) -> str: return str(RelationType.External) + @classproperty + def MaterializedView(cls) -> str: + return str(RelationType.MaterializedView) + @classproperty def get_relation_type(cls) -> Type[RelationType]: return RelationType diff --git a/core/dbt/adapters/relation_configs/README.md b/core/dbt/adapters/relation_configs/README.md new file mode 100644 index 00000000000..6be3bc59d12 --- /dev/null +++ b/core/dbt/adapters/relation_configs/README.md @@ -0,0 +1,25 @@ +# RelationConfig +This package serves as an initial abstraction for managing the inspection of existing relations and determining +changes on those relations. It arose from the materialized view work and is currently only supporting +materialized views for Postgres and Redshift as well as dynamic tables for Snowflake. There are three main +classes in this package. + +## RelationConfigBase +This is a very small class that only has a `from_dict()` method and a default `NotImplementedError()`. At some +point this could be replaced by a more robust framework, like `mashumaro` or `pydantic`. + +## RelationConfigChange +This class inherits from `RelationConfigBase` ; however, this can be thought of as a separate class. The subclassing +merely points to the idea that both classes would likely inherit from the same class in a `mashumaro` or +`pydantic` implementation. This class is much more restricted in attribution. It should really only +ever need an `action` and a `context`. This can be though of as being analogous to a web request. You need to +know what you're doing (`action`: 'create' = GET, 'drop' = DELETE, etc.) and the information (`context`) needed +to make the change. In our scenarios, the context tends to be an instance of `RelationConfigBase` corresponding +to the new state. + +## RelationConfigValidationMixin +This mixin provides optional validation mechanics that can be applied to either `RelationConfigBase` or +`RelationConfigChange` subclasses. A validation rule is a combination of a `validation_check`, something +that should evaluate to `True`, and an optional `validation_error`, an instance of `DbtRuntimeError` +that should be raised in the event the `validation_check` fails. While optional, it's recommended that +the `validation_error` be provided for clearer transparency to the end user. diff --git a/core/dbt/adapters/relation_configs/__init__.py b/core/dbt/adapters/relation_configs/__init__.py new file mode 100644 index 00000000000..b8c73447a68 --- /dev/null +++ b/core/dbt/adapters/relation_configs/__init__.py @@ -0,0 +1,12 @@ +from dbt.adapters.relation_configs.config_base import ( # noqa: F401 + RelationConfigBase, + RelationResults, +) +from dbt.adapters.relation_configs.config_change import ( # noqa: F401 + RelationConfigChangeAction, + RelationConfigChange, +) +from dbt.adapters.relation_configs.config_validation import ( # noqa: F401 + RelationConfigValidationMixin, + RelationConfigValidationRule, +) diff --git a/core/dbt/adapters/relation_configs/config_base.py b/core/dbt/adapters/relation_configs/config_base.py new file mode 100644 index 00000000000..9d0cddb0d21 --- /dev/null +++ b/core/dbt/adapters/relation_configs/config_base.py @@ -0,0 +1,44 @@ +from dataclasses import dataclass +from typing import Union, Dict + +import agate +from dbt.utils import filter_null_values + + +""" +This is what relation metadata from the database looks like. It's a dictionary because there will be +multiple grains of data for a single object. For example, a materialized view in Postgres has base level information, +like name. But it also can have multiple indexes, which needs to be a separate query. It might look like this: + +{ + "base": agate.Row({"table_name": "table_abc", "query": "select * from table_def"}) + "indexes": agate.Table("rows": [ + agate.Row({"name": "index_a", "columns": ["column_a"], "type": "hash", "unique": False}), + agate.Row({"name": "index_b", "columns": ["time_dim_a"], "type": "btree", "unique": False}), + ]) +} +""" +RelationResults = Dict[str, Union[agate.Row, agate.Table]] + + +@dataclass(frozen=True) +class RelationConfigBase: + @classmethod + def from_dict(cls, kwargs_dict) -> "RelationConfigBase": + """ + This assumes the subclass of `RelationConfigBase` is flat, in the sense that no attribute is + itself another subclass of `RelationConfigBase`. If that's not the case, this should be overriden + to manually manage that complexity. + + Args: + kwargs_dict: the dict representation of this instance + + Returns: the `RelationConfigBase` representation associated with the provided dict + """ + return cls(**filter_null_values(kwargs_dict)) # type: ignore + + @classmethod + def _not_implemented_error(cls) -> NotImplementedError: + return NotImplementedError( + "This relation type has not been fully configured for this adapter." + ) diff --git a/core/dbt/adapters/relation_configs/config_change.py b/core/dbt/adapters/relation_configs/config_change.py new file mode 100644 index 00000000000..ac653fa5210 --- /dev/null +++ b/core/dbt/adapters/relation_configs/config_change.py @@ -0,0 +1,23 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Hashable + +from dbt.adapters.relation_configs.config_base import RelationConfigBase +from dbt.dataclass_schema import StrEnum + + +class RelationConfigChangeAction(StrEnum): + alter = "alter" + create = "create" + drop = "drop" + + +@dataclass(frozen=True, eq=True, unsafe_hash=True) +class RelationConfigChange(RelationConfigBase, ABC): + action: RelationConfigChangeAction + context: Hashable # this is usually a RelationConfig, e.g. IndexConfig, but shouldn't be limited + + @property + @abstractmethod + def requires_full_refresh(self) -> bool: + raise self._not_implemented_error() diff --git a/core/dbt/adapters/relation_configs/config_validation.py b/core/dbt/adapters/relation_configs/config_validation.py new file mode 100644 index 00000000000..17bf74bf3e7 --- /dev/null +++ b/core/dbt/adapters/relation_configs/config_validation.py @@ -0,0 +1,57 @@ +from dataclasses import dataclass +from typing import Set, Optional + +from dbt.exceptions import DbtRuntimeError + + +@dataclass(frozen=True, eq=True, unsafe_hash=True) +class RelationConfigValidationRule: + validation_check: bool + validation_error: Optional[DbtRuntimeError] + + @property + def default_error(self): + return DbtRuntimeError( + "There was a validation error in preparing this relation config." + "No additional context was provided by this adapter." + ) + + +@dataclass(frozen=True) +class RelationConfigValidationMixin: + def __post_init__(self): + self.run_validation_rules() + + @property + def validation_rules(self) -> Set[RelationConfigValidationRule]: + """ + A set of validation rules to run against the object upon creation. + + A validation rule is a combination of a validation check (bool) and an optional error message. + + This defaults to no validation rules if not implemented. It's recommended to override this with values, + but that may not always be necessary. + + Returns: a set of validation rules + """ + return set() + + def run_validation_rules(self): + for validation_rule in self.validation_rules: + try: + assert validation_rule.validation_check + except AssertionError: + if validation_rule.validation_error: + raise validation_rule.validation_error + else: + raise validation_rule.default_error + self.run_child_validation_rules() + + def run_child_validation_rules(self): + for attr_value in vars(self).values(): + if hasattr(attr_value, "validation_rules"): + attr_value.run_validation_rules() + if isinstance(attr_value, set): + for member in attr_value: + if hasattr(member, "validation_rules"): + member.run_validation_rules() diff --git a/core/dbt/context/exceptions_jinja.py b/core/dbt/context/exceptions_jinja.py index c596fcc6ecb..cffc0e1e483 100644 --- a/core/dbt/context/exceptions_jinja.py +++ b/core/dbt/context/exceptions_jinja.py @@ -25,6 +25,7 @@ RelationWrongTypeError, ContractError, ColumnTypeMissingError, + FailFastError, ) @@ -107,6 +108,10 @@ def column_type_missing(column_names) -> NoReturn: raise ColumnTypeMissingError(column_names) +def raise_fail_fast_error(msg, node=None) -> NoReturn: + raise FailFastError(msg, node=node) + + # Update this when a new function should be added to the # dbt context's `exceptions` key! CONTEXT_EXPORTS = { @@ -131,6 +136,7 @@ def column_type_missing(column_names) -> NoReturn: relation_wrong_type, raise_contract_error, column_type_missing, + raise_fail_fast_error, ] } diff --git a/core/dbt/contracts/graph/model_config.py b/core/dbt/contracts/graph/model_config.py index 60ebf4cd96e..89471df8d5b 100644 --- a/core/dbt/contracts/graph/model_config.py +++ b/core/dbt/contracts/graph/model_config.py @@ -2,15 +2,17 @@ from enum import Enum from itertools import chain from typing import Any, List, Optional, Dict, Union, Type, TypeVar, Callable + from dbt.dataclass_schema import ( dbtClassMixin, ValidationError, register_pattern, + StrEnum, ) from dbt.contracts.graph.unparsed import AdditionalPropertiesAllowed, Docs from dbt.contracts.graph.utils import validate_color -from dbt.exceptions import DbtInternalError, CompilationError from dbt.contracts.util import Replaceable, list_str +from dbt.exceptions import DbtInternalError, CompilationError from dbt import hooks from dbt.node_types import NodeType @@ -189,6 +191,16 @@ class Severity(str): register_pattern(Severity, insensitive_patterns("warn", "error")) +class OnConfigurationChangeOption(StrEnum): + Apply = "apply" + Continue = "continue" + Fail = "fail" + + @classmethod + def default(cls) -> "OnConfigurationChangeOption": + return cls.Apply + + @dataclass class ContractConfig(dbtClassMixin, Replaceable): enforced: bool = False @@ -287,11 +299,17 @@ def same_contents(cls, unrendered: Dict[str, Any], other: Dict[str, Any]) -> boo return False return True - # This is used in 'add_config_call' to created the combined config_call_dict. + # This is used in 'add_config_call' to create the combined config_call_dict. # 'meta' moved here from node mergebehavior = { "append": ["pre-hook", "pre_hook", "post-hook", "post_hook", "tags"], - "update": ["quoting", "column_types", "meta", "docs", "contract"], + "update": [ + "quoting", + "column_types", + "meta", + "docs", + "contract", + ], "dict_key_append": ["grants"], } @@ -445,6 +463,9 @@ class NodeConfig(NodeAndTestConfig): # sometimes getting the Union order wrong, causing serialization failures. unique_key: Union[str, List[str], None] = None on_schema_change: Optional[str] = "ignore" + on_configuration_change: OnConfigurationChangeOption = field( + default_factory=OnConfigurationChangeOption.default + ) grants: Dict[str, Any] = field( default_factory=dict, metadata=MergeBehavior.DictKeyAppend.meta() ) diff --git a/core/dbt/contracts/relation.py b/core/dbt/contracts/relation.py index e557c358966..2cf811f9f6c 100644 --- a/core/dbt/contracts/relation.py +++ b/core/dbt/contracts/relation.py @@ -17,7 +17,7 @@ class RelationType(StrEnum): Table = "table" View = "view" CTE = "cte" - MaterializedView = "materializedview" + MaterializedView = "materialized_view" External = "external" diff --git a/core/dbt/include/global_project/macros/adapters/indexes.sql b/core/dbt/include/global_project/macros/adapters/indexes.sql index a4fdd9cee1b..b8663a7f971 100644 --- a/core/dbt/include/global_project/macros/adapters/indexes.sql +++ b/core/dbt/include/global_project/macros/adapters/indexes.sql @@ -21,3 +21,21 @@ {% endif %} {% endfor %} {% endmacro %} + + +{% macro get_drop_index_sql(relation, index_name) -%} + {{ adapter.dispatch('get_drop_index_sql', 'dbt')(relation, index_name) }} +{%- endmacro %} + +{% macro default__get_drop_index_sql(relation, index_name) -%} + {{ exceptions.raise_compiler_error("`get_drop_index_sql has not been implemented for this adapter.") }} +{%- endmacro %} + + +{% macro get_show_indexes_sql(relation) -%} + {{ adapter.dispatch('get_show_indexes_sql', 'dbt')(relation) }} +{%- endmacro %} + +{% macro default__get_show_indexes_sql(relation) -%} + {{ exceptions.raise_compiler_error("`get_show_indexes_sql has not been implemented for this adapter.") }} +{%- endmacro %} diff --git a/core/dbt/include/global_project/macros/materializations/models/materialized_view/alter_materialized_view.sql b/core/dbt/include/global_project/macros/materializations/models/materialized_view/alter_materialized_view.sql new file mode 100644 index 00000000000..b9ccdc2f141 --- /dev/null +++ b/core/dbt/include/global_project/macros/materializations/models/materialized_view/alter_materialized_view.sql @@ -0,0 +1,30 @@ +{% macro get_alter_materialized_view_as_sql( + relation, + configuration_changes, + sql, + existing_relation, + backup_relation, + intermediate_relation +) %} + {{- log('Applying ALTER to: ' ~ relation) -}} + {{- adapter.dispatch('get_alter_materialized_view_as_sql', 'dbt')( + relation, + configuration_changes, + sql, + existing_relation, + backup_relation, + intermediate_relation + ) -}} +{% endmacro %} + + +{% macro default__get_alter_materialized_view_as_sql( + relation, + configuration_changes, + sql, + existing_relation, + backup_relation, + intermediate_relation +) %} + {{ exceptions.raise_compiler_error("Materialized views have not been implemented for this adapter.") }} +{% endmacro %} diff --git a/core/dbt/include/global_project/macros/materializations/models/materialized_view/create_materialized_view.sql b/core/dbt/include/global_project/macros/materializations/models/materialized_view/create_materialized_view.sql new file mode 100644 index 00000000000..4b2ebeb3aa1 --- /dev/null +++ b/core/dbt/include/global_project/macros/materializations/models/materialized_view/create_materialized_view.sql @@ -0,0 +1,9 @@ +{% macro get_create_materialized_view_as_sql(relation, sql) -%} + {{- log('Applying CREATE to: ' ~ relation) -}} + {{- adapter.dispatch('get_create_materialized_view_as_sql', 'dbt')(relation, sql) -}} +{%- endmacro %} + + +{% macro default__get_create_materialized_view_as_sql(relation, sql) -%} + {{ exceptions.raise_compiler_error("Materialized views have not been implemented for this adapter.") }} +{% endmacro %} diff --git a/core/dbt/include/global_project/macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql b/core/dbt/include/global_project/macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql new file mode 100644 index 00000000000..b1639b1631e --- /dev/null +++ b/core/dbt/include/global_project/macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql @@ -0,0 +1,23 @@ +{% macro get_materialized_view_configuration_changes(existing_relation, new_config) %} + /* {# + It's recommended that configuration changes be formatted as follows: + {"": [{"action": "", "context": ...}]} + + For example: + { + "indexes": [ + {"action": "drop", "context": "index_abc"}, + {"action": "create", "context": {"columns": ["column_1", "column_2"], "type": "hash", "unique": True}}, + ], + } + + Either way, `get_materialized_view_configuration_changes` needs to align with `get_alter_materialized_view_as_sql`. + #} */ + {{- log('Determining configuration changes on: ' ~ existing_relation) -}} + {%- do return(adapter.dispatch('get_materialized_view_configuration_changes', 'dbt')(existing_relation, new_config)) -%} +{% endmacro %} + + +{% macro default__get_materialized_view_configuration_changes(existing_relation, new_config) %} + {{ exceptions.raise_compiler_error("Materialized views have not been implemented for this adapter.") }} +{% endmacro %} diff --git a/core/dbt/include/global_project/macros/materializations/models/materialized_view/materialized_view.sql b/core/dbt/include/global_project/macros/materializations/models/materialized_view/materialized_view.sql new file mode 100644 index 00000000000..015f6cb8585 --- /dev/null +++ b/core/dbt/include/global_project/macros/materializations/models/materialized_view/materialized_view.sql @@ -0,0 +1,121 @@ +{% materialization materialized_view, default %} + {% set existing_relation = load_cached_relation(this) %} + {% set target_relation = this.incorporate(type=this.MaterializedView) %} + {% set intermediate_relation = make_intermediate_relation(target_relation) %} + {% set backup_relation_type = target_relation.MaterializedView if existing_relation is none else existing_relation.type %} + {% set backup_relation = make_backup_relation(target_relation, backup_relation_type) %} + + {{ materialized_view_setup(backup_relation, intermediate_relation, pre_hooks) }} + + {% set build_sql = materialized_view_get_build_sql(existing_relation, target_relation, backup_relation, intermediate_relation) %} + + {% if build_sql == '' %} + {{ materialized_view_execute_no_op(target_relation) }} + {% else %} + {{ materialized_view_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) }} + {% endif %} + + {{ materialized_view_teardown(backup_relation, intermediate_relation, post_hooks) }} + + {{ return({'relations': [target_relation]}) }} + +{% endmaterialization %} + + +{% macro materialized_view_setup(backup_relation, intermediate_relation, pre_hooks) %} + + -- backup_relation and intermediate_relation should not already exist in the database + -- it's possible these exist because of a previous run that exited unexpectedly + {% set preexisting_backup_relation = load_cached_relation(backup_relation) %} + {% set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) %} + + -- drop the temp relations if they exist already in the database + {{ drop_relation_if_exists(preexisting_backup_relation) }} + {{ drop_relation_if_exists(preexisting_intermediate_relation) }} + + {{ run_hooks(pre_hooks, inside_transaction=False) }} + +{% endmacro %} + + +{% macro materialized_view_teardown(backup_relation, intermediate_relation, post_hooks) %} + + -- drop the temp relations if they exist to leave the database clean for the next run + {{ drop_relation_if_exists(backup_relation) }} + {{ drop_relation_if_exists(intermediate_relation) }} + + {{ run_hooks(post_hooks, inside_transaction=False) }} + +{% endmacro %} + + +{% macro materialized_view_get_build_sql(existing_relation, target_relation, backup_relation, intermediate_relation) %} + + {% set full_refresh_mode = should_full_refresh() %} + + -- determine the scenario we're in: create, full_refresh, alter, refresh data + {% if existing_relation is none %} + {% set build_sql = get_create_materialized_view_as_sql(target_relation, sql) %} + {% elif full_refresh_mode or not existing_relation.is_materialized_view %} + {% set build_sql = get_replace_materialized_view_as_sql(target_relation, sql, existing_relation, backup_relation, intermediate_relation) %} + {% else %} + + -- get config options + {% set on_configuration_change = config.get('on_configuration_change') %} + {% set configuration_changes = get_materialized_view_configuration_changes(existing_relation, config) %} + + {% if configuration_changes is none %} + {% set build_sql = refresh_materialized_view(target_relation) %} + + {% elif on_configuration_change == 'apply' %} + {% set build_sql = get_alter_materialized_view_as_sql(target_relation, configuration_changes, sql, existing_relation, backup_relation, intermediate_relation) %} + {% elif on_configuration_change == 'continue' %} + {% set build_sql = '' %} + {{ exceptions.warn("Configuration changes were identified and `on_configuration_change` was set to `continue` for `" ~ target_relation ~ "`") }} + {% elif on_configuration_change == 'fail' %} + {{ exceptions.raise_fail_fast_error("Configuration changes were identified and `on_configuration_change` was set to `fail` for `" ~ target_relation ~ "`") }} + + {% else %} + -- this only happens if the user provides a value other than `apply`, 'skip', 'fail' + {{ exceptions.raise_compiler_error("Unexpected configuration scenario") }} + + {% endif %} + + {% endif %} + + {% do return(build_sql) %} + +{% endmacro %} + + +{% macro materialized_view_execute_no_op(target_relation) %} + {% do store_raw_result( + name="main", + message="skip " ~ target_relation, + code="skip", + rows_affected="-1" + ) %} +{% endmacro %} + + +{% macro materialized_view_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) %} + + -- `BEGIN` happens here: + {{ run_hooks(pre_hooks, inside_transaction=True) }} + + {% set grant_config = config.get('grants') %} + + {% call statement(name="main") %} + {{ build_sql }} + {% endcall %} + + {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %} + {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %} + + {% do persist_docs(target_relation, model) %} + + {{ run_hooks(post_hooks, inside_transaction=True) }} + + {{ adapter.commit() }} + +{% endmacro %} diff --git a/core/dbt/include/global_project/macros/materializations/models/materialized_view/refresh_materialized_view.sql b/core/dbt/include/global_project/macros/materializations/models/materialized_view/refresh_materialized_view.sql new file mode 100644 index 00000000000..16345138593 --- /dev/null +++ b/core/dbt/include/global_project/macros/materializations/models/materialized_view/refresh_materialized_view.sql @@ -0,0 +1,9 @@ +{% macro refresh_materialized_view(relation) %} + {{- log('Applying REFRESH to: ' ~ relation) -}} + {{- adapter.dispatch('refresh_materialized_view', 'dbt')(relation) -}} +{% endmacro %} + + +{% macro default__refresh_materialized_view(relation) %} + {{ exceptions.raise_compiler_error("Materialized views have not been implemented for this adapter.") }} +{% endmacro %} diff --git a/core/dbt/include/global_project/macros/materializations/models/materialized_view/replace_materialized_view.sql b/core/dbt/include/global_project/macros/materializations/models/materialized_view/replace_materialized_view.sql new file mode 100644 index 00000000000..43319c5cc1b --- /dev/null +++ b/core/dbt/include/global_project/macros/materializations/models/materialized_view/replace_materialized_view.sql @@ -0,0 +1,9 @@ +{% macro get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) %} + {{- log('Applying REPLACE to: ' ~ relation) -}} + {{- adapter.dispatch('get_replace_materialized_view_as_sql', 'dbt')(relation, sql, existing_relation, backup_relation, intermediate_relation) -}} +{% endmacro %} + + +{% macro default__get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) %} + {{ exceptions.raise_compiler_error("Materialized views have not been implemented for this adapter.") }} +{% endmacro %} diff --git a/core/dbt/include/global_project/macros/materializations/seeds/seed.sql b/core/dbt/include/global_project/macros/materializations/seeds/seed.sql index d43b7f3ccf1..3b66252da96 100644 --- a/core/dbt/include/global_project/macros/materializations/seeds/seed.sql +++ b/core/dbt/include/global_project/macros/materializations/seeds/seed.sql @@ -10,7 +10,7 @@ {%- set grant_config = config.get('grants') -%} {%- set agate_table = load_agate_table() -%} - -- grab current tables grants config for comparision later on + -- grab current tables grants config for comparison later on {%- do store_result('agate_table', response='OK', agate_table=agate_table) -%} diff --git a/plugins/postgres/dbt/adapters/postgres/impl.py b/plugins/postgres/dbt/adapters/postgres/impl.py index 9a3a0e33f08..a2c6d652d42 100644 --- a/plugins/postgres/dbt/adapters/postgres/impl.py +++ b/plugins/postgres/dbt/adapters/postgres/impl.py @@ -1,6 +1,7 @@ from datetime import datetime from dataclasses import dataclass from typing import Optional, Set, List, Any + from dbt.adapters.base.meta import available from dbt.adapters.base.impl import AdapterConfig, ConstraintSupport from dbt.adapters.sql import SQLAdapter diff --git a/plugins/postgres/dbt/adapters/postgres/relation.py b/plugins/postgres/dbt/adapters/postgres/relation.py index 820a69b0c64..43822efb11f 100644 --- a/plugins/postgres/dbt/adapters/postgres/relation.py +++ b/plugins/postgres/dbt/adapters/postgres/relation.py @@ -1,7 +1,22 @@ from dataclasses import dataclass +from typing import Optional, Set, FrozenSet + from dbt.adapters.base.relation import BaseRelation +from dbt.adapters.relation_configs import ( + RelationConfigChangeAction, + RelationResults, +) +from dbt.context.providers import RuntimeConfigObject from dbt.exceptions import DbtRuntimeError +from dbt.adapters.postgres.relation_configs import ( + PostgresIndexConfig, + PostgresIndexConfigChange, + PostgresMaterializedViewConfig, + PostgresMaterializedViewConfigChangeCollection, + MAX_CHARACTERS_IN_IDENTIFIER, +) + @dataclass(frozen=True, eq=False, repr=False) class PostgresRelation(BaseRelation): @@ -19,4 +34,58 @@ def __post_init__(self): ) def relation_max_name_length(self): - return 63 + return MAX_CHARACTERS_IN_IDENTIFIER + + def get_materialized_view_config_change_collection( + self, relation_results: RelationResults, runtime_config: RuntimeConfigObject + ) -> Optional[PostgresMaterializedViewConfigChangeCollection]: + config_change_collection = PostgresMaterializedViewConfigChangeCollection() + + existing_materialized_view = PostgresMaterializedViewConfig.from_relation_results( + relation_results + ) + new_materialized_view = PostgresMaterializedViewConfig.from_model_node( + runtime_config.model + ) + + config_change_collection.indexes = self._get_index_config_changes( + existing_materialized_view.indexes, new_materialized_view.indexes + ) + + # we return `None` instead of an empty `PostgresMaterializedViewConfigChangeCollection` object + # so that it's easier and more extensible to check in the materialization: + # `core/../materializations/materialized_view.sql` : + # {% if configuration_changes is none %} + if config_change_collection.has_changes: + return config_change_collection + + def _get_index_config_changes( + self, + existing_indexes: FrozenSet[PostgresIndexConfig], + new_indexes: FrozenSet[PostgresIndexConfig], + ) -> Set[PostgresIndexConfigChange]: + """ + Get the index updates that will occur as a result of a new run + + There are four scenarios: + + 1. Indexes are equal -> don't return these + 2. Index is new -> create these + 3. Index is old -> drop these + 4. Indexes are not equal -> drop old, create new -> two actions + + Returns: a set of index updates in the form {"action": "drop/create", "context": } + """ + drop_changes = set( + PostgresIndexConfigChange.from_dict( + {"action": RelationConfigChangeAction.drop, "context": index} + ) + for index in existing_indexes.difference(new_indexes) + ) + create_changes = set( + PostgresIndexConfigChange.from_dict( + {"action": RelationConfigChangeAction.create, "context": index} + ) + for index in new_indexes.difference(existing_indexes) + ) + return set().union(drop_changes, create_changes) diff --git a/plugins/postgres/dbt/adapters/postgres/relation_configs/__init__.py b/plugins/postgres/dbt/adapters/postgres/relation_configs/__init__.py new file mode 100644 index 00000000000..9fdb942bfa5 --- /dev/null +++ b/plugins/postgres/dbt/adapters/postgres/relation_configs/__init__.py @@ -0,0 +1,11 @@ +from dbt.adapters.postgres.relation_configs.constants import ( # noqa: F401 + MAX_CHARACTERS_IN_IDENTIFIER, +) +from dbt.adapters.postgres.relation_configs.index import ( # noqa: F401 + PostgresIndexConfig, + PostgresIndexConfigChange, +) +from dbt.adapters.postgres.relation_configs.materialized_view import ( # noqa: F401 + PostgresMaterializedViewConfig, + PostgresMaterializedViewConfigChangeCollection, +) diff --git a/plugins/postgres/dbt/adapters/postgres/relation_configs/constants.py b/plugins/postgres/dbt/adapters/postgres/relation_configs/constants.py new file mode 100644 index 00000000000..9228df23043 --- /dev/null +++ b/plugins/postgres/dbt/adapters/postgres/relation_configs/constants.py @@ -0,0 +1 @@ +MAX_CHARACTERS_IN_IDENTIFIER = 63 diff --git a/plugins/postgres/dbt/adapters/postgres/relation_configs/index.py b/plugins/postgres/dbt/adapters/postgres/relation_configs/index.py new file mode 100644 index 00000000000..3a072ea4307 --- /dev/null +++ b/plugins/postgres/dbt/adapters/postgres/relation_configs/index.py @@ -0,0 +1,165 @@ +from dataclasses import dataclass, field +from typing import Set, FrozenSet + +import agate +from dbt.dataclass_schema import StrEnum +from dbt.exceptions import DbtRuntimeError +from dbt.adapters.relation_configs import ( + RelationConfigBase, + RelationConfigValidationMixin, + RelationConfigValidationRule, + RelationConfigChangeAction, + RelationConfigChange, +) + + +class PostgresIndexMethod(StrEnum): + btree = "btree" + hash = "hash" + gist = "gist" + spgist = "spgist" + gin = "gin" + brin = "brin" + + @classmethod + def default(cls) -> "PostgresIndexMethod": + return cls.btree + + +@dataclass(frozen=True, eq=True, unsafe_hash=True) +class PostgresIndexConfig(RelationConfigBase, RelationConfigValidationMixin): + """ + This config fallows the specs found here: + https://www.postgresql.org/docs/current/sql-createindex.html + + The following parameters are configurable by dbt: + - name: the name of the index in the database, this isn't predictable since we apply a timestamp + - unique: checks for duplicate values when the index is created and on data updates + - method: the index method to be used + - column_names: the columns in the index + + Applicable defaults for non-configurable parameters: + - concurrently: `False` + - nulls_distinct: `True` + """ + + name: str = field(default=None, hash=False, compare=False) + column_names: FrozenSet[str] = field(default_factory=frozenset, hash=True) + unique: bool = field(default=False, hash=True) + method: PostgresIndexMethod = field(default=PostgresIndexMethod.default(), hash=True) + + @property + def validation_rules(self) -> Set[RelationConfigValidationRule]: + return { + RelationConfigValidationRule( + validation_check=self.column_names is not None, + validation_error=DbtRuntimeError( + "Indexes require at least one column, but none were provided" + ), + ), + } + + @classmethod + def from_dict(cls, config_dict) -> "PostgresIndexConfig": + # TODO: include the QuotePolicy instead of defaulting to lower() + kwargs_dict = { + "name": config_dict.get("name"), + "column_names": frozenset( + column.lower() for column in config_dict.get("column_names", set()) + ), + "unique": config_dict.get("unique"), + "method": config_dict.get("method"), + } + index: "PostgresIndexConfig" = super().from_dict(kwargs_dict) # type: ignore + return index + + @classmethod + def parse_model_node(cls, model_node_entry: dict) -> dict: + config_dict = { + "column_names": set(model_node_entry.get("columns", set())), + "unique": model_node_entry.get("unique"), + "method": model_node_entry.get("type"), + } + return config_dict + + @classmethod + def parse_relation_results(cls, relation_results_entry: agate.Row) -> dict: + config_dict = { + "name": relation_results_entry.get("name"), + "column_names": set(relation_results_entry.get("column_names", "").split(",")), + "unique": relation_results_entry.get("unique"), + "method": relation_results_entry.get("method"), + } + return config_dict + + @property + def as_node_config(self) -> dict: + """ + Returns: a dictionary that can be passed into `get_create_index_sql()` + """ + node_config = { + "columns": list(self.column_names), + "unique": self.unique, + "type": self.method.value, + } + return node_config + + +@dataclass(frozen=True, eq=True, unsafe_hash=True) +class PostgresIndexConfigChange(RelationConfigChange, RelationConfigValidationMixin): + """ + Example of an index change: + { + "action": "create", + "context": { + "name": "", # we don't know the name since it gets created as a hash at runtime + "columns": ["column_1", "column_3"], + "type": "hash", + "unique": True + } + }, + { + "action": "drop", + "context": { + "name": "index_abc", # we only need this to drop, but we need the rest to compare + "columns": ["column_1"], + "type": "btree", + "unique": True + } + } + """ + + context: PostgresIndexConfig + + @property + def requires_full_refresh(self) -> bool: + return False + + @property + def validation_rules(self) -> Set[RelationConfigValidationRule]: + return { + RelationConfigValidationRule( + validation_check=self.action + in {RelationConfigChangeAction.create, RelationConfigChangeAction.drop}, + validation_error=DbtRuntimeError( + "Invalid operation, only `drop` and `create` changes are supported for indexes." + ), + ), + RelationConfigValidationRule( + validation_check=not ( + self.action == RelationConfigChangeAction.drop and self.context.name is None + ), + validation_error=DbtRuntimeError( + "Invalid operation, attempting to drop an index with no name." + ), + ), + RelationConfigValidationRule( + validation_check=not ( + self.action == RelationConfigChangeAction.create + and self.context.column_names == set() + ), + validation_error=DbtRuntimeError( + "Invalid operations, attempting to create an index with no columns." + ), + ), + } diff --git a/plugins/postgres/dbt/adapters/postgres/relation_configs/materialized_view.py b/plugins/postgres/dbt/adapters/postgres/relation_configs/materialized_view.py new file mode 100644 index 00000000000..15e700e777a --- /dev/null +++ b/plugins/postgres/dbt/adapters/postgres/relation_configs/materialized_view.py @@ -0,0 +1,113 @@ +from dataclasses import dataclass, field +from typing import Set, FrozenSet, List + +import agate +from dbt.adapters.relation_configs import ( + RelationConfigBase, + RelationResults, + RelationConfigValidationMixin, + RelationConfigValidationRule, +) +from dbt.contracts.graph.nodes import ModelNode +from dbt.exceptions import DbtRuntimeError + +from dbt.adapters.postgres.relation_configs.constants import MAX_CHARACTERS_IN_IDENTIFIER +from dbt.adapters.postgres.relation_configs.index import ( + PostgresIndexConfig, + PostgresIndexConfigChange, +) + + +@dataclass(frozen=True, eq=True, unsafe_hash=True) +class PostgresMaterializedViewConfig(RelationConfigBase, RelationConfigValidationMixin): + """ + This config follows the specs found here: + https://www.postgresql.org/docs/current/sql-creatematerializedview.html + + The following parameters are configurable by dbt: + - table_name: name of the materialized view + - query: the query that defines the view + - indexes: the collection (set) of indexes on the materialized view + + Applicable defaults for non-configurable parameters: + - method: `heap` + - tablespace_name: `default_tablespace` + - with_data: `True` + """ + + table_name: str = "" + query: str = "" + indexes: FrozenSet[PostgresIndexConfig] = field(default_factory=frozenset) + + @property + def validation_rules(self) -> Set[RelationConfigValidationRule]: + # index rules get run by default with the mixin + return { + RelationConfigValidationRule( + validation_check=self.table_name is None + or len(self.table_name) <= MAX_CHARACTERS_IN_IDENTIFIER, + validation_error=DbtRuntimeError( + f"The materialized view name is more than {MAX_CHARACTERS_IN_IDENTIFIER} " + f"characters: {self.table_name}" + ), + ), + } + + @classmethod + def from_dict(cls, config_dict: dict) -> "PostgresMaterializedViewConfig": + kwargs_dict = { + "table_name": config_dict.get("table_name"), + "query": config_dict.get("query"), + "indexes": frozenset( + PostgresIndexConfig.from_dict(index) for index in config_dict.get("indexes", {}) + ), + } + materialized_view: "PostgresMaterializedViewConfig" = super().from_dict(kwargs_dict) # type: ignore + return materialized_view + + @classmethod + def from_model_node(cls, model_node: ModelNode) -> "PostgresMaterializedViewConfig": + materialized_view_config = cls.parse_model_node(model_node) + materialized_view = cls.from_dict(materialized_view_config) + return materialized_view + + @classmethod + def parse_model_node(cls, model_node: ModelNode) -> dict: + indexes: List[dict] = model_node.config.extra.get("indexes", []) + config_dict = { + "table_name": model_node.identifier, + "query": model_node.compiled_code, + "indexes": [PostgresIndexConfig.parse_model_node(index) for index in indexes], + } + return config_dict + + @classmethod + def from_relation_results( + cls, relation_results: RelationResults + ) -> "PostgresMaterializedViewConfig": + materialized_view_config = cls.parse_relation_results(relation_results) + materialized_view = cls.from_dict(materialized_view_config) + return materialized_view + + @classmethod + def parse_relation_results(cls, relation_results: RelationResults) -> dict: + indexes: agate.Table = relation_results.get("indexes", agate.Table(rows={})) + config_dict = { + "indexes": [ + PostgresIndexConfig.parse_relation_results(index) for index in indexes.rows + ], + } + return config_dict + + +@dataclass +class PostgresMaterializedViewConfigChangeCollection: + indexes: Set[PostgresIndexConfigChange] = field(default_factory=set) + + @property + def requires_full_refresh(self) -> bool: + return any(index.requires_full_refresh for index in self.indexes) + + @property + def has_changes(self) -> bool: + return self.indexes != set() diff --git a/plugins/postgres/dbt/include/postgres/macros/adapters.sql b/plugins/postgres/dbt/include/postgres/macros/adapters.sql index 07892f35b4b..53d2bd622b3 100644 --- a/plugins/postgres/dbt/include/postgres/macros/adapters.sql +++ b/plugins/postgres/dbt/include/postgres/macros/adapters.sql @@ -95,6 +95,14 @@ 'view' as type from pg_views where schemaname ilike '{{ schema_relation.schema }}' + union all + select + '{{ schema_relation.database }}' as database, + matviewname as name, + schemaname as schema, + 'materialized_view' as type + from pg_matviews + where schemaname ilike '{{ schema_relation.schema }}' {% endcall %} {{ return(load_result('list_relations_without_caching').table) }} {% endmacro %} @@ -209,3 +217,34 @@ {% macro postgres__copy_grants() %} {{ return(False) }} {% endmacro %} + + +{% macro postgres__get_show_indexes_sql(relation) %} + select + i.relname as name, + m.amname as method, + ix.indisunique as "unique", + array_to_string(array_agg(a.attname), ',') as column_names + from pg_index ix + join pg_class i + on i.oid = ix.indexrelid + join pg_am m + on m.oid=i.relam + join pg_class t + on t.oid = ix.indrelid + join pg_namespace n + on n.oid = t.relnamespace + join pg_attribute a + on a.attrelid = t.oid + and a.attnum = ANY(ix.indkey) + where t.relname = '{{ relation.identifier }}' + and n.nspname = '{{ relation.schema }}' + and t.relkind in ('r', 'm') + group by 1, 2, 3 + order by 1, 2, 3 +{% endmacro %} + + +{%- macro postgres__get_drop_index_sql(relation, index_name) -%} + drop index if exists "{{ index_name }}" +{%- endmacro -%} diff --git a/plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view.sql b/plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view.sql new file mode 100644 index 00000000000..1fc7d864b5b --- /dev/null +++ b/plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view.sql @@ -0,0 +1,84 @@ +{% macro postgres__get_alter_materialized_view_as_sql( + relation, + configuration_changes, + sql, + existing_relation, + backup_relation, + intermediate_relation +) %} + + -- apply a full refresh immediately if needed + {% if configuration_changes.requires_full_refresh %} + + {{ get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) }} + + -- otherwise apply individual changes as needed + {% else %} + + {{ postgres__update_indexes_on_materialized_view(relation, configuration_changes.indexes) }} + + {%- endif -%} + +{% endmacro %} + + +{% macro postgres__get_create_materialized_view_as_sql(relation, sql) %} + create materialized view if not exists {{ relation }} as {{ sql }}; + + {% for _index_dict in config.get('indexes', []) -%} + {{- get_create_index_sql(relation, _index_dict) -}} + {%- endfor -%} + +{% endmacro %} + + +{% macro postgres__get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) %} + {{- get_create_materialized_view_as_sql(intermediate_relation, sql) -}} + + {% if existing_relation is not none %} + alter materialized view {{ existing_relation }} rename to {{ backup_relation.include(database=False, schema=False) }}; + {% endif %} + + alter materialized view {{ intermediate_relation }} rename to {{ relation.include(database=False, schema=False) }}; + +{% endmacro %} + + +{% macro postgres__get_materialized_view_configuration_changes(existing_relation, new_config) %} + {% set _existing_materialized_view = postgres__describe_materialized_view(existing_relation) %} + {% set _configuration_changes = existing_relation.get_materialized_view_config_change_collection(_existing_materialized_view, new_config) %} + {% do return(_configuration_changes) %} +{% endmacro %} + + +{% macro postgres__refresh_materialized_view(relation) %} + refresh materialized view {{ relation }}; +{% endmacro %} + + +{%- macro postgres__update_indexes_on_materialized_view(relation, index_changes) -%} + {{- log("Applying UPDATE INDEXES to: " ~ relation) -}} + + {%- for _index_change in index_changes -%} + {%- set _index = _index_change.context -%} + + {%- if _index_change.action == "drop" -%} + + {{ postgres__get_drop_index_sql(relation, _index.name) }}; + + {%- elif _index_change.action == "create" -%} + + {{ postgres__get_create_index_sql(relation, _index.as_node_config) }} + + {%- endif -%} + + {%- endfor -%} + +{%- endmacro -%} + + +{% macro postgres__describe_materialized_view(relation) %} + -- for now just get the indexes, we don't need the name or the query yet + {% set _indexes = run_query(get_show_indexes_sql(relation)) %} + {% do return({'indexes': _indexes}) %} +{% endmacro %} diff --git a/plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view/create.sql b/plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view/create.sql deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view/refresh.sql b/plugins/postgres/dbt/include/postgres/macros/materializations/materialized_view/refresh.sql deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/plugins/postgres/dbt/include/postgres/macros/relations.sql b/plugins/postgres/dbt/include/postgres/macros/relations.sql index a553f768148..9966c5db2e8 100644 --- a/plugins/postgres/dbt/include/postgres/macros/relations.sql +++ b/plugins/postgres/dbt/include/postgres/macros/relations.sql @@ -42,7 +42,7 @@ referenced_class.kind from relation join class as referenced_class on relation.class=referenced_class.id - where referenced_class.kind in ('r', 'v') + where referenced_class.kind in ('r', 'v', 'm') ), relationships as ( select diff --git a/plugins/postgres/setup.py b/plugins/postgres/setup.py index d8d39372875..369592c2f5d 100644 --- a/plugins/postgres/setup.py +++ b/plugins/postgres/setup.py @@ -71,6 +71,8 @@ def _dbt_psycopg2_name(): install_requires=[ "dbt-core=={}".format(package_version), "{}~=2.8".format(DBT_PSYCOPG2_NAME), + # installed via dbt-core, but referenced directly, don't pin to avoid version conflicts with dbt-core + "agate", ], zip_safe=False, classifiers=[ diff --git a/test/unit/test_contracts_graph_compiled.py b/test/unit/test_contracts_graph_compiled.py index ee37b9200de..08a13ac7637 100644 --- a/test/unit/test_contracts_graph_compiled.py +++ b/test/unit/test_contracts_graph_compiled.py @@ -147,6 +147,7 @@ def basic_uncompiled_dict(): "quoting": {}, "tags": [], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "packages": [], @@ -199,6 +200,7 @@ def basic_compiled_dict(): "quoting": {}, "tags": [], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "packages": [], diff --git a/test/unit/test_contracts_graph_parsed.py b/test/unit/test_contracts_graph_parsed.py index 9fc11e985c7..65b1e254711 100644 --- a/test/unit/test_contracts_graph_parsed.py +++ b/test/unit/test_contracts_graph_parsed.py @@ -81,6 +81,7 @@ def populated_node_config_dict(): "tags": [], "extra": "even more", "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "packages": [], @@ -165,6 +166,7 @@ def base_parsed_model_dict(): "quoting": {}, "tags": [], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, @@ -273,6 +275,7 @@ def complex_parsed_model_dict(): "quoting": {}, "tags": [], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, @@ -352,6 +355,7 @@ def complex_parsed_model_object(): "quoting": {}, "column_types": {"a": "text"}, "on_schema_change": "ignore", + "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": True}, @@ -370,6 +374,7 @@ def complex_parsed_model_object(): "quoting": {}, "tags": [], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, @@ -520,6 +525,7 @@ def basic_parsed_seed_dict(): "quoting": {}, "tags": [], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, @@ -611,6 +617,7 @@ def complex_parsed_seed_dict(): "tags": [], "quote_columns": True, "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, @@ -816,6 +823,7 @@ def base_parsed_hook_dict(): "quoting": {}, "tags": [], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, @@ -898,6 +906,7 @@ def complex_parsed_hook_dict(): "quoting": {}, "tags": [], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, @@ -1254,6 +1263,7 @@ def basic_timestamp_snapshot_config_dict(): "target_database": "some_snapshot_db", "target_schema": "some_snapshot_schema", "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "packages": [], @@ -1291,6 +1301,7 @@ def complex_timestamp_snapshot_config_dict(): "strategy": "timestamp", "updated_at": "last_update", "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "packages": [], @@ -1356,6 +1367,7 @@ def basic_check_snapshot_config_dict(): "strategy": "check", "check_cols": "all", "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "packages": [], @@ -1393,6 +1405,7 @@ def complex_set_snapshot_config_dict(): "strategy": "check", "check_cols": ["a", "b"], "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "packages": [], @@ -1509,6 +1522,7 @@ def basic_timestamp_snapshot_dict(): "strategy": "timestamp", "updated_at": "last_update", "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, @@ -1656,6 +1670,7 @@ def basic_check_snapshot_dict(): "strategy": "check", "check_cols": "all", "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "docs": {"show": True}, diff --git a/tests/adapter/dbt/tests/adapter/materialized_view/base.py b/tests/adapter/dbt/tests/adapter/materialized_view/base.py new file mode 100644 index 00000000000..25aef3abc6f --- /dev/null +++ b/tests/adapter/dbt/tests/adapter/materialized_view/base.py @@ -0,0 +1,69 @@ +from typing import List, Tuple, Optional +import os + +import pytest + +from dbt.dataclass_schema import StrEnum +from dbt.tests.util import run_dbt, get_manifest, run_dbt_and_capture + + +def run_model( + model: str, + run_args: Optional[List[str]] = None, + full_refresh: bool = False, + expect_pass: bool = True, +) -> Tuple[list, str]: + args = ["--debug", "run", "--models", model] + if full_refresh: + args.append("--full-refresh") + if run_args: + args.extend(run_args) + return run_dbt_and_capture(args, expect_pass=expect_pass) + + +def assert_message_in_logs(logs: str, message: str, expected_fail: bool = False): + # if the logs are json strings, then 'jsonify' the message because of things like escape quotes + if os.environ.get("DBT_LOG_FORMAT", "") == "json": + message = message.replace(r'"', r"\"") + + if expected_fail: + assert message not in logs + else: + assert message in logs + + +def get_records(project, model: str) -> List[tuple]: + sql = f"select * from {project.database}.{project.test_schema}.{model};" + return [tuple(row) for row in project.run_sql(sql, fetch="all")] + + +def get_row_count(project, model: str) -> int: + sql = f"select count(*) from {project.database}.{project.test_schema}.{model};" + return project.run_sql(sql, fetch="one")[0] + + +def insert_record(project, record: tuple, model: str, columns: List[str]): + sql = f""" + insert into {project.database}.{project.test_schema}.{model} ({', '.join(columns)}) + values ({','.join(str(value) for value in record)}) + ;""" + project.run_sql(sql) + + +def assert_model_exists_and_is_correct_type(project, model: str, relation_type: StrEnum): + # In general, `relation_type` will be of type `RelationType`. + # However, in some cases (e.g. `dbt-snowflake`) adapters will have their own `RelationType`. + manifest = get_manifest(project.project_root) + model_metadata = manifest.nodes[f"model.test.{model}"] + assert model_metadata.config.materialized == relation_type + assert get_row_count(project, model) >= 0 + + +class Base: + @pytest.fixture(scope="function", autouse=True) + def setup(self, project): + run_dbt(["run"]) + + @pytest.fixture(scope="class", autouse=True) + def project(self, project): + yield project diff --git a/tests/adapter/dbt/tests/adapter/materialized_view/on_configuration_change.py b/tests/adapter/dbt/tests/adapter/materialized_view/on_configuration_change.py new file mode 100644 index 00000000000..f77d9aade03 --- /dev/null +++ b/tests/adapter/dbt/tests/adapter/materialized_view/on_configuration_change.py @@ -0,0 +1,91 @@ +from typing import List + +import pytest +import yaml + +from dbt.tests.util import read_file, write_file, relation_from_name +from dbt.contracts.results import RunStatus + +from dbt.tests.adapter.materialized_view.base import ( + Base, + assert_message_in_logs, +) + + +def get_project_config(project): + file_yaml = read_file(project.project_root, "dbt_project.yml") + return yaml.safe_load(file_yaml) + + +def set_project_config(project, config): + config_yaml = yaml.safe_dump(config) + write_file(config_yaml, project.project_root, "dbt_project.yml") + + +def get_model_file(project, model: str) -> str: + return read_file(project.project_root, "models", f"{model}.sql") + + +def set_model_file(project, model: str, model_sql: str): + write_file(model_sql, project.project_root, "models", f"{model}.sql") + + +def assert_proper_scenario( + on_configuration_change, + results, + logs, + status: RunStatus, + messages_in_logs: List[str] = None, + messages_not_in_logs: List[str] = None, +): + assert len(results.results) == 1 + result = results.results[0] + + assert result.node.config.on_configuration_change == on_configuration_change + assert result.status == status + for message in messages_in_logs or []: + assert_message_in_logs(logs, message) + for message in messages_not_in_logs or []: + assert_message_in_logs(logs, message, expected_fail=True) + + +class OnConfigurationChangeBase(Base): + + base_materialized_view = "base_materialized_view" + + @pytest.fixture(scope="function") + def alter_message(self, project): + return f"Applying ALTER to: {relation_from_name(project.adapter, self.base_materialized_view)}" + + @pytest.fixture(scope="function") + def create_message(self, project): + return f"Applying CREATE to: {relation_from_name(project.adapter, self.base_materialized_view)}" + + @pytest.fixture(scope="function") + def refresh_message(self, project): + return f"Applying REFRESH to: {relation_from_name(project.adapter, self.base_materialized_view)}" + + @pytest.fixture(scope="function") + def replace_message(self, project): + return f"Applying REPLACE to: {relation_from_name(project.adapter, self.base_materialized_view)}" + + @pytest.fixture(scope="function") + def configuration_change_message(self, project): + return ( + f"Determining configuration changes on: " + f"{relation_from_name(project.adapter, self.base_materialized_view)}" + ) + + @pytest.fixture(scope="function") + def configuration_change_continue_message(self, project): + return ( + f"Configuration changes were identified and `on_configuration_change` " + f"was set to `continue` for `{relation_from_name(project.adapter, self.base_materialized_view)}`" + ) + + @pytest.fixture(scope="function") + def configuration_change_fail_message(self, project): + return ( + f"Configuration changes were identified and `on_configuration_change` " + f"was set to `fail` for `{relation_from_name(project.adapter, self.base_materialized_view)}`" + ) diff --git a/tests/functional/README.md b/tests/functional/README.md index 5c24a3e75eb..b5aa542ea4a 100644 --- a/tests/functional/README.md +++ b/tests/functional/README.md @@ -11,4 +11,4 @@ * Explore using: * https://github.com/pytest-docker-compose/pytest-docker-compose or * https://github.com/avast/pytest-docker for automatically managing a postgres instance running in a docker container - * Track test converage (https://pytest-cov.readthedocs.io/en/latest) + * Track test coverage (https://pytest-cov.readthedocs.io/en/latest) diff --git a/tests/functional/artifacts/expected_manifest.py b/tests/functional/artifacts/expected_manifest.py index 7805294a65f..ae4967ea752 100644 --- a/tests/functional/artifacts/expected_manifest.py +++ b/tests/functional/artifacts/expected_manifest.py @@ -29,6 +29,7 @@ def get_rendered_model_config(**updates): "persist_docs": {}, "full_refresh": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "unique_key": None, "grants": {}, @@ -59,6 +60,7 @@ def get_rendered_seed_config(**updates): "quote_columns": True, "full_refresh": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "database": None, "schema": None, "alias": None, @@ -96,6 +98,7 @@ def get_rendered_snapshot_config(**updates): "persist_docs": {}, "full_refresh": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "strategy": "check", "check_cols": "all", "unique_key": "id", diff --git a/tests/functional/list/test_list.py b/tests/functional/list/test_list.py index c4c23083795..9915f2dc3c9 100644 --- a/tests/functional/list/test_list.py +++ b/tests/functional/list/test_list.py @@ -90,6 +90,7 @@ def expect_snapshot_output(self, project): "alias": None, "check_cols": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "meta": {}, "grants": {}, "packages": [], @@ -127,6 +128,7 @@ def expect_analyses_output(self): "persist_docs": {}, "full_refresh": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "database": None, "schema": None, "alias": None, @@ -170,6 +172,7 @@ def expect_model_output(self): "full_refresh": None, "unique_key": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "database": None, "schema": None, "alias": None, @@ -207,6 +210,7 @@ def expect_model_output(self): "full_refresh": None, "unique_key": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "database": None, "schema": None, "alias": None, @@ -244,6 +248,7 @@ def expect_model_output(self): "full_refresh": None, "unique_key": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "database": None, "schema": None, "alias": None, @@ -281,6 +286,7 @@ def expect_model_output(self): "full_refresh": None, "unique_key": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "database": None, "schema": None, "alias": None, @@ -328,6 +334,7 @@ def expect_model_ephemeral_output(self): "persist_docs": {}, "full_refresh": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "database": None, "schema": None, "alias": None, @@ -393,6 +400,7 @@ def expect_seed_output(self): "full_refresh": None, "unique_key": None, "on_schema_change": "ignore", + "on_configuration_change": "apply", "database": None, "schema": None, "alias": None, diff --git a/tests/functional/materializations/materialized_view_tests/fixtures.py b/tests/functional/materializations/materialized_view_tests/fixtures.py new file mode 100644 index 00000000000..0250152376f --- /dev/null +++ b/tests/functional/materializations/materialized_view_tests/fixtures.py @@ -0,0 +1,67 @@ +import pytest + +from dbt.tests.util import relation_from_name +from tests.adapter.dbt.tests.adapter.materialized_view.base import Base +from tests.adapter.dbt.tests.adapter.materialized_view.on_configuration_change import ( + OnConfigurationChangeBase, + get_model_file, + set_model_file, +) + + +class PostgresBasicBase(Base): + @pytest.fixture(scope="class") + def models(self): + base_table = """ + {{ config(materialized='table') }} + select 1 as base_column + """ + base_materialized_view = """ + {{ config(materialized='materialized_view') }} + select * from {{ ref('base_table') }} + """ + return {"base_table.sql": base_table, "base_materialized_view.sql": base_materialized_view} + + +class PostgresOnConfigurationChangeBase(OnConfigurationChangeBase): + @pytest.fixture(scope="class") + def models(self): + base_table = """ + {{ config( + materialized='table', + indexes=[{'columns': ['id', 'value']}] + ) }} + select + 1 as id, + 100 as value, + 42 as new_id, + 4242 as new_value + """ + base_materialized_view = """ + {{ config( + materialized='materialized_view', + indexes=[{'columns': ['id', 'value']}] + ) }} + select * from {{ ref('base_table') }} + """ + return {"base_table.sql": base_table, "base_materialized_view.sql": base_materialized_view} + + @pytest.fixture(scope="function") + def configuration_changes(self, project): + initial_model = get_model_file(project, "base_materialized_view") + + # change the index from [`id`, `value`] to [`new_id`, `new_value`] + new_model = initial_model.replace( + "indexes=[{'columns': ['id', 'value']}]", + "indexes=[{'columns': ['new_id', 'new_value']}]", + ) + set_model_file(project, "base_materialized_view", new_model) + + yield + + # set this back for the next test + set_model_file(project, "base_materialized_view", initial_model) + + @pytest.fixture(scope="function") + def update_index_message(self, project): + return f"Applying UPDATE INDEXES to: {relation_from_name(project.adapter, 'base_materialized_view')}" diff --git a/tests/functional/materializations/materialized_view_tests/test_materialized_view.py b/tests/functional/materializations/materialized_view_tests/test_materialized_view.py new file mode 100644 index 00000000000..733329b42ff --- /dev/null +++ b/tests/functional/materializations/materialized_view_tests/test_materialized_view.py @@ -0,0 +1,197 @@ +import pytest +from dbt.contracts.graph.model_config import OnConfigurationChangeOption +from dbt.contracts.results import RunStatus +from dbt.contracts.relation import RelationType +from tests.adapter.dbt.tests.adapter.materialized_view.base import ( + run_model, + assert_model_exists_and_is_correct_type, + insert_record, + get_row_count, +) +from tests.adapter.dbt.tests.adapter.materialized_view.on_configuration_change import ( + assert_proper_scenario, +) + +from tests.functional.materializations.materialized_view_tests.fixtures import ( + PostgresOnConfigurationChangeBase, + PostgresBasicBase, +) + + +class TestBasic(PostgresBasicBase): + def test_relation_is_materialized_view_on_initial_creation(self, project): + assert_model_exists_and_is_correct_type( + project, "base_materialized_view", RelationType.MaterializedView + ) + assert_model_exists_and_is_correct_type(project, "base_table", RelationType.Table) + + def test_relation_is_materialized_view_when_rerun(self, project): + run_model("base_materialized_view") + assert_model_exists_and_is_correct_type( + project, "base_materialized_view", RelationType.MaterializedView + ) + + def test_relation_is_materialized_view_on_full_refresh(self, project): + run_model("base_materialized_view", full_refresh=True) + assert_model_exists_and_is_correct_type( + project, "base_materialized_view", RelationType.MaterializedView + ) + + def test_relation_is_materialized_view_on_update(self, project): + run_model("base_materialized_view", run_args=["--vars", "quoting: {identifier: True}"]) + assert_model_exists_and_is_correct_type( + project, "base_materialized_view", RelationType.MaterializedView + ) + + def test_updated_base_table_data_only_shows_in_materialized_view_after_rerun(self, project): + # poll database + table_start = get_row_count(project, "base_table") + view_start = get_row_count(project, "base_materialized_view") + + # insert new record in table + new_record = (2,) + insert_record(project, new_record, "base_table", ["base_column"]) + + # poll database + table_mid = get_row_count(project, "base_table") + view_mid = get_row_count(project, "base_materialized_view") + + # refresh the materialized view + run_model("base_materialized_view") + + # poll database + table_end = get_row_count(project, "base_table") + view_end = get_row_count(project, "base_materialized_view") + + # new records were inserted in the table but didn't show up in the view until it was refreshed + assert table_start < table_mid == table_end + assert view_start == view_mid < view_end + + +class TestOnConfigurationChangeApply(PostgresOnConfigurationChangeBase): + # we don't need to specify OnConfigurationChangeOption.Apply because it's the default + # this is part of the test + + def test_full_refresh_takes_precedence_over_any_configuration_changes( + self, configuration_changes, replace_message, configuration_change_message + ): + results, logs = run_model("base_materialized_view", full_refresh=True) + assert_proper_scenario( + OnConfigurationChangeOption.Apply, + results, + logs, + RunStatus.Success, + messages_in_logs=[replace_message], + messages_not_in_logs=[configuration_change_message], + ) + + def test_model_is_refreshed_with_no_configuration_changes( + self, refresh_message, configuration_change_message + ): + results, logs = run_model("base_materialized_view") + assert_proper_scenario( + OnConfigurationChangeOption.Apply, + results, + logs, + RunStatus.Success, + messages_in_logs=[refresh_message, configuration_change_message], + ) + + def test_model_applies_changes_with_configuration_changes( + self, configuration_changes, alter_message, update_index_message + ): + results, logs = run_model("base_materialized_view") + assert_proper_scenario( + OnConfigurationChangeOption.Apply, + results, + logs, + RunStatus.Success, + messages_in_logs=[alter_message, update_index_message], + ) + + +class TestOnConfigurationChangeContinue(PostgresOnConfigurationChangeBase): + @pytest.fixture(scope="class") + def project_config_update(self): + return {"models": {"on_configuration_change": OnConfigurationChangeOption.Continue.value}} + + def test_full_refresh_takes_precedence_over_any_configuration_changes( + self, configuration_changes, replace_message, configuration_change_message + ): + results, logs = run_model("base_materialized_view", full_refresh=True) + assert_proper_scenario( + OnConfigurationChangeOption.Continue, + results, + logs, + RunStatus.Success, + messages_in_logs=[replace_message], + messages_not_in_logs=[configuration_change_message], + ) + + def test_model_is_refreshed_with_no_configuration_changes( + self, refresh_message, configuration_change_message + ): + results, logs = run_model("base_materialized_view") + assert_proper_scenario( + OnConfigurationChangeOption.Continue, + results, + logs, + RunStatus.Success, + messages_in_logs=[refresh_message, configuration_change_message], + ) + + def test_model_is_not_refreshed_with_configuration_changes( + self, configuration_changes, configuration_change_continue_message, refresh_message + ): + results, logs = run_model("base_materialized_view") + assert_proper_scenario( + OnConfigurationChangeOption.Continue, + results, + logs, + RunStatus.Success, + messages_in_logs=[configuration_change_continue_message], + messages_not_in_logs=[refresh_message], + ) + + +class TestOnConfigurationChangeFail(PostgresOnConfigurationChangeBase): + @pytest.fixture(scope="class") + def project_config_update(self): + return {"models": {"on_configuration_change": OnConfigurationChangeOption.Fail.value}} + + def test_full_refresh_takes_precedence_over_any_configuration_changes( + self, configuration_changes, replace_message, configuration_change_message + ): + results, logs = run_model("base_materialized_view", full_refresh=True) + assert_proper_scenario( + OnConfigurationChangeOption.Fail, + results, + logs, + RunStatus.Success, + messages_in_logs=[replace_message], + messages_not_in_logs=[configuration_change_message], + ) + + def test_model_is_refreshed_with_no_configuration_changes( + self, refresh_message, configuration_change_message + ): + results, logs = run_model("base_materialized_view") + assert_proper_scenario( + OnConfigurationChangeOption.Fail, + results, + logs, + RunStatus.Success, + messages_in_logs=[refresh_message, configuration_change_message], + ) + + def test_run_fails_with_configuration_changes( + self, configuration_changes, configuration_change_fail_message + ): + results, logs = run_model("base_materialized_view", expect_pass=False) + assert_proper_scenario( + OnConfigurationChangeOption.Fail, + results, + logs, + RunStatus.Error, + messages_in_logs=[configuration_change_fail_message], + ) From a89da7ca888f3365210c0260d65d34deea6e67ef Mon Sep 17 00:00:00 2001 From: Peter Webb Date: Thu, 8 Jun 2023 09:39:04 -0400 Subject: [PATCH 53/67] Add SemanticModel Node Type (#7769) * Add dbt-semantic-interfaces as a dependency With the integration with MetricFlow we're taking a dependency on `dbt-semantic-interfaces` which acts as the source of truth for protocols which MetricFlow and dbt-core need to agree on. Additionally we're hard pinning to 0.1.0.dev3 for now. We plan on having a less restrictive specification when dbt-core 1.6 hits GA. * Add implementations of DSI Metadata protocol to nodes.py * CT-2521: Initial work on adding new SemanticModel node * CT-2521: Second rough draft of SemanticModels * CT-2521: Update schema v10 * CT-2521: Update unit tests for new SemanticModel collection in manifest * CT-2521: Add changelog entry * CT-2521: Final touches on initial implementation of SemanticModel parsing * Change name of Metadata class to reduce potential for confusion * Remove "Replaceable" inheritance, per review * CT-2521: Rename internal variables from semantic_models to semantic_nodes * CT-2521: Update manifest schema to reflect change --------- Co-authored-by: Quigley Malcolm --- .../unreleased/Features-20230606-165351.yaml | 6 + core/dbt/contracts/files.py | 1 + core/dbt/contracts/graph/manifest.py | 29 +- core/dbt/contracts/graph/manifest_upgrade.py | 2 + core/dbt/contracts/graph/nodes.py | 66 ++- core/dbt/contracts/graph/unparsed.py | 54 +++ core/dbt/node_types.py | 1 + core/dbt/parser/manifest.py | 25 ++ core/dbt/parser/schema_yaml_readers.py | 52 ++- core/dbt/parser/schemas.py | 7 + core/setup.py | 1 + schemas/dbt/manifest/v10.json | 381 +++++++++++++++++- test/unit/test_manifest.py | 6 + test/unit/test_node_types.py | 1 + .../functional/artifacts/expected_manifest.py | 3 + tests/functional/artifacts/test_artifacts.py | 1 + .../artifacts/test_previous_version_state.py | 2 +- .../test_semantic_model_parsing.py | 57 +++ 18 files changed, 649 insertions(+), 46 deletions(-) create mode 100644 .changes/unreleased/Features-20230606-165351.yaml create mode 100644 tests/functional/semantic_models/test_semantic_model_parsing.py diff --git a/.changes/unreleased/Features-20230606-165351.yaml b/.changes/unreleased/Features-20230606-165351.yaml new file mode 100644 index 00000000000..a650612840f --- /dev/null +++ b/.changes/unreleased/Features-20230606-165351.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Added support for parsing and serializaing semantic models +time: 2023-06-06T16:53:51.117429-04:00 +custom: + Author: peterallenwebb + Issue: 7499 7503 diff --git a/core/dbt/contracts/files.py b/core/dbt/contracts/files.py index ec98ec6b2b7..f4f23617133 100644 --- a/core/dbt/contracts/files.py +++ b/core/dbt/contracts/files.py @@ -228,6 +228,7 @@ class SchemaSourceFile(BaseSourceFile): groups: List[str] = field(default_factory=list) # node patches contain models, seeds, snapshots, analyses ndp: List[str] = field(default_factory=list) + semantic_nodes: List[str] = field(default_factory=list) # any macro patches in this file by macro unique_id. mcp: Dict[str, str] = field(default_factory=dict) # any source patches in this file. The entries are package, name pairs diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index 48132b0fbcb..a3be197513c 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -25,21 +25,22 @@ from dbt.contracts.publication import ProjectDependencies, PublicationConfig, PublicModel from dbt.contracts.graph.nodes import ( - Macro, + BaseNode, Documentation, - SourceDefinition, - GenericTestNode, Exposure, - Metric, + GenericTestNode, + GraphMemberNode, Group, - UnpatchedSourceDefinition, + Macro, ManifestNode, - GraphMemberNode, - ResultNode, - BaseNode, ManifestOrPublicNode, + Metric, ModelNode, RelationalNode, + ResultNode, + SemanticModel, + SourceDefinition, + UnpatchedSourceDefinition, ) from dbt.contracts.graph.unparsed import SourcePatch, NodeVersion, UnparsedVersion from dbt.contracts.graph.manifest_upgrade import upgrade_manifest_json @@ -706,6 +707,7 @@ class Manifest(MacroMethods, DataClassMessagePackMixin, dbtClassMixin): public_nodes: MutableMapping[str, PublicModel] = field(default_factory=dict) project_dependencies: Optional[ProjectDependencies] = None publications: MutableMapping[str, PublicationConfig] = field(default_factory=dict) + semantic_nodes: MutableMapping[str, SemanticModel] = field(default_factory=dict) _doc_lookup: Optional[DocLookup] = field( default=None, metadata={"serialize": lambda x: None, "deserialize": lambda x: None} @@ -894,7 +896,7 @@ def build_group_map(self): group_map[node.group].append(node.unique_id) self.group_map = group_map - def writable_manifest(self): + def writable_manifest(self) -> "WritableManifest": self.build_parent_and_child_maps() self.build_group_map() return WritableManifest( @@ -912,6 +914,7 @@ def writable_manifest(self): child_map=self.child_map, parent_map=self.parent_map, group_map=self.group_map, + semantic_nodes=self.semantic_nodes, ) def write(self, path): @@ -1246,6 +1249,11 @@ def add_doc(self, source_file: SourceFile, doc: Documentation): self.docs[doc.unique_id] = doc source_file.docs.append(doc.unique_id) + def add_semantic_model(self, source_file: SchemaSourceFile, semantic_model: SemanticModel): + _check_duplicates(semantic_model, self.semantic_nodes) + self.semantic_nodes[semantic_model.unique_id] = semantic_model + source_file.semantic_nodes.append(semantic_model.unique_id) + # end of methods formerly in ParseResult # Provide support for copy.deepcopy() - we just need to avoid the lock! @@ -1345,6 +1353,9 @@ class WritableManifest(ArtifactMixin): public_nodes: Mapping[UniqueID, PublicModel] = field( metadata=dict(description=("The public models used in the dbt project")) ) + semantic_nodes: Mapping[UniqueID, SemanticModel] = field( + metadata=dict(description=("The semantic models defined in the dbt project")) + ) metadata: ManifestMetadata = field( metadata=dict( description="Metadata about the manifest", diff --git a/core/dbt/contracts/graph/manifest_upgrade.py b/core/dbt/contracts/graph/manifest_upgrade.py index a3c299e8a25..7db051f7e4c 100644 --- a/core/dbt/contracts/graph/manifest_upgrade.py +++ b/core/dbt/contracts/graph/manifest_upgrade.py @@ -127,4 +127,6 @@ def upgrade_manifest_json(manifest: dict) -> dict: if "root_path" in doc_content: del doc_content["root_path"] doc_content["resource_type"] = "doc" + if "semantic_nodes" not in manifest: + manifest["semantic_nodes"] = {} return manifest diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index a3b988f35ff..f34c12359e3 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -6,29 +6,23 @@ import hashlib from mashumaro.types import SerializableType -from typing import ( - Optional, - Union, - List, - Dict, - Any, - Sequence, - Tuple, - Iterator, -) +from typing import Optional, Union, List, Dict, Any, Sequence, Tuple, Iterator, Protocol from dbt.dataclass_schema import dbtClassMixin, ExtensibleDbtClassMixin from dbt.clients.system import write_file from dbt.contracts.files import FileHash from dbt.contracts.graph.unparsed import ( + Dimension, Docs, + Entity, ExposureType, ExternalTable, FreshnessThreshold, HasYamlMetadata, MacroArgument, MaturityType, + Measure, MetricFilter, MetricTime, Owner, @@ -62,12 +56,6 @@ EmptySnapshotConfig, SnapshotConfig, ) -import sys - -if sys.version_info >= (3, 8): - from typing import Protocol -else: - from typing_extensions import Protocol # ===================================================================== @@ -564,6 +552,30 @@ def depends_on_macros(self): return self.depends_on.macros +@dataclass +class FileSlice(dbtClassMixin, Replaceable): + """Provides file slice level context about what something was created from. + + Implementation of the dbt-semantic-interfaces `FileSlice` protocol + """ + + filename: str + content: str + start_line_number: int + end_line_number: int + + +@dataclass +class SourceFileMetadata(dbtClassMixin, Replaceable): + """Provides file context about what something was created from. + + Implementation of the dbt-semantic-interfaces `Metadata` protocol + """ + + repo_file_path: str + file_slice: FileSlice + + # ==================================== # CompiledNode subclasses # ==================================== @@ -1411,6 +1423,28 @@ class Group(BaseNode): resource_type: NodeType = field(metadata={"restrict": [NodeType.Group]}) +# ==================================== +# SemanticModel and related classes +# ==================================== + + +@dataclass +class NodeRelation(dbtClassMixin): + alias: str + schema_name: str # TODO: Could this be called simply "schema" so we could reuse StateRelation? + database: Optional[str] = None + + +@dataclass +class SemanticModel(GraphNode): + description: Optional[str] + model: str + node_relation: Optional[NodeRelation] + entities: Sequence[Entity] + measures: Sequence[Measure] + dimensions: Sequence[Dimension] + + # ==================================== # Patches # ==================================== diff --git a/core/dbt/contracts/graph/unparsed.py b/core/dbt/contracts/graph/unparsed.py index 4730b094dfa..14a0585a3bd 100644 --- a/core/dbt/contracts/graph/unparsed.py +++ b/core/dbt/contracts/graph/unparsed.py @@ -661,6 +661,60 @@ def validate(cls, data): raise ValidationError("Group owner must have at least one of 'name' or 'email'.") +# +# semantic interfaces unparsed objects +# + + +@dataclass +class Entity(dbtClassMixin): + name: str + type: str # actually an enum + description: Optional[str] = None + role: Optional[str] = None + expr: Optional[str] = None + + +@dataclass +class MeasureAggregationParameters(dbtClassMixin): + percentile: Optional[float] = None + use_discrete_percentile: bool = False + use_approximate_percentile: bool = False + + +@dataclass +class Measure(dbtClassMixin): + name: str + agg: str # actually an enum + description: Optional[str] = None + create_metric: Optional[bool] = None + expr: Optional[str] = None + agg_params: Optional[MeasureAggregationParameters] = None + non_additive_dimension: Optional[Dict[str, Any]] = None + agg_time_dimension: Optional[str] = None + + +@dataclass +class Dimension(dbtClassMixin): + name: str + type: str # actually an enum + description: Optional[str] = None + is_partition: Optional[bool] = False + type_params: Optional[Dict[str, Any]] = None + expr: Optional[str] = None + # TODO metadata: Optional[Metadata] (this would actually be the YML for the dimension) + + +@dataclass +class UnparsedSemanticModel(dbtClassMixin): + name: str + description: Optional[str] + model: str # looks like "ref(...)" + entities: List[Entity] = field(default_factory=list) + measures: List[Measure] = field(default_factory=list) + dimensions: List[Dimension] = field(default_factory=list) + + def normalize_date(d: Optional[datetime.date]) -> Optional[datetime.datetime]: """Convert date to datetime (at midnight), and add local time zone if naive""" if d is None: diff --git a/core/dbt/node_types.py b/core/dbt/node_types.py index 1312d7ace3e..5a98cb95be1 100644 --- a/core/dbt/node_types.py +++ b/core/dbt/node_types.py @@ -33,6 +33,7 @@ class NodeType(StrEnum): Exposure = "exposure" Metric = "metric" Group = "group" + SemanticModel = "semantic model" @classmethod def executable(cls) -> List["NodeType"]: diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index 76fa9191d2c..f9c4b576373 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -57,6 +57,7 @@ DeprecatedReference, UpcomingReferenceDeprecation, ) +from dbt_extractor import py_extract_from_source # type: ignore from dbt.logger import DbtProcessState from dbt.node_types import NodeType, AccessType from dbt.clients.jinja import get_rendered, MacroStack @@ -99,6 +100,7 @@ ManifestNode, ResultNode, ModelNode, + NodeRelation, ) from dbt.contracts.graph.unparsed import NodeVersion from dbt.contracts.util import Writable @@ -529,6 +531,7 @@ def load(self): self.process_refs(self.root_project.project_name) self.process_docs(self.root_project) self.process_metrics(self.root_project) + self.process_semantic_models() self.check_valid_group_config() self.check_valid_access_property() @@ -1180,6 +1183,28 @@ def process_metrics(self, config: RuntimeConfig): continue _process_metrics_for_node(self.manifest, current_project, exposure) + def process_semantic_models(self) -> None: + for semantic_model in self.manifest.semantic_nodes.values(): + if semantic_model.model: + statically_parsed = py_extract_from_source(f"{{{{ {semantic_model.model} }}}}") + if statically_parsed["refs"]: + + ref = statically_parsed["refs"][0] + if len(ref) == 2: + input_package_name, input_model_name = ref + else: + input_package_name, input_model_name = None, ref[0] + + refd_node = self.manifest.ref_lookup.find( + input_model_name, input_package_name, None, self.manifest + ) + if isinstance(refd_node, ModelNode): + semantic_model.node_relation = NodeRelation( + alias=refd_node.alias, + schema_name=refd_node.schema, + database=refd_node.database, + ) + # nodes: node and column descriptions # sources: source and table descriptions, column descriptions # macros: macro argument descriptions diff --git a/core/dbt/parser/schema_yaml_readers.py b/core/dbt/parser/schema_yaml_readers.py index 4a5863102c1..4ab0545799d 100644 --- a/core/dbt/parser/schema_yaml_readers.py +++ b/core/dbt/parser/schema_yaml_readers.py @@ -1,8 +1,13 @@ from dbt.parser.schemas import YamlReader, SchemaParser from dbt.parser.common import YamlBlock from dbt.node_types import NodeType -from dbt.contracts.graph.unparsed import UnparsedExposure, UnparsedMetric, UnparsedGroup -from dbt.contracts.graph.nodes import Exposure, Metric, Group +from dbt.contracts.graph.unparsed import ( + UnparsedExposure, + UnparsedGroup, + UnparsedMetric, + UnparsedSemanticModel, +) +from dbt.contracts.graph.nodes import Exposure, Group, Metric, SemanticModel from dbt.exceptions import DbtInternalError, YamlParseDictError, JSONValidationError from dbt.context.providers import generate_parse_exposure, generate_parse_metrics from dbt.contracts.graph.model_config import MetricConfig, ExposureConfig @@ -269,3 +274,46 @@ def parse(self): raise YamlParseDictError(self.yaml.path, self.key, data, exc) self.parse_group(unparsed) + + +class SemanticModelParser(YamlReader): + def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): + super().__init__(schema_parser, yaml, "semantic_models") + self.schema_parser = schema_parser + self.yaml = yaml + + def parse_semantic_model(self, unparsed: UnparsedSemanticModel): + package_name = self.project.project_name + unique_id = f"{NodeType.SemanticModel}.{package_name}.{unparsed.name}" + path = self.yaml.path.relative_path + + fqn = self.schema_parser.get_fqn_prefix(path) + fqn.append(unparsed.name) + + parsed = SemanticModel( + description=unparsed.description, + fqn=fqn, + model=unparsed.model, + name=unparsed.name, + node_relation=None, # Resolved from the value of "model" after parsing + original_file_path=self.yaml.path.original_file_path, + package_name=package_name, + path=path, + resource_type=NodeType.SemanticModel, + unique_id=unique_id, + entities=unparsed.entities, + measures=unparsed.measures, + dimensions=unparsed.dimensions, + ) + + self.manifest.add_semantic_model(self.yaml.file, parsed) + + def parse(self): + for data in self.get_key_dicts(): + try: + UnparsedSemanticModel.validate(data) + unparsed = UnparsedSemanticModel.from_dict(data) + except (ValidationError, JSONValidationError) as exc: + raise YamlParseDictError(self.yaml.path, self.key, data, exc) + + self.parse_semantic_model(unparsed) diff --git a/core/dbt/parser/schemas.py b/core/dbt/parser/schemas.py index da2cf22b4f8..adf29b2a091 100644 --- a/core/dbt/parser/schemas.py +++ b/core/dbt/parser/schemas.py @@ -75,6 +75,7 @@ "analyses", "exposures", "metrics", + "semantic_models", ) @@ -218,6 +219,12 @@ def parse_file(self, block: FileBlock, dct: Dict = None) -> None: group_parser = GroupParser(self, yaml_block) group_parser.parse() + if "semantic_models" in dct: + from dbt.parser.schema_yaml_readers import SemanticModelParser + + semantic_model_parser = SemanticModelParser(self, yaml_block) + semantic_model_parser.parse() + Parsed = TypeVar("Parsed", UnpatchedSourceDefinition, ParsedNodePatch, ParsedMacroPatch) NodeTarget = TypeVar("NodeTarget", UnparsedNodeUpdate, UnparsedAnalysisUpdate, UnparsedModelUpdate) diff --git a/core/setup.py b/core/setup.py index 0c4167998de..2eeb0d1389b 100644 --- a/core/setup.py +++ b/core/setup.py @@ -70,6 +70,7 @@ "cffi>=1.9,<2.0.0", "pyyaml>=5.3", "urllib3~=1.0", + "dbt-semantic-interfaces==0.1.0.dev3", ], zip_safe=False, classifiers=[ diff --git a/schemas/dbt/manifest/v10.json b/schemas/dbt/manifest/v10.json index 3b6773d66a6..c7e3863f3c4 100644 --- a/schemas/dbt/manifest/v10.json +++ b/schemas/dbt/manifest/v10.json @@ -10,7 +10,8 @@ "metrics", "groups", "selectors", - "public_nodes" + "public_nodes", + "semantic_nodes" ], "properties": { "metadata": { @@ -209,10 +210,17 @@ "$ref": "#/definitions/PublicModel" }, "description": "The public models used in the dbt project" + }, + "semantic_nodes": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/SemanticModel" + }, + "description": "The semantic models defined in the dbt project" } }, "additionalProperties": false, - "description": "WritableManifest(metadata: dbt.contracts.graph.manifest.ManifestMetadata, nodes: Mapping[str, Union[dbt.contracts.graph.nodes.AnalysisNode, dbt.contracts.graph.nodes.SingularTestNode, dbt.contracts.graph.nodes.HookNode, dbt.contracts.graph.nodes.ModelNode, dbt.contracts.graph.nodes.RPCNode, dbt.contracts.graph.nodes.SqlNode, dbt.contracts.graph.nodes.GenericTestNode, dbt.contracts.graph.nodes.SnapshotNode, dbt.contracts.graph.nodes.SeedNode]], sources: Mapping[str, dbt.contracts.graph.nodes.SourceDefinition], macros: Mapping[str, dbt.contracts.graph.nodes.Macro], docs: Mapping[str, dbt.contracts.graph.nodes.Documentation], exposures: Mapping[str, dbt.contracts.graph.nodes.Exposure], metrics: Mapping[str, dbt.contracts.graph.nodes.Metric], groups: Mapping[str, dbt.contracts.graph.nodes.Group], selectors: Mapping[str, Any], disabled: Optional[Mapping[str, List[Union[dbt.contracts.graph.nodes.AnalysisNode, dbt.contracts.graph.nodes.SingularTestNode, dbt.contracts.graph.nodes.HookNode, dbt.contracts.graph.nodes.ModelNode, dbt.contracts.graph.nodes.RPCNode, dbt.contracts.graph.nodes.SqlNode, dbt.contracts.graph.nodes.GenericTestNode, dbt.contracts.graph.nodes.SnapshotNode, dbt.contracts.graph.nodes.SeedNode, dbt.contracts.graph.nodes.SourceDefinition, dbt.contracts.graph.nodes.Exposure, dbt.contracts.graph.nodes.Metric]]]], parent_map: Optional[Dict[str, List[str]]], child_map: Optional[Dict[str, List[str]]], group_map: Optional[Dict[str, List[str]]], public_nodes: Mapping[str, dbt.contracts.publication.PublicModel])", + "description": "WritableManifest(metadata: dbt.contracts.graph.manifest.ManifestMetadata, nodes: Mapping[str, Union[dbt.contracts.graph.nodes.AnalysisNode, dbt.contracts.graph.nodes.SingularTestNode, dbt.contracts.graph.nodes.HookNode, dbt.contracts.graph.nodes.ModelNode, dbt.contracts.graph.nodes.RPCNode, dbt.contracts.graph.nodes.SqlNode, dbt.contracts.graph.nodes.GenericTestNode, dbt.contracts.graph.nodes.SnapshotNode, dbt.contracts.graph.nodes.SeedNode]], sources: Mapping[str, dbt.contracts.graph.nodes.SourceDefinition], macros: Mapping[str, dbt.contracts.graph.nodes.Macro], docs: Mapping[str, dbt.contracts.graph.nodes.Documentation], exposures: Mapping[str, dbt.contracts.graph.nodes.Exposure], metrics: Mapping[str, dbt.contracts.graph.nodes.Metric], groups: Mapping[str, dbt.contracts.graph.nodes.Group], selectors: Mapping[str, Any], disabled: Optional[Mapping[str, List[Union[dbt.contracts.graph.nodes.AnalysisNode, dbt.contracts.graph.nodes.SingularTestNode, dbt.contracts.graph.nodes.HookNode, dbt.contracts.graph.nodes.ModelNode, dbt.contracts.graph.nodes.RPCNode, dbt.contracts.graph.nodes.SqlNode, dbt.contracts.graph.nodes.GenericTestNode, dbt.contracts.graph.nodes.SnapshotNode, dbt.contracts.graph.nodes.SeedNode, dbt.contracts.graph.nodes.SourceDefinition, dbt.contracts.graph.nodes.Exposure, dbt.contracts.graph.nodes.Metric]]]], parent_map: Optional[Dict[str, List[str]]], child_map: Optional[Dict[str, List[str]]], group_map: Optional[Dict[str, List[str]]], public_nodes: Mapping[str, dbt.contracts.publication.PublicModel], semantic_nodes: Mapping[str, dbt.contracts.graph.nodes.SemanticModel])", "definitions": { "ManifestMetadata": { "type": "object", @@ -229,7 +237,7 @@ "generated_at": { "type": "string", "format": "date-time", - "default": "2023-06-01T17:10:44.803525Z" + "default": "2023-06-07T22:58:05.223879Z" }, "invocation_id": { "oneOf": [ @@ -240,7 +248,7 @@ "type": "null" } ], - "default": "2cd4fe5a-501b-422f-a628-80b34230967b" + "default": "468b0d14-2c98-40b2-ae17-fc3ab0257c34" }, "env": { "type": "object", @@ -470,7 +478,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.805417 + "default": 1686178685.225652 }, "config_call_dict": { "type": "object", @@ -1182,7 +1190,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.807345 + "default": 1686178685.226929 }, "config_call_dict": { "type": "object", @@ -1570,7 +1578,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.807956 + "default": 1686178685.2275221 }, "config_call_dict": { "type": "object", @@ -1846,7 +1854,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.8085592 + "default": 1686178685.228151 }, "config_call_dict": { "type": "object", @@ -2258,7 +2266,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.809459 + "default": 1686178685.229036 }, "config_call_dict": { "type": "object", @@ -2524,7 +2532,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.810038 + "default": 1686178685.2295911 }, "config_call_dict": { "type": "object", @@ -2783,7 +2791,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.810735 + "default": 1686178685.2302458 }, "config_call_dict": { "type": "object", @@ -3079,7 +3087,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.8118432 + "default": 1686178685.231343 }, "config_call_dict": { "type": "object", @@ -3577,7 +3585,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.812869 + "default": 1686178685.232364 }, "config_call_dict": { "type": "object", @@ -3989,7 +3997,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.814112 + "default": 1686178685.2336159 } }, "additionalProperties": false, @@ -4301,7 +4309,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.814394 + "default": 1686178685.2339032 }, "supported_languages": { "oneOf": [ @@ -4542,7 +4550,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.815081 + "default": 1686178685.234565 } }, "additionalProperties": false, @@ -4763,7 +4771,7 @@ }, "created_at": { "type": "number", - "default": 1685639444.8157508 + "default": 1686178685.23521 }, "group": { "oneOf": [ @@ -4983,7 +4991,7 @@ "generated_at": { "type": "string", "format": "date-time", - "default": "2023-06-01T17:10:44.816336Z" + "default": "2023-06-07T22:58:05.235799Z" }, "deprecation_date": { "oneOf": [ @@ -4999,6 +5007,343 @@ }, "additionalProperties": false, "description": "Used to represent cross-project models" + }, + "SemanticModel": { + "type": "object", + "required": [ + "name", + "resource_type", + "package_name", + "path", + "original_file_path", + "unique_id", + "fqn", + "model", + "entities", + "measures", + "dimensions" + ], + "properties": { + "name": { + "type": "string" + }, + "resource_type": { + "type": "string", + "enum": [ + "model", + "analysis", + "test", + "snapshot", + "operation", + "seed", + "rpc", + "sql operation", + "doc", + "source", + "macro", + "exposure", + "metric", + "group", + "semantic model" + ] + }, + "package_name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "original_file_path": { + "type": "string" + }, + "unique_id": { + "type": "string" + }, + "fqn": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "model": { + "type": "string" + }, + "node_relation": { + "oneOf": [ + { + "$ref": "#/definitions/NodeRelation" + }, + { + "type": "null" + } + ] + }, + "entities": { + "type": "array", + "items": { + "$ref": "#/definitions/Entity" + } + }, + "measures": { + "type": "array", + "items": { + "$ref": "#/definitions/Measure" + } + }, + "dimensions": { + "type": "array", + "items": { + "$ref": "#/definitions/Dimension" + } + } + }, + "additionalProperties": false, + "description": "SemanticModel(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], description: Optional[str], model: str, node_relation: Optional[dbt.contracts.graph.nodes.NodeRelation], entities: Sequence[dbt.contracts.graph.unparsed.Entity], measures: Sequence[dbt.contracts.graph.unparsed.Measure], dimensions: Sequence[dbt.contracts.graph.unparsed.Dimension])" + }, + "NodeRelation": { + "type": "object", + "required": [ + "alias", + "schema_name" + ], + "properties": { + "alias": { + "type": "string" + }, + "schema_name": { + "type": "string" + }, + "database": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "description": "NodeRelation(alias: str, schema_name: str, database: Optional[str] = None)" + }, + "Entity": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "description": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "role": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "expr": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "description": "Entity(name: str, type: str, description: Optional[str] = None, role: Optional[str] = None, expr: Optional[str] = None)" + }, + "Measure": { + "type": "object", + "required": [ + "name", + "agg" + ], + "properties": { + "name": { + "type": "string" + }, + "agg": { + "type": "string" + }, + "description": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "create_metric": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "expr": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "agg_params": { + "oneOf": [ + { + "$ref": "#/definitions/MeasureAggregationParameters" + }, + { + "type": "null" + } + ] + }, + "non_additive_dimension": { + "oneOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ] + }, + "agg_time_dimension": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "description": "Measure(name: str, agg: str, description: Optional[str] = None, create_metric: Optional[bool] = None, expr: Optional[str] = None, agg_params: Optional[dbt.contracts.graph.unparsed.MeasureAggregationParameters] = None, non_additive_dimension: Optional[Dict[str, Any]] = None, agg_time_dimension: Optional[str] = None)" + }, + "MeasureAggregationParameters": { + "type": "object", + "required": [], + "properties": { + "percentile": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "use_discrete_percentile": { + "type": "boolean", + "default": false + }, + "use_approximate_percentile": { + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "description": "MeasureAggregationParameters(percentile: Optional[float] = None, use_discrete_percentile: bool = False, use_approximate_percentile: bool = False)" + }, + "Dimension": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "description": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_partition": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": false + }, + "type_params": { + "oneOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ] + }, + "expr": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "description": "Dimension(name: str, type: str, description: Optional[str] = None, is_partition: Optional[bool] = False, type_params: Optional[Dict[str, Any]] = None, expr: Optional[str] = None)" } }, "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/test/unit/test_manifest.py b/test/unit/test_manifest.py index 781d0a21a70..e7de7ba248a 100644 --- a/test/unit/test_manifest.py +++ b/test/unit/test_manifest.py @@ -370,6 +370,7 @@ def test_no_nodes(self): metrics={}, selectors={}, metadata=ManifestMetadata(generated_at=datetime.utcnow()), + semantic_nodes={}, ) invocation_id = dbt.events.functions.EVENT_MANAGER.invocation_id @@ -396,6 +397,7 @@ def test_no_nodes(self): "docs": {}, "disabled": {}, "public_nodes": {}, + "semantic_nodes": {}, }, ) @@ -535,6 +537,7 @@ def test_no_nodes_with_metadata(self, mock_user): metadata=metadata, files={}, exposures={}, + semantic_nodes={}, ) self.assertEqual( @@ -564,6 +567,7 @@ def test_no_nodes_with_metadata(self, mock_user): }, "disabled": {}, "public_nodes": {}, + "semantic_nodes": {}, }, ) @@ -911,6 +915,7 @@ def test_no_nodes(self): metadata=metadata, files={}, exposures={}, + semantic_nodes={}, ) self.assertEqual( manifest.writable_manifest().to_dict(omit_none=True), @@ -935,6 +940,7 @@ def test_no_nodes(self): "docs": {}, "disabled": {}, "public_nodes": {}, + "semantic_nodes": {}, }, ) diff --git a/test/unit/test_node_types.py b/test/unit/test_node_types.py index 5ea4a810833..f56e57b27da 100644 --- a/test/unit/test_node_types.py +++ b/test/unit/test_node_types.py @@ -16,6 +16,7 @@ NodeType.Exposure: "exposures", NodeType.Metric: "metrics", NodeType.Group: "groups", + NodeType.SemanticModel: "semantic models", } diff --git a/tests/functional/artifacts/expected_manifest.py b/tests/functional/artifacts/expected_manifest.py index ae4967ea752..7382f520363 100644 --- a/tests/functional/artifacts/expected_manifest.py +++ b/tests/functional/artifacts/expected_manifest.py @@ -893,6 +893,7 @@ def expected_seeded_manifest(project, model_database=None, quote_model=False): }, "disabled": {}, "public_nodes": {}, + "semantic_nodes": {}, } @@ -1456,6 +1457,7 @@ def expected_references_manifest(project): ], } }, + "semantic_nodes": {}, } @@ -1940,4 +1942,5 @@ def expected_versions_manifest(project): "disabled": {}, "macros": {}, "public_nodes": {}, + "semantic_nodes": {}, } diff --git a/tests/functional/artifacts/test_artifacts.py b/tests/functional/artifacts/test_artifacts.py index df272f3a2f7..bd8c9742420 100644 --- a/tests/functional/artifacts/test_artifacts.py +++ b/tests/functional/artifacts/test_artifacts.py @@ -469,6 +469,7 @@ def verify_manifest(project, expected_manifest, start_time, manifest_schema_path "exposures", "selectors", "public_nodes", + "semantic_nodes", } assert set(manifest.keys()) == manifest_keys diff --git a/tests/functional/artifacts/test_previous_version_state.py b/tests/functional/artifacts/test_previous_version_state.py index 3e428a0a491..f4cc773e233 100644 --- a/tests/functional/artifacts/test_previous_version_state.py +++ b/tests/functional/artifacts/test_previous_version_state.py @@ -283,7 +283,7 @@ def generate_latest_manifest( # The actual test method. Run `dbt list --select state:modified --state ...` # once for each past manifest version. They all have the same content, but different # schema/structure, only some of which are forward-compatible with the - # current WriteableManifest class. + # current WritableManifest class. def compare_previous_state( self, project, diff --git a/tests/functional/semantic_models/test_semantic_model_parsing.py b/tests/functional/semantic_models/test_semantic_model_parsing.py new file mode 100644 index 00000000000..344e58c0f61 --- /dev/null +++ b/tests/functional/semantic_models/test_semantic_model_parsing.py @@ -0,0 +1,57 @@ +import pytest + +from dbt.cli.main import dbtRunner +from dbt.contracts.graph.manifest import Manifest + +schema_yml = """models: + - name: fct_revenue + description: This is the model fct_revenue. It should be able to use doc blocks + +semantic_models: + - name: revenue + description: This is the revenue semantic model. It should be able to use doc blocks + model: ref('fct_revenue') + + measures: + - name: txn_revenue + expr: revenue + agg: sum + + dimensions: + - name: ds + type: time + expr: created_at + type_params: + is_primary: True + time_granularity: day + + entities: + - name: user + type: foreign + expr: user_id +""" + +fct_revenue_sql = """select + 1 as id, + 10 as user_id, + 1000 as revenue, + current_timestamp as created_at""" + + +class TestSemanticModelParsing: + @pytest.fixture(scope="class") + def models(self): + return { + "schema.yml": schema_yml, + "fct_revenue.sql": fct_revenue_sql, + } + + def test_semantic_model_parsing(self, project): + runner = dbtRunner() + result = runner.invoke(["parse"]) + assert result.success + assert isinstance(result.result, Manifest) + manifest = result.result + assert len(manifest.semantic_nodes) == 1 + semantic_model = manifest.semantic_nodes["semantic model.test.revenue"] + assert semantic_model.node_relation.alias == "fct_revenue" From 98d1a94b608adcf0c81b5dcda0f5e5362e0620a8 Mon Sep 17 00:00:00 2001 From: Quigley Malcolm Date: Thu, 8 Jun 2023 10:23:36 -0700 Subject: [PATCH 54/67] Update spec MetricNode for dbt x MetricFlow integration and begin outputting semantic manifest artifact (#7812) * Refactor MetricNode definition to satisfy DSI Metric protocol * Fix tests involving metrics to have updated properties * Update UnparsedMetricNode to match new metric yaml spec * Update MetricParser for new unparsed and parsed MetricNodes * Remove `rename_metric_attr` We're intentionally breaking the spec. There will be a separate tool provided for migrating from dbt-metrics to dbt x metricflow. This bit of code was renaming things like `type` to `calculation_method`. This is problematic because `type` is on the new spec, while `calculation_method` is not. Additionally, since we're intentionally breaking the spec, this function, `rename_metric_attr`, shouldn't be used for any property renaming. * Fix tests for Metrics (1.6) changes * Regenerated v10 manifest schema and associated functional test artifact state * Remove no longer needed tests * Skip / comment out tests for metrics functionality that we'll be implementing later * Begin outputting semantic manifest artifact on every run * Drop metrics during upgrade_manifest_json if manifest is v9 or before * Update properties of `minimal_parsed_metric_dict` to match new metric spec * Add changie entry for metric node breaking changes * Add semantic model nodes to semantic manifest --- .../Breaking Changes-20230607-190309.yaml | 6 + core/dbt/constants.py | 1 + core/dbt/contracts/graph/manifest.py | 22 +- core/dbt/contracts/graph/manifest_upgrade.py | 59 +-- core/dbt/contracts/graph/nodes.py | 138 ++++-- core/dbt/contracts/graph/unparsed.py | 60 +-- core/dbt/parser/manifest.py | 14 +- core/dbt/parser/schema_yaml_readers.py | 182 +++++-- schemas/dbt/manifest/v10.json | 455 +++++++++++++----- test/unit/test_contracts_graph_parsed.py | 30 +- test/unit/test_contracts_graph_unparsed.py | 100 +--- test/unit/test_graph_selector_methods.py | 21 +- test/unit/test_manifest.py | 33 +- .../artifacts/data/state/v10/manifest.json | 2 +- .../artifacts/test_previous_version_state.py | 17 +- .../deprecations/test_deprecations.py | 39 -- .../duplicates/test_duplicate_metric.py | 26 +- tests/functional/exposures/fixtures.py | 10 +- tests/functional/groups/test_access.py | 28 +- tests/functional/metrics/fixtures.py | 326 ++++--------- .../metrics/test_metric_deferral.py | 1 + .../metrics/test_metric_helper_functions.py | 3 + tests/functional/metrics/test_metrics.py | 48 +- tests/functional/partial_parsing/fixtures.py | 116 ++--- .../test_pp_disabled_config.py | 33 +- .../partial_parsing/test_pp_metrics.py | 33 +- 26 files changed, 915 insertions(+), 888 deletions(-) create mode 100644 .changes/unreleased/Breaking Changes-20230607-190309.yaml diff --git a/.changes/unreleased/Breaking Changes-20230607-190309.yaml b/.changes/unreleased/Breaking Changes-20230607-190309.yaml new file mode 100644 index 00000000000..4ca481aab08 --- /dev/null +++ b/.changes/unreleased/Breaking Changes-20230607-190309.yaml @@ -0,0 +1,6 @@ +kind: Breaking Changes +body: Switch from dbt-metrics to dbt-semantic-interfaces for MetricNode definitions +time: 2023-06-07T19:03:09.680189-07:00 +custom: + Author: QMalcolm + Issue: 7500 7404 diff --git a/core/dbt/constants.py b/core/dbt/constants.py index 09288e1d7b2..5c7af2f0b39 100644 --- a/core/dbt/constants.py +++ b/core/dbt/constants.py @@ -11,4 +11,5 @@ DEPENDENCIES_FILE_NAME = "dependencies.yml" MANIFEST_FILE_NAME = "manifest.json" +SEMANTIC_MANIFEST_FILE_NAME = "semantic_manifest.json" PARTIAL_PARSE_FILE_NAME = "partial_parse.msgpack" diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index a3be197513c..617a7cf63f8 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -62,6 +62,9 @@ from dbt.flags import get_flags, MP_CONTEXT from dbt import tracking import dbt.utils +from dbt_semantic_interfaces.implementations.metric import PydanticMetric +from dbt_semantic_interfaces.implementations.semantic_manifest import PydanticSemanticManifest +from dbt_semantic_interfaces.implementations.semantic_model import PydanticSemanticModel NodeEdgeMap = Dict[str, List[str]] PackageName = str @@ -985,6 +988,20 @@ def analysis_lookup(self) -> AnalysisLookup: self._analysis_lookup = AnalysisLookup(self) return self._analysis_lookup + @property + def pydantic_semantic_manifest(self) -> PydanticSemanticManifest: + pydantic_semantic_manifest = PydanticSemanticManifest(metrics=[], semantic_models=[]) + + for semantic_model in self.semantic_nodes.values(): + pydantic_semantic_manifest.semantic_models.append( + PydanticSemanticModel.parse_obj(semantic_model.to_dict()) + ) + + for metric in self.metrics.values(): + pydantic_semantic_manifest.metrics.append(PydanticMetric.parse_obj(metric.to_dict())) + + return pydantic_semantic_manifest + def resolve_refs( self, source_node: GraphMemberNode, current_project: str ) -> List[MaybeNonSource]: @@ -1377,8 +1394,9 @@ def compatible_previous_versions(self): def upgrade_schema_version(cls, data): """This overrides the "upgrade_schema_version" call in VersionedSchema (via ArtifactMixin) to modify the dictionary passed in from earlier versions of the manifest.""" - if get_manifest_schema_version(data) <= 9: - data = upgrade_manifest_json(data) + manifest_schema_version = get_manifest_schema_version(data) + if manifest_schema_version <= 9: + data = upgrade_manifest_json(data, manifest_schema_version) return cls.from_dict(data) def __post_serialize__(self, dct): diff --git a/core/dbt/contracts/graph/manifest_upgrade.py b/core/dbt/contracts/graph/manifest_upgrade.py index 7db051f7e4c..b9769a9e4ed 100644 --- a/core/dbt/contracts/graph/manifest_upgrade.py +++ b/core/dbt/contracts/graph/manifest_upgrade.py @@ -1,42 +1,3 @@ -from dbt import deprecations -from dbt.dataclass_schema import ValidationError - - -# we renamed these properties in v1.3 -# this method allows us to be nice to the early adopters -def rename_metric_attr(data: dict, raise_deprecation_warning: bool = False) -> dict: - metric_name = data["name"] - if raise_deprecation_warning and ( - "sql" in data.keys() - or "type" in data.keys() - or data.get("calculation_method") == "expression" - ): - deprecations.warn("metric-attr-renamed", metric_name=metric_name) - duplicated_attribute_msg = """\n -The metric '{}' contains both the deprecated metric property '{}' -and the up-to-date metric property '{}'. Please remove the deprecated property. -""" - if "sql" in data.keys(): - if "expression" in data.keys(): - raise ValidationError( - duplicated_attribute_msg.format(metric_name, "sql", "expression") - ) - else: - data["expression"] = data.pop("sql") - if "type" in data.keys(): - if "calculation_method" in data.keys(): - raise ValidationError( - duplicated_attribute_msg.format(metric_name, "type", "calculation_method") - ) - else: - calculation_method = data.pop("type") - data["calculation_method"] = calculation_method - # we also changed "type: expression" -> "calculation_method: derived" - if data.get("calculation_method") == "expression": - data["calculation_method"] = "derived" - return data - - def rename_sql_attr(node_content: dict) -> dict: if "raw_sql" in node_content: node_content["raw_code"] = node_content.pop("raw_sql") @@ -88,7 +49,24 @@ def upgrade_seed_content(node_content): node_content.get("depends_on", {}).pop("nodes", None) -def upgrade_manifest_json(manifest: dict) -> dict: +def drop_v9_and_prior_metrics(manifest: dict) -> None: + manifest["metrics"] = {} + filtered_disabled_entries = {} + for entry_name, resource_list in manifest.get("disabled", {}).items(): + filtered_resource_list = [] + for resource in resource_list: + if resource.get("resource_type") != "metric": + filtered_resource_list.append(resource) + filtered_disabled_entries[entry_name] = filtered_resource_list + + manifest["disabled"] = filtered_disabled_entries + + +def upgrade_manifest_json(manifest: dict, manifest_schema_version: int) -> dict: + # this should remain 9 while the check in `upgrade_schema_version` may change + if manifest_schema_version <= 9: + drop_v9_and_prior_metrics(manifest=manifest) + for node_content in manifest.get("nodes", {}).values(): upgrade_node_content(node_content) if node_content["resource_type"] == "seed": @@ -109,7 +87,6 @@ def upgrade_manifest_json(manifest: dict) -> dict: manifest["public_nodes"] = {} for metric_content in manifest.get("metrics", {}).values(): # handle attr renames + value translation ("expression" -> "derived") - metric_content = rename_metric_attr(metric_content) metric_content = upgrade_ref_content(metric_content) if "root_path" in metric_content: del metric_content["root_path"] diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index f34c12359e3..5f3513fbda3 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -23,8 +23,6 @@ MacroArgument, MaturityType, Measure, - MetricFilter, - MetricTime, Owner, Quoting, TestDef, @@ -45,6 +43,10 @@ from dbt.events.contextvars import set_contextvars from dbt.flags import get_flags from dbt.node_types import ModelLanguage, NodeType, AccessType +from dbt_semantic_interfaces.references import MeasureReference +from dbt_semantic_interfaces.references import MetricReference as DSIMetricReference +from dbt_semantic_interfaces.type_enums.metric_type import MetricType +from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity from .model_config import ( NodeConfig, @@ -1309,10 +1311,64 @@ def same_contents(self, old: Optional["Exposure"]) -> bool: # ==================================== +@dataclass +class WhereFilter(dbtClassMixin): + where_sql_template: str + + +@dataclass +class MetricInputMeasure(dbtClassMixin): + name: str + filter: Optional[WhereFilter] = None + alias: Optional[str] = None + + def measure_reference(self) -> MeasureReference: + return MeasureReference(element_name=self.name) + + def post_aggregation_measure_referenc(self) -> MeasureReference: + return MeasureReference(element_name=self.alias or self.name) + + +@dataclass +class MetricTimeWindow(dbtClassMixin): + count: int + granularity: TimeGranularity + + +@dataclass +class MetricInput(dbtClassMixin): + name: str + filter: Optional[WhereFilter] = None + alias: Optional[str] = None + offset_window: Optional[MetricTimeWindow] = None + offset_to_grain: Optional[TimeGranularity] = None + + def as_reference(self) -> DSIMetricReference: + return DSIMetricReference(element_name=self.name) + + +@dataclass +class MetricTypeParams(dbtClassMixin): + measure: Optional[MetricInputMeasure] = None + measures: Optional[List[MetricInputMeasure]] = None + numerator: Optional[MetricInputMeasure] = None + denominator: Optional[MetricInputMeasure] = None + expr: Optional[str] = None + window: Optional[MetricTimeWindow] = None + grain_to_date: Optional[TimeGranularity] = None + metrics: Optional[List[MetricInput]] = None + + def numerator_measure_reference(self) -> Optional[MeasureReference]: + return self.numerator.measure_reference() if self.numerator else None + + def denominator_measure_reference(self) -> Optional[MeasureReference]: + return self.denominator.measure_reference() if self.denominator else None + + @dataclass class MetricReference(dbtClassMixin, Replaceable): - sql: Optional[Union[str, int]] - unique_id: Optional[str] + sql: Optional[Union[str, int]] = None + unique_id: Optional[str] = None @dataclass @@ -1320,16 +1376,11 @@ class Metric(GraphNode): name: str description: str label: str - calculation_method: str - expression: str - filters: List[MetricFilter] - time_grains: List[str] - dimensions: List[str] + type: MetricType + type_params: MetricTypeParams + filter: Optional[WhereFilter] = None + metadata: Optional[SourceFileMetadata] = None resource_type: NodeType = field(metadata={"restrict": [NodeType.Metric]}) - timestamp: Optional[str] = None - window: Optional[MetricTime] = None - model: Optional[str] = None - model_unique_id: Optional[str] = None meta: Dict[str, Any] = field(default_factory=dict) tags: List[str] = field(default_factory=list) config: MetricConfig = field(default_factory=MetricConfig) @@ -1353,17 +1404,26 @@ def depends_on_public_nodes(self): def search_name(self): return self.name - def same_model(self, old: "Metric") -> bool: - return self.model == old.model + @property + def input_measures(self) -> List[MetricInputMeasure]: + tp = self.type_params + res = tp.measures or [] + if tp.measure: + res.append(tp.measure) + if tp.numerator: + res.append(tp.numerator) + if tp.denominator: + res.append(tp.denominator) - def same_window(self, old: "Metric") -> bool: - return self.window == old.window + return res - def same_dimensions(self, old: "Metric") -> bool: - return self.dimensions == old.dimensions + @property + def measure_references(self) -> List[MeasureReference]: + return [x.measure_reference() for x in self.input_measures] - def same_filters(self, old: "Metric") -> bool: - return self.filters == old.filters + @property + def input_metrics(self) -> List[MetricInput]: + return self.type_params.metrics or [] def same_description(self, old: "Metric") -> bool: return self.description == old.description @@ -1371,24 +1431,24 @@ def same_description(self, old: "Metric") -> bool: def same_label(self, old: "Metric") -> bool: return self.label == old.label - def same_calculation_method(self, old: "Metric") -> bool: - return self.calculation_method == old.calculation_method - - def same_expression(self, old: "Metric") -> bool: - return self.expression == old.expression - - def same_timestamp(self, old: "Metric") -> bool: - return self.timestamp == old.timestamp - - def same_time_grains(self, old: "Metric") -> bool: - return self.time_grains == old.time_grains - def same_config(self, old: "Metric") -> bool: return self.config.same_contents( self.unrendered_config, old.unrendered_config, ) + def same_filter(self, old: "Metric") -> bool: + return True # TODO + + def same_metadata(self, old: "Metric") -> bool: + return True # TODO + + def same_type(self, old: "Metric") -> bool: + return self.type == old.type + + def same_type_params(self, old: "Metric") -> bool: + return True # TODO + def same_contents(self, old: Optional["Metric"]) -> bool: # existing when it didn't before is a change! # metadata/tags changes are not "changes" @@ -1396,16 +1456,12 @@ def same_contents(self, old: Optional["Metric"]) -> bool: return True return ( - self.same_model(old) - and self.same_window(old) - and self.same_dimensions(old) - and self.same_filters(old) + self.same_filter(old) + and self.same_metadata(old) + and self.same_type(old) + and self.same_type_params(old) and self.same_description(old) and self.same_label(old) - and self.same_calculation_method(old) - and self.same_expression(old) - and self.same_timestamp(old) - and self.same_time_grains(old) and self.same_config(old) and True ) diff --git a/core/dbt/contracts/graph/unparsed.py b/core/dbt/contracts/graph/unparsed.py index 14a0585a3bd..eaa9c75e46a 100644 --- a/core/dbt/contracts/graph/unparsed.py +++ b/core/dbt/contracts/graph/unparsed.py @@ -8,7 +8,6 @@ Mergeable, Replaceable, ) -from dbt.contracts.graph.manifest_upgrade import rename_metric_attr # trigger the PathEncoder import dbt.helper_types # noqa:F401 @@ -594,25 +593,48 @@ def __bool__(self): @dataclass -class UnparsedMetric(dbtClassMixin, Replaceable): +class UnparsedMetricInputMeasure(dbtClassMixin): + name: str + filter: Optional[str] = None + alias: Optional[str] = None + + +@dataclass +class UnparsedMetricInput(dbtClassMixin): + name: str + filter: Optional[str] = None + alias: Optional[str] = None + offset_window: Optional[str] = None + offset_to_grain: Optional[str] = None # str is really a TimeGranularity Enum + + +@dataclass +class UnparsedMetricTypeParams(dbtClassMixin): + measure: Optional[Union[UnparsedMetricInputMeasure, str]] = None + measures: Optional[List[Union[UnparsedMetricInputMeasure, str]]] = None + numerator: Optional[Union[UnparsedMetricInputMeasure, str]] = None + denominator: Optional[Union[UnparsedMetricInputMeasure, str]] = None + expr: Optional[str] = None + window: Optional[str] = None + grain_to_date: Optional[str] = None # str is really a TimeGranularity Enum + metrics: Optional[List[Union[UnparsedMetricInput, str]]] = None + + +@dataclass +class UnparsedMetric(dbtClassMixin): name: str label: str - calculation_method: str - expression: str + type: str + type_params: UnparsedMetricTypeParams description: str = "" - timestamp: Optional[str] = None - time_grains: List[str] = field(default_factory=list) - dimensions: List[str] = field(default_factory=list) - window: Optional[MetricTime] = None - model: Optional[str] = None - filters: List[MetricFilter] = field(default_factory=list) + filter: Optional[str] = None + # metadata: Optional[Unparsedetadata] = None # TODO meta: Dict[str, Any] = field(default_factory=dict) tags: List[str] = field(default_factory=list) config: Dict[str, Any] = field(default_factory=dict) @classmethod def validate(cls, data): - data = rename_metric_attr(data, raise_deprecation_warning=True) super(UnparsedMetric, cls).validate(data) if "name" in data: errors = [] @@ -632,22 +654,6 @@ def validate(cls, data): f"The metric name '{data['name']}' is invalid. It {', '.join(e for e in errors)}" ) - if data.get("timestamp") is None and data.get("time_grains") is not None: - raise ValidationError( - f"The metric '{data['name']} has time_grains defined but is missing a timestamp dimension." - ) - - if data.get("timestamp") is None and data.get("window") is not None: - raise ValidationError( - f"The metric '{data['name']} has a window defined but is missing a timestamp dimension." - ) - - if data.get("model") is None and data.get("calculation_method") != "derived": - raise ValidationError("Non-derived metrics require a 'model' property") - - if data.get("model") is not None and data.get("calculation_method") == "derived": - raise ValidationError("Derived metrics cannot have a 'model' property") - @dataclass class UnparsedGroup(dbtClassMixin, Replaceable): diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index f9c4b576373..1dbf39e01ad 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -34,7 +34,12 @@ get_relation_class_by_name, get_adapter_package_names, ) -from dbt.constants import DEPENDENCIES_FILE_NAME, MANIFEST_FILE_NAME, PARTIAL_PARSE_FILE_NAME +from dbt.constants import ( + DEPENDENCIES_FILE_NAME, + MANIFEST_FILE_NAME, + PARTIAL_PARSE_FILE_NAME, + SEMANTIC_MANIFEST_FILE_NAME, +) from dbt.helper_types import PathSet from dbt.clients.yaml_helper import load_yaml_text from dbt.events.functions import fire_event, get_invocation_id, warn_or_error @@ -1870,6 +1875,13 @@ def log_publication_artifact(root_project: RuntimeConfig, manifest: Manifest): fire_event(PublicationArtifactAvailable(pub_artifact=publication.to_dict())) +def write_semantic_manifest(manifest: Manifest, target_path: str) -> None: + path = os.path.join(target_path, SEMANTIC_MANIFEST_FILE_NAME) + write_file(path, manifest.pydantic_semantic_manifest.json()) + + def write_manifest(manifest: Manifest, target_path: str): path = os.path.join(target_path, MANIFEST_FILE_NAME) manifest.write(path) + + write_semantic_manifest(manifest=manifest, target_path=target_path) diff --git a/core/dbt/parser/schema_yaml_readers.py b/core/dbt/parser/schema_yaml_readers.py index 4ab0545799d..4a343fc9256 100644 --- a/core/dbt/parser/schema_yaml_readers.py +++ b/core/dbt/parser/schema_yaml_readers.py @@ -5,11 +5,24 @@ UnparsedExposure, UnparsedGroup, UnparsedMetric, + UnparsedMetricInput, + UnparsedMetricInputMeasure, + UnparsedMetricTypeParams, UnparsedSemanticModel, ) -from dbt.contracts.graph.nodes import Exposure, Group, Metric, SemanticModel +from dbt.contracts.graph.nodes import ( + Exposure, + Group, + Metric, + MetricInput, + MetricInputMeasure, + MetricTimeWindow, + MetricTypeParams, + SemanticModel, + WhereFilter, +) from dbt.exceptions import DbtInternalError, YamlParseDictError, JSONValidationError -from dbt.context.providers import generate_parse_exposure, generate_parse_metrics +from dbt.context.providers import generate_parse_exposure from dbt.contracts.graph.model_config import MetricConfig, ExposureConfig from dbt.context.context_config import ( BaseContextConfigGenerator, @@ -17,8 +30,10 @@ UnrenderedConfigGenerator, ) from dbt.clients.jinja import get_rendered -from typing import List from dbt.dataclass_schema import ValidationError +from dbt_semantic_interfaces.type_enums.metric_type import MetricType +from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity +from typing import List, Optional, Union class ExposureParser(YamlReader): @@ -130,6 +145,135 @@ def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): self.schema_parser = schema_parser self.yaml = yaml + def _get_input_measure( + self, + unparsed_input_measure: Union[UnparsedMetricInputMeasure, str], + ) -> MetricInputMeasure: + if isinstance(unparsed_input_measure, str): + return MetricInputMeasure(name=unparsed_input_measure) + else: + filter: Optional[WhereFilter] = None + if unparsed_input_measure.filter is not None: + filter = WhereFilter(where_sql_template=unparsed_input_measure.filter) + + return MetricInputMeasure( + name=unparsed_input_measure.name, + filter=filter, + alias=unparsed_input_measure.alias, + ) + + def _get_optional_input_measure( + self, + unparsed_input_measure: Optional[Union[UnparsedMetricInputMeasure, str]], + ) -> Optional[MetricInputMeasure]: + if unparsed_input_measure is not None: + return self._get_input_measure(unparsed_input_measure) + else: + return None + + def _get_input_measures( + self, + unparsed_input_measures: Optional[List[Union[UnparsedMetricInputMeasure, str]]], + ) -> List[MetricInputMeasure]: + input_measures: List[MetricInputMeasure] = [] + if unparsed_input_measures is not None: + for unparsed_input_measure in unparsed_input_measures: + input_measures.append(self._get_input_measure(unparsed_input_measure)) + + return input_measures + + def _get_time_window( + self, + unparsed_window: Optional[str], + ) -> Optional[MetricTimeWindow]: + if unparsed_window is not None: + parts = unparsed_window.split(" ") + if len(parts) != 2: + raise YamlParseDictError( + self.yaml.path, + "window", + {"window": unparsed_window}, + f"Invalid window ({unparsed_window}) in cumulative metric. Should be of the form ` `, " + "e.g., `28 days`", + ) + + granularity = parts[1] + # once we drop python 3.8 this could just be `granularity = parts[0].removesuffix('s') + if granularity.endswith("s"): + # months -> month + granularity = granularity[:-1] + if granularity not in [item.value for item in TimeGranularity]: + raise YamlParseDictError( + self.yaml.path, + "window", + {"window": unparsed_window}, + f"Invalid time granularity {granularity} in cumulative metric window string: ({unparsed_window})", + ) + + count = parts[0] + if not count.isdigit(): + raise YamlParseDictError( + self.yaml.path, + "window", + {"window": unparsed_window}, + f"Invalid count ({count}) in cumulative metric window string: ({unparsed_window})", + ) + + return MetricTimeWindow( + count=int(count), + granularity=TimeGranularity(granularity), + ) + else: + return None + + def _get_metric_inputs( + self, + unparsed_metric_inputs: Optional[List[Union[UnparsedMetricInput, str]]], + ) -> List[MetricInput]: + metric_inputs: List[MetricInput] = [] + if unparsed_metric_inputs is not None: + for unparsed_metric_input in unparsed_metric_inputs: + if isinstance(unparsed_metric_input, str): + metric_inputs.append(MetricInput(name=unparsed_metric_input)) + else: + offset_to_grain: Optional[TimeGranularity] = None + if unparsed_metric_input.offset_to_grain is not None: + offset_to_grain = TimeGranularity(unparsed_metric_input.offset_to_grain) + + filter: Optional[WhereFilter] = None + if unparsed_metric_input.filter is not None: + filter = WhereFilter(where_sql_template=unparsed_metric_input.filter) + + metric_inputs.append( + MetricInput( + name=unparsed_metric_input.name, + filter=filter, + alias=unparsed_metric_input.alias, + offset_window=self._get_time_window( + unparsed_window=unparsed_metric_input.offset_window + ), + offset_to_grain=offset_to_grain, + ) + ) + + return metric_inputs + + def _get_metric_type_params(self, type_params: UnparsedMetricTypeParams) -> MetricTypeParams: + grain_to_date: Optional[TimeGranularity] = None + if type_params.grain_to_date is not None: + grain_to_date = TimeGranularity(type_params.grain_to_date) + + return MetricTypeParams( + measure=self._get_optional_input_measure(type_params.measure), + measures=self._get_input_measures(type_params.measures), + numerator=self._get_optional_input_measure(type_params.numerator), + denominator=self._get_optional_input_measure(type_params.denominator), + expr=type_params.expr, + window=self._get_time_window(type_params.window), + grain_to_date=grain_to_date, + metrics=self._get_metric_inputs(type_params.metrics), + ) + def parse_metric(self, unparsed: UnparsedMetric): package_name = self.project.project_name unique_id = f"{NodeType.Metric}.{package_name}.{unparsed.name}" @@ -159,6 +303,10 @@ def parse_metric(self, unparsed: UnparsedMetric): f"Calculated a {type(config)} for a metric, but expected a MetricConfig" ) + filter: Optional[WhereFilter] = None + if unparsed.filter is not None: + filter = WhereFilter(where_sql_template=unparsed.filter) + parsed = Metric( resource_type=NodeType.Metric, package_name=package_name, @@ -166,17 +314,12 @@ def parse_metric(self, unparsed: UnparsedMetric): original_file_path=self.yaml.path.original_file_path, unique_id=unique_id, fqn=fqn, - model=unparsed.model, name=unparsed.name, description=unparsed.description, label=unparsed.label, - calculation_method=unparsed.calculation_method, - expression=str(unparsed.expression), - timestamp=unparsed.timestamp, - dimensions=unparsed.dimensions, - window=unparsed.window, - time_grains=unparsed.time_grains, - filters=unparsed.filters, + type=MetricType(unparsed.type), + type_params=self._get_metric_type_params(unparsed.type_params), + filter=filter, meta=unparsed.meta, tags=unparsed.tags, config=config, @@ -184,23 +327,6 @@ def parse_metric(self, unparsed: UnparsedMetric): group=config.group, ) - ctx = generate_parse_metrics( - parsed, - self.root_project, - self.schema_parser.manifest, - package_name, - ) - - if parsed.model is not None: - model_ref = "{{ " + parsed.model + " }}" - get_rendered(model_ref, ctx, parsed) - - parsed.expression = get_rendered( - parsed.expression, - ctx, - node=parsed, - ) - # if the metric is disabled we do not want it included in the manifest, only in the disabled dict if parsed.config.enabled: self.manifest.add_metric(self.yaml.file, parsed) diff --git a/schemas/dbt/manifest/v10.json b/schemas/dbt/manifest/v10.json index c7e3863f3c4..b7231d880b4 100644 --- a/schemas/dbt/manifest/v10.json +++ b/schemas/dbt/manifest/v10.json @@ -220,7 +220,7 @@ } }, "additionalProperties": false, - "description": "WritableManifest(metadata: dbt.contracts.graph.manifest.ManifestMetadata, nodes: Mapping[str, Union[dbt.contracts.graph.nodes.AnalysisNode, dbt.contracts.graph.nodes.SingularTestNode, dbt.contracts.graph.nodes.HookNode, dbt.contracts.graph.nodes.ModelNode, dbt.contracts.graph.nodes.RPCNode, dbt.contracts.graph.nodes.SqlNode, dbt.contracts.graph.nodes.GenericTestNode, dbt.contracts.graph.nodes.SnapshotNode, dbt.contracts.graph.nodes.SeedNode]], sources: Mapping[str, dbt.contracts.graph.nodes.SourceDefinition], macros: Mapping[str, dbt.contracts.graph.nodes.Macro], docs: Mapping[str, dbt.contracts.graph.nodes.Documentation], exposures: Mapping[str, dbt.contracts.graph.nodes.Exposure], metrics: Mapping[str, dbt.contracts.graph.nodes.Metric], groups: Mapping[str, dbt.contracts.graph.nodes.Group], selectors: Mapping[str, Any], disabled: Optional[Mapping[str, List[Union[dbt.contracts.graph.nodes.AnalysisNode, dbt.contracts.graph.nodes.SingularTestNode, dbt.contracts.graph.nodes.HookNode, dbt.contracts.graph.nodes.ModelNode, dbt.contracts.graph.nodes.RPCNode, dbt.contracts.graph.nodes.SqlNode, dbt.contracts.graph.nodes.GenericTestNode, dbt.contracts.graph.nodes.SnapshotNode, dbt.contracts.graph.nodes.SeedNode, dbt.contracts.graph.nodes.SourceDefinition, dbt.contracts.graph.nodes.Exposure, dbt.contracts.graph.nodes.Metric]]]], parent_map: Optional[Dict[str, List[str]]], child_map: Optional[Dict[str, List[str]]], group_map: Optional[Dict[str, List[str]]], public_nodes: Mapping[str, dbt.contracts.publication.PublicModel], semantic_nodes: Mapping[str, dbt.contracts.graph.nodes.SemanticModel])", + "description": "WritableManifest(metadata: dbt.contracts.graph.manifest.ManifestMetadata, nodes: Mapping[str, Union[dbt.contracts.graph.nodes.AnalysisNode, dbt.contracts.graph.nodes.SingularTestNode, dbt.contracts.graph.nodes.HookNode, dbt.contracts.graph.nodes.ModelNode, dbt.contracts.graph.nodes.RPCNode, dbt.contracts.graph.nodes.SqlNode, dbt.contracts.graph.nodes.GenericTestNode, dbt.contracts.graph.nodes.SnapshotNode, dbt.contracts.graph.nodes.SeedNode]], sources: Mapping[str, dbt.contracts.graph.nodes.SourceDefinition], macros: Mapping[str, dbt.contracts.graph.nodes.Macro], docs: Mapping[str, dbt.contracts.graph.nodes.Documentation], exposures: Mapping[str, dbt.contracts.graph.nodes.Exposure], metrics: Mapping[str, dbt.contracts.graph.nodes.Metric], groups: Mapping[str, dbt.contracts.graph.nodes.Group], selectors: Mapping[str, Any], disabled: Union[Mapping[str, List[Union[dbt.contracts.graph.nodes.AnalysisNode, dbt.contracts.graph.nodes.SingularTestNode, dbt.contracts.graph.nodes.HookNode, dbt.contracts.graph.nodes.ModelNode, dbt.contracts.graph.nodes.RPCNode, dbt.contracts.graph.nodes.SqlNode, dbt.contracts.graph.nodes.GenericTestNode, dbt.contracts.graph.nodes.SnapshotNode, dbt.contracts.graph.nodes.SeedNode, dbt.contracts.graph.nodes.SourceDefinition, dbt.contracts.graph.nodes.Exposure, dbt.contracts.graph.nodes.Metric]]], NoneType], parent_map: Union[Dict[str, List[str]], NoneType], child_map: Union[Dict[str, List[str]], NoneType], group_map: Union[Dict[str, List[str]], NoneType], public_nodes: Mapping[str, dbt.contracts.publication.PublicModel], semantic_nodes: Mapping[str, dbt.contracts.graph.nodes.SemanticModel])", "definitions": { "ManifestMetadata": { "type": "object", @@ -237,7 +237,7 @@ "generated_at": { "type": "string", "format": "date-time", - "default": "2023-06-07T22:58:05.223879Z" + "default": "2023-06-08T14:09:51.785131Z" }, "invocation_id": { "oneOf": [ @@ -248,7 +248,7 @@ "type": "null" } ], - "default": "468b0d14-2c98-40b2-ae17-fc3ab0257c34" + "default": "ff3ab26d-9f15-4c33-900a-16f30898f745" }, "env": { "type": "object", @@ -396,6 +396,7 @@ "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", + "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": { @@ -478,7 +479,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.225652 + "default": 1686233391.787065 }, "config_call_dict": { "type": "object", @@ -581,7 +582,7 @@ } }, "additionalProperties": false, - "description": "AnalysisNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = )" + "description": "AnalysisNode(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Union[str, NoneType] = None, compiled: bool = False, compiled_code: Union[str, NoneType] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Union[str, NoneType] = None, contract: dbt.contracts.graph.nodes.Contract = )" }, "FileHash": { "type": "object", @@ -743,6 +744,15 @@ ], "default": "ignore" }, + "on_configuration_change": { + "type": "string", + "enum": [ + "apply", + "continue", + "fail" + ], + "default": "apply" + }, "grants": { "type": "object", "default": {} @@ -769,7 +779,7 @@ } }, "additionalProperties": true, - "description": "NodeConfig(_extra: Dict[str, Any] = , enabled: bool = True, alias: Optional[str] = None, schema: Optional[str] = None, database: Optional[str] = None, tags: Union[List[str], str] = , meta: Dict[str, Any] = , group: Optional[str] = None, materialized: str = 'view', incremental_strategy: Optional[str] = None, persist_docs: Dict[str, Any] = , post_hook: List[dbt.contracts.graph.model_config.Hook] = , pre_hook: List[dbt.contracts.graph.model_config.Hook] = , quoting: Dict[str, Any] = , column_types: Dict[str, Any] = , full_refresh: Optional[bool] = None, unique_key: Union[str, List[str], NoneType] = None, on_schema_change: Optional[str] = 'ignore', grants: Dict[str, Any] = , packages: List[str] = , docs: dbt.contracts.graph.unparsed.Docs = , contract: dbt.contracts.graph.model_config.ContractConfig = )" + "description": "NodeConfig(_extra: Dict[str, Any] = , enabled: bool = True, alias: Union[str, NoneType] = None, schema: Union[str, NoneType] = None, database: Union[str, NoneType] = None, tags: Union[List[str], str] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, materialized: str = 'view', incremental_strategy: Union[str, NoneType] = None, persist_docs: Dict[str, Any] = , post_hook: List[dbt.contracts.graph.model_config.Hook] = , pre_hook: List[dbt.contracts.graph.model_config.Hook] = , quoting: Dict[str, Any] = , column_types: Dict[str, Any] = , full_refresh: Union[bool, NoneType] = None, unique_key: Union[str, List[str], NoneType] = None, on_schema_change: Union[str, NoneType] = 'ignore', on_configuration_change: dbt.contracts.graph.model_config.OnConfigurationChangeOption = , grants: Dict[str, Any] = , packages: List[str] = , docs: dbt.contracts.graph.unparsed.Docs = , contract: dbt.contracts.graph.model_config.ContractConfig = )" }, "Hook": { "type": "object", @@ -796,7 +806,7 @@ } }, "additionalProperties": false, - "description": "Hook(sql: str, transaction: bool = True, index: Optional[int] = None)" + "description": "Hook(sql: str, transaction: bool = True, index: Union[int, NoneType] = None)" }, "Docs": { "type": "object", @@ -818,7 +828,7 @@ } }, "additionalProperties": false, - "description": "Docs(show: bool = True, node_color: Optional[str] = None)" + "description": "Docs(show: bool = True, node_color: Union[str, NoneType] = None)" }, "ContractConfig": { "type": "object", @@ -934,7 +944,7 @@ } }, "additionalProperties": false, - "description": "ColumnLevelConstraint(type: dbt.contracts.graph.nodes.ConstraintType, name: Optional[str] = None, expression: Optional[str] = None, warn_unenforced: bool = True, warn_unsupported: bool = True)" + "description": "ColumnLevelConstraint(type: dbt.contracts.graph.nodes.ConstraintType, name: Union[str, NoneType] = None, expression: Union[str, NoneType] = None, warn_unenforced: bool = True, warn_unsupported: bool = True)" }, "RefArgs": { "type": "object", @@ -970,7 +980,7 @@ } }, "additionalProperties": false, - "description": "RefArgs(name: str, package: Optional[str] = None, version: Union[str, float, NoneType] = None)" + "description": "RefArgs(name: str, package: Union[str, NoneType] = None, version: Union[str, float, NoneType] = None)" }, "DependsOn": { "type": "object", @@ -1038,7 +1048,7 @@ } }, "additionalProperties": false, - "description": "Contract(enforced: bool = False, checksum: Optional[str] = None)" + "description": "Contract(enforced: bool = False, checksum: Union[str, NoneType] = None)" }, "SingularTestNode": { "type": "object", @@ -1190,7 +1200,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.226929 + "default": 1686233391.7883909 }, "config_call_dict": { "type": "object", @@ -1293,7 +1303,7 @@ } }, "additionalProperties": false, - "description": "SingularTestNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.TestConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = )" + "description": "SingularTestNode(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.TestConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Union[str, NoneType] = None, compiled: bool = False, compiled_code: Union[str, NoneType] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Union[str, NoneType] = None, contract: dbt.contracts.graph.nodes.Contract = )" }, "TestConfig": { "type": "object", @@ -1415,7 +1425,7 @@ } }, "additionalProperties": true, - "description": "TestConfig(_extra: Dict[str, Any] = , enabled: bool = True, alias: Optional[str] = None, schema: Optional[str] = 'dbt_test__audit', database: Optional[str] = None, tags: Union[List[str], str] = , meta: Dict[str, Any] = , group: Optional[str] = None, materialized: str = 'test', severity: dbt.contracts.graph.model_config.Severity = 'ERROR', store_failures: Optional[bool] = None, where: Optional[str] = None, limit: Optional[int] = None, fail_calc: str = 'count(*)', warn_if: str = '!= 0', error_if: str = '!= 0')" + "description": "TestConfig(_extra: Dict[str, Any] = , enabled: bool = True, alias: Union[str, NoneType] = None, schema: Union[str, NoneType] = 'dbt_test__audit', database: Union[str, NoneType] = None, tags: Union[List[str], str] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, materialized: str = 'test', severity: dbt.contracts.graph.model_config.Severity = 'ERROR', store_failures: Union[bool, NoneType] = None, where: Union[str, NoneType] = None, limit: Union[int, NoneType] = None, fail_calc: str = 'count(*)', warn_if: str = '!= 0', error_if: str = '!= 0')" }, "HookNode": { "type": "object", @@ -1496,6 +1506,7 @@ "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", + "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": { @@ -1578,7 +1589,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.2275221 + "default": 1686233391.7890718 }, "config_call_dict": { "type": "object", @@ -1691,7 +1702,7 @@ } }, "additionalProperties": false, - "description": "HookNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = , index: Optional[int] = None)" + "description": "HookNode(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Union[str, NoneType] = None, compiled: bool = False, compiled_code: Union[str, NoneType] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Union[str, NoneType] = None, contract: dbt.contracts.graph.nodes.Contract = , index: Union[int, NoneType] = None)" }, "ModelNode": { "type": "object", @@ -1772,6 +1783,7 @@ "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", + "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": { @@ -1854,7 +1866,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.228151 + "default": 1686233391.789758 }, "config_call_dict": { "type": "object", @@ -2020,7 +2032,7 @@ } }, "additionalProperties": false, - "description": "ModelNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = , access: dbt.node_types.AccessType = , constraints: List[dbt.contracts.graph.nodes.ModelLevelConstraint] = , version: Union[str, float, NoneType] = None, latest_version: Union[str, float, NoneType] = None, deprecation_date: Optional[datetime.datetime] = None, state_relation: Optional[dbt.contracts.graph.nodes.StateRelation] = None)" + "description": "ModelNode(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Union[str, NoneType] = None, compiled: bool = False, compiled_code: Union[str, NoneType] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Union[str, NoneType] = None, contract: dbt.contracts.graph.nodes.Contract = , access: dbt.node_types.AccessType = , constraints: List[dbt.contracts.graph.nodes.ModelLevelConstraint] = , version: Union[str, float, NoneType] = None, latest_version: Union[str, float, NoneType] = None, deprecation_date: Union[datetime.datetime, NoneType] = None, state_relation: Union[dbt.contracts.graph.nodes.StateRelation, NoneType] = None)" }, "ModelLevelConstraint": { "type": "object", @@ -2076,7 +2088,7 @@ } }, "additionalProperties": false, - "description": "ModelLevelConstraint(type: dbt.contracts.graph.nodes.ConstraintType, name: Optional[str] = None, expression: Optional[str] = None, warn_unenforced: bool = True, warn_unsupported: bool = True, columns: List[str] = )" + "description": "ModelLevelConstraint(type: dbt.contracts.graph.nodes.ConstraintType, name: Union[str, NoneType] = None, expression: Union[str, NoneType] = None, warn_unenforced: bool = True, warn_unsupported: bool = True, columns: List[str] = )" }, "StateRelation": { "type": "object", @@ -2103,7 +2115,7 @@ } }, "additionalProperties": false, - "description": "StateRelation(alias: str, database: Optional[str], schema: str)" + "description": "StateRelation(alias: str, database: Union[str, NoneType], schema: str)" }, "RPCNode": { "type": "object", @@ -2184,6 +2196,7 @@ "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", + "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": { @@ -2266,7 +2279,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.229036 + "default": 1686233391.790756 }, "config_call_dict": { "type": "object", @@ -2369,7 +2382,7 @@ } }, "additionalProperties": false, - "description": "RPCNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = )" + "description": "RPCNode(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Union[str, NoneType] = None, compiled: bool = False, compiled_code: Union[str, NoneType] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Union[str, NoneType] = None, contract: dbt.contracts.graph.nodes.Contract = )" }, "SqlNode": { "type": "object", @@ -2450,6 +2463,7 @@ "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", + "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": { @@ -2532,7 +2546,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.2295911 + "default": 1686233391.7913952 }, "config_call_dict": { "type": "object", @@ -2635,7 +2649,7 @@ } }, "additionalProperties": false, - "description": "SqlNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = )" + "description": "SqlNode(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.NodeConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Union[str, NoneType] = None, compiled: bool = False, compiled_code: Union[str, NoneType] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Union[str, NoneType] = None, contract: dbt.contracts.graph.nodes.Contract = )" }, "GenericTestNode": { "type": "object", @@ -2791,7 +2805,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.2302458 + "default": 1686233391.7921169 }, "config_call_dict": { "type": "object", @@ -2924,7 +2938,7 @@ } }, "additionalProperties": false, - "description": "GenericTestNode(test_metadata: dbt.contracts.graph.nodes.TestMetadata, database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.TestConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = , column_name: Optional[str] = None, file_key_name: Optional[str] = None, attached_node: Optional[str] = None)" + "description": "GenericTestNode(test_metadata: dbt.contracts.graph.nodes.TestMetadata, database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.TestConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Union[str, NoneType] = None, compiled: bool = False, compiled_code: Union[str, NoneType] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Union[str, NoneType] = None, contract: dbt.contracts.graph.nodes.Contract = , column_name: Union[str, NoneType] = None, file_key_name: Union[str, NoneType] = None, attached_node: Union[str, NoneType] = None)" }, "TestMetadata": { "type": "object", @@ -2951,7 +2965,7 @@ } }, "additionalProperties": false, - "description": "TestMetadata(name: str, kwargs: Dict[str, Any] = , namespace: Optional[str] = None)" + "description": "TestMetadata(name: str, kwargs: Dict[str, Any] = , namespace: Union[str, NoneType] = None)" }, "SnapshotNode": { "type": "object", @@ -3087,7 +3101,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.231343 + "default": 1686233391.79344 }, "config_call_dict": { "type": "object", @@ -3200,7 +3214,7 @@ } }, "additionalProperties": false, - "description": "SnapshotNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.SnapshotConfig, _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Optional[str] = None, compiled: bool = False, compiled_code: Optional[str] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Optional[str] = None, contract: dbt.contracts.graph.nodes.Contract = , state_relation: Optional[dbt.contracts.graph.nodes.StateRelation] = None)" + "description": "SnapshotNode(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.SnapshotConfig, _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', language: str = 'sql', refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , compiled_path: Union[str, NoneType] = None, compiled: bool = False, compiled_code: Union[str, NoneType] = None, extra_ctes_injected: bool = False, extra_ctes: List[dbt.contracts.graph.nodes.InjectedCTE] = , _pre_injected_sql: Union[str, NoneType] = None, contract: dbt.contracts.graph.nodes.Contract = , state_relation: Union[dbt.contracts.graph.nodes.StateRelation, NoneType] = None)" }, "SnapshotConfig": { "type": "object", @@ -3339,6 +3353,15 @@ ], "default": "ignore" }, + "on_configuration_change": { + "type": "string", + "enum": [ + "apply", + "continue", + "fail" + ], + "default": "apply" + }, "grants": { "type": "object", "default": {} @@ -3421,7 +3444,7 @@ } }, "additionalProperties": true, - "description": "SnapshotConfig(_extra: Dict[str, Any] = , enabled: bool = True, alias: Optional[str] = None, schema: Optional[str] = None, database: Optional[str] = None, tags: Union[List[str], str] = , meta: Dict[str, Any] = , group: Optional[str] = None, materialized: str = 'snapshot', incremental_strategy: Optional[str] = None, persist_docs: Dict[str, Any] = , post_hook: List[dbt.contracts.graph.model_config.Hook] = , pre_hook: List[dbt.contracts.graph.model_config.Hook] = , quoting: Dict[str, Any] = , column_types: Dict[str, Any] = , full_refresh: Optional[bool] = None, unique_key: Optional[str] = None, on_schema_change: Optional[str] = 'ignore', grants: Dict[str, Any] = , packages: List[str] = , docs: dbt.contracts.graph.unparsed.Docs = , contract: dbt.contracts.graph.model_config.ContractConfig = , strategy: Optional[str] = None, target_schema: Optional[str] = None, target_database: Optional[str] = None, updated_at: Optional[str] = None, check_cols: Union[str, List[str], NoneType] = None)" + "description": "SnapshotConfig(_extra: Dict[str, Any] = , enabled: bool = True, alias: Union[str, NoneType] = None, schema: Union[str, NoneType] = None, database: Union[str, NoneType] = None, tags: Union[List[str], str] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, materialized: str = 'snapshot', incremental_strategy: Union[str, NoneType] = None, persist_docs: Dict[str, Any] = , post_hook: List[dbt.contracts.graph.model_config.Hook] = , pre_hook: List[dbt.contracts.graph.model_config.Hook] = , quoting: Dict[str, Any] = , column_types: Dict[str, Any] = , full_refresh: Union[bool, NoneType] = None, unique_key: Union[str, NoneType] = None, on_schema_change: Union[str, NoneType] = 'ignore', on_configuration_change: dbt.contracts.graph.model_config.OnConfigurationChangeOption = , grants: Dict[str, Any] = , packages: List[str] = , docs: dbt.contracts.graph.unparsed.Docs = , contract: dbt.contracts.graph.model_config.ContractConfig = , strategy: Union[str, NoneType] = None, target_schema: Union[str, NoneType] = None, target_database: Union[str, NoneType] = None, updated_at: Union[str, NoneType] = None, check_cols: Union[str, List[str], NoneType] = None)" }, "SeedNode": { "type": "object", @@ -3502,6 +3525,7 @@ "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", + "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": { @@ -3585,7 +3609,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.232364 + "default": 1686233391.794625 }, "config_call_dict": { "type": "object", @@ -3633,7 +3657,7 @@ } }, "additionalProperties": false, - "description": "SeedNode(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.SeedConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Optional[str] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, build_path: Optional[str] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Optional[str] = None, raw_code: str = '', root_path: Optional[str] = None, depends_on: dbt.contracts.graph.nodes.MacroDependsOn = , state_relation: Optional[dbt.contracts.graph.nodes.StateRelation] = None)" + "description": "SeedNode(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], alias: str, checksum: dbt.contracts.files.FileHash, config: dbt.contracts.graph.model_config.SeedConfig = , _event_status: Dict[str, Any] = , tags: List[str] = , description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, build_path: Union[str, NoneType] = None, deferred: bool = False, unrendered_config: Dict[str, Any] = , created_at: float = , config_call_dict: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, raw_code: str = '', root_path: Union[str, NoneType] = None, depends_on: dbt.contracts.graph.nodes.MacroDependsOn = , state_relation: Union[dbt.contracts.graph.nodes.StateRelation, NoneType] = None)" }, "SeedConfig": { "type": "object", @@ -3778,6 +3802,15 @@ ], "default": "ignore" }, + "on_configuration_change": { + "type": "string", + "enum": [ + "apply", + "continue", + "fail" + ], + "default": "apply" + }, "grants": { "type": "object", "default": {} @@ -3814,7 +3847,7 @@ } }, "additionalProperties": true, - "description": "SeedConfig(_extra: Dict[str, Any] = , enabled: bool = True, alias: Optional[str] = None, schema: Optional[str] = None, database: Optional[str] = None, tags: Union[List[str], str] = , meta: Dict[str, Any] = , group: Optional[str] = None, materialized: str = 'seed', incremental_strategy: Optional[str] = None, persist_docs: Dict[str, Any] = , post_hook: List[dbt.contracts.graph.model_config.Hook] = , pre_hook: List[dbt.contracts.graph.model_config.Hook] = , quoting: Dict[str, Any] = , column_types: Dict[str, Any] = , full_refresh: Optional[bool] = None, unique_key: Union[str, List[str], NoneType] = None, on_schema_change: Optional[str] = 'ignore', grants: Dict[str, Any] = , packages: List[str] = , docs: dbt.contracts.graph.unparsed.Docs = , contract: dbt.contracts.graph.model_config.ContractConfig = , quote_columns: Optional[bool] = None)" + "description": "SeedConfig(_extra: Dict[str, Any] = , enabled: bool = True, alias: Union[str, NoneType] = None, schema: Union[str, NoneType] = None, database: Union[str, NoneType] = None, tags: Union[List[str], str] = , meta: Dict[str, Any] = , group: Union[str, NoneType] = None, materialized: str = 'seed', incremental_strategy: Union[str, NoneType] = None, persist_docs: Dict[str, Any] = , post_hook: List[dbt.contracts.graph.model_config.Hook] = , pre_hook: List[dbt.contracts.graph.model_config.Hook] = , quoting: Dict[str, Any] = , column_types: Dict[str, Any] = , full_refresh: Union[bool, NoneType] = None, unique_key: Union[str, List[str], NoneType] = None, on_schema_change: Union[str, NoneType] = 'ignore', on_configuration_change: dbt.contracts.graph.model_config.OnConfigurationChangeOption = , grants: Dict[str, Any] = , packages: List[str] = , docs: dbt.contracts.graph.unparsed.Docs = , contract: dbt.contracts.graph.model_config.ContractConfig = , quote_columns: Union[bool, NoneType] = None)" }, "MacroDependsOn": { "type": "object", @@ -3997,11 +4030,11 @@ }, "created_at": { "type": "number", - "default": 1686178685.2336159 + "default": 1686233391.7958772 } }, "additionalProperties": false, - "description": "SourceDefinition(database: Optional[str], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], source_name: str, source_description: str, loader: str, identifier: str, _event_status: Dict[str, Any] = , quoting: dbt.contracts.graph.unparsed.Quoting = , loaded_at_field: Optional[str] = None, freshness: Optional[dbt.contracts.graph.unparsed.FreshnessThreshold] = None, external: Optional[dbt.contracts.graph.unparsed.ExternalTable] = None, description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , source_meta: Dict[str, Any] = , tags: List[str] = , config: dbt.contracts.graph.model_config.SourceConfig = , patch_path: Optional[str] = None, unrendered_config: Dict[str, Any] = , relation_name: Optional[str] = None, created_at: float = )" + "description": "SourceDefinition(database: Union[str, NoneType], schema: str, name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], source_name: str, source_description: str, loader: str, identifier: str, _event_status: Dict[str, Any] = , quoting: dbt.contracts.graph.unparsed.Quoting = , loaded_at_field: Union[str, NoneType] = None, freshness: Union[dbt.contracts.graph.unparsed.FreshnessThreshold, NoneType] = None, external: Union[dbt.contracts.graph.unparsed.ExternalTable, NoneType] = None, description: str = '', columns: Dict[str, dbt.contracts.graph.nodes.ColumnInfo] = , meta: Dict[str, Any] = , source_meta: Dict[str, Any] = , tags: List[str] = , config: dbt.contracts.graph.model_config.SourceConfig = , patch_path: Union[str, NoneType] = None, unrendered_config: Dict[str, Any] = , relation_name: Union[str, NoneType] = None, created_at: float = )" }, "Quoting": { "type": "object", @@ -4049,7 +4082,7 @@ } }, "additionalProperties": false, - "description": "Quoting(database: Optional[bool] = None, schema: Optional[bool] = None, identifier: Optional[bool] = None, column: Optional[bool] = None)" + "description": "Quoting(database: Union[bool, NoneType] = None, schema: Union[bool, NoneType] = None, identifier: Union[bool, NoneType] = None, column: Union[bool, NoneType] = None)" }, "FreshnessThreshold": { "type": "object", @@ -4095,7 +4128,7 @@ } }, "additionalProperties": false, - "description": "FreshnessThreshold(warn_after: Optional[dbt.contracts.graph.unparsed.Time] = , error_after: Optional[dbt.contracts.graph.unparsed.Time] = , filter: Optional[str] = None)" + "description": "FreshnessThreshold(warn_after: Union[dbt.contracts.graph.unparsed.Time, NoneType] = , error_after: Union[dbt.contracts.graph.unparsed.Time, NoneType] = , filter: Union[str, NoneType] = None)" }, "Time": { "type": "object", @@ -4128,7 +4161,7 @@ } }, "additionalProperties": false, - "description": "Time(count: Optional[int] = None, period: Optional[dbt.contracts.graph.unparsed.TimePeriod] = None)" + "description": "Time(count: Union[int, NoneType] = None, period: Union[dbt.contracts.graph.unparsed.TimePeriod, NoneType] = None)" }, "ExternalTable": { "type": "object", @@ -4195,7 +4228,7 @@ } }, "additionalProperties": true, - "description": "ExternalTable(_extra: Dict[str, Any] = , location: Optional[str] = None, file_format: Optional[str] = None, row_format: Optional[str] = None, tbl_properties: Optional[str] = None, partitions: Union[List[str], List[dbt.contracts.graph.unparsed.ExternalPartition], NoneType] = None)" + "description": "ExternalTable(_extra: Dict[str, Any] = , location: Union[str, NoneType] = None, file_format: Union[str, NoneType] = None, row_format: Union[str, NoneType] = None, tbl_properties: Union[str, NoneType] = None, partitions: Union[List[str], List[dbt.contracts.graph.unparsed.ExternalPartition], NoneType] = None)" }, "ExternalPartition": { "type": "object", @@ -4309,7 +4342,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.2339032 + "default": 1686233391.796146 }, "supported_languages": { "oneOf": [ @@ -4330,7 +4363,7 @@ } }, "additionalProperties": false, - "description": "Macro(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, macro_sql: str, depends_on: dbt.contracts.graph.nodes.MacroDependsOn = , description: str = '', meta: Dict[str, Any] = , docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Optional[str] = None, arguments: List[dbt.contracts.graph.unparsed.MacroArgument] = , created_at: float = , supported_languages: Optional[List[dbt.node_types.ModelLanguage]] = None)" + "description": "Macro(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, macro_sql: str, depends_on: dbt.contracts.graph.nodes.MacroDependsOn = , description: str = '', meta: Dict[str, Any] = , docs: dbt.contracts.graph.unparsed.Docs = , patch_path: Union[str, NoneType] = None, arguments: List[dbt.contracts.graph.unparsed.MacroArgument] = , created_at: float = , supported_languages: Union[List[dbt.node_types.ModelLanguage], NoneType] = None)" }, "MacroArgument": { "type": "object", @@ -4357,7 +4390,7 @@ } }, "additionalProperties": false, - "description": "MacroArgument(name: str, type: Optional[str] = None, description: str = '')" + "description": "MacroArgument(name: str, type: Union[str, NoneType] = None, description: str = '')" }, "Documentation": { "type": "object", @@ -4550,11 +4583,11 @@ }, "created_at": { "type": "number", - "default": 1686178685.234565 + "default": 1686233391.796803 } }, "additionalProperties": false, - "description": "Exposure(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], type: dbt.contracts.graph.unparsed.ExposureType, owner: dbt.contracts.graph.unparsed.Owner, description: str = '', label: Optional[str] = None, maturity: Optional[dbt.contracts.graph.unparsed.MaturityType] = None, meta: Dict[str, Any] = , tags: List[str] = , config: dbt.contracts.graph.model_config.ExposureConfig = , unrendered_config: Dict[str, Any] = , url: Optional[str] = None, depends_on: dbt.contracts.graph.nodes.DependsOn = , refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , created_at: float = )" + "description": "Exposure(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], type: dbt.contracts.graph.unparsed.ExposureType, owner: dbt.contracts.graph.unparsed.Owner, description: str = '', label: Union[str, NoneType] = None, maturity: Union[dbt.contracts.graph.unparsed.MaturityType, NoneType] = None, meta: Dict[str, Any] = , tags: List[str] = , config: dbt.contracts.graph.model_config.ExposureConfig = , unrendered_config: Dict[str, Any] = , url: Union[str, NoneType] = None, depends_on: dbt.contracts.graph.nodes.DependsOn = , refs: List[dbt.contracts.graph.nodes.RefArgs] = , sources: List[List[str]] = , metrics: List[List[str]] = , created_at: float = )" }, "Owner": { "type": "object", @@ -4582,7 +4615,7 @@ } }, "additionalProperties": true, - "description": "Owner(_extra: Dict[str, Any] = , email: Optional[str] = None, name: Optional[str] = None)" + "description": "Owner(_extra: Dict[str, Any] = , email: Union[str, NoneType] = None, name: Union[str, NoneType] = None)" }, "ExposureConfig": { "type": "object", @@ -4608,11 +4641,8 @@ "fqn", "description", "label", - "calculation_method", - "expression", - "filters", - "time_grains", - "dimensions" + "type", + "type_params" ], "properties": { "name": { @@ -4648,64 +4678,33 @@ "label": { "type": "string" }, - "calculation_method": { - "type": "string" - }, - "expression": { - "type": "string" - }, - "filters": { - "type": "array", - "items": { - "$ref": "#/definitions/MetricFilter" - } - }, - "time_grains": { - "type": "array", - "items": { - "type": "string" - } - }, - "dimensions": { - "type": "array", - "items": { - "type": "string" - } - }, - "timestamp": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "type": { + "type": "string", + "enum": [ + "simple", + "ratio", + "expr", + "cumulative", + "derived" ] }, - "window": { - "oneOf": [ - { - "$ref": "#/definitions/MetricTime" - }, - { - "type": "null" - } - ] + "type_params": { + "$ref": "#/definitions/MetricTypeParams" }, - "model": { + "filter": { "oneOf": [ { - "type": "string" + "$ref": "#/definitions/WhereFilter" }, { "type": "null" } ] }, - "model_unique_id": { + "metadata": { "oneOf": [ { - "type": "string" + "$ref": "#/definitions/Metadata" }, { "type": "null" @@ -4771,7 +4770,7 @@ }, "created_at": { "type": "number", - "default": 1686178685.23521 + "default": 1686233391.797935 }, "group": { "oneOf": [ @@ -4785,44 +4784,219 @@ } }, "additionalProperties": false, - "description": "Metric(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], description: str, label: str, calculation_method: str, expression: str, filters: List[dbt.contracts.graph.unparsed.MetricFilter], time_grains: List[str], dimensions: List[str], timestamp: Optional[str] = None, window: Optional[dbt.contracts.graph.unparsed.MetricTime] = None, model: Optional[str] = None, model_unique_id: Optional[str] = None, meta: Dict[str, Any] = , tags: List[str] = , config: dbt.contracts.graph.model_config.MetricConfig = , unrendered_config: Dict[str, Any] = , sources: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , refs: List[dbt.contracts.graph.nodes.RefArgs] = , metrics: List[List[str]] = , created_at: float = , group: Optional[str] = None)" + "description": "Metric(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], description: str, label: str, type: dbt_semantic_interfaces.type_enums.metric_type.MetricType, type_params: dbt.contracts.graph.nodes.MetricTypeParams, filter: Union[dbt.contracts.graph.nodes.WhereFilter, NoneType] = None, metadata: Union[dbt.contracts.graph.nodes.Metadata, NoneType] = None, meta: Dict[str, Any] = , tags: List[str] = , config: dbt.contracts.graph.model_config.MetricConfig = , unrendered_config: Dict[str, Any] = , sources: List[List[str]] = , depends_on: dbt.contracts.graph.nodes.DependsOn = , refs: List[dbt.contracts.graph.nodes.RefArgs] = , metrics: List[List[str]] = , created_at: float = , group: Union[str, NoneType] = None)" + }, + "MetricTypeParams": { + "type": "object", + "required": [], + "properties": { + "measure": { + "oneOf": [ + { + "$ref": "#/definitions/MetricInputMeasure" + }, + { + "type": "null" + } + ] + }, + "measures": { + "oneOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/MetricInputMeasure" + } + }, + { + "type": "null" + } + ] + }, + "numerator": { + "oneOf": [ + { + "$ref": "#/definitions/MetricInputMeasure" + }, + { + "type": "null" + } + ] + }, + "denominator": { + "oneOf": [ + { + "$ref": "#/definitions/MetricInputMeasure" + }, + { + "type": "null" + } + ] + }, + "expr": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "window": { + "oneOf": [ + { + "$ref": "#/definitions/MetricTimeWindow" + }, + { + "type": "null" + } + ] + }, + "grain_to_date": { + "oneOf": [ + { + "type": "string", + "enum": [ + "day", + "week", + "month", + "quarter", + "year" + ] + }, + { + "type": "null" + } + ] + }, + "metrics": { + "oneOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/MetricInput" + } + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "description": "MetricTypeParams(measure: Union[dbt.contracts.graph.nodes.MetricInputMeasure, NoneType] = None, measures: Union[List[dbt.contracts.graph.nodes.MetricInputMeasure], NoneType] = None, numerator: Union[dbt.contracts.graph.nodes.MetricInputMeasure, NoneType] = None, denominator: Union[dbt.contracts.graph.nodes.MetricInputMeasure, NoneType] = None, expr: Union[str, NoneType] = None, window: Union[dbt.contracts.graph.nodes.MetricTimeWindow, NoneType] = None, grain_to_date: Union[dbt_semantic_interfaces.type_enums.time_granularity.TimeGranularity, NoneType] = None, metrics: Union[List[dbt.contracts.graph.nodes.MetricInput], NoneType] = None)" }, - "MetricFilter": { + "MetricInputMeasure": { "type": "object", "required": [ - "field", - "operator", - "value" + "name" ], "properties": { - "field": { + "name": { "type": "string" }, - "operator": { - "type": "string" + "filter": { + "oneOf": [ + { + "$ref": "#/definitions/WhereFilter" + }, + { + "type": "null" + } + ] }, - "value": { + "alias": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "description": "MetricInputMeasure(name: str, filter: Union[dbt.contracts.graph.nodes.WhereFilter, NoneType] = None, alias: Union[str, NoneType] = None)" + }, + "WhereFilter": { + "type": "object", + "required": [ + "where_sql_template" + ], + "properties": { + "where_sql_template": { "type": "string" } }, "additionalProperties": false, - "description": "MetricFilter(field: str, operator: str, value: str)" + "description": "WhereFilter(where_sql_template: str)" }, - "MetricTime": { + "MetricTimeWindow": { "type": "object", - "required": [], + "required": [ + "count", + "granularity" + ], "properties": { "count": { + "type": "integer" + }, + "granularity": { + "type": "string", + "enum": [ + "day", + "week", + "month", + "quarter", + "year" + ] + } + }, + "additionalProperties": false, + "description": "MetricTimeWindow(count: int, granularity: dbt_semantic_interfaces.type_enums.time_granularity.TimeGranularity)" + }, + "MetricInput": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "filter": { "oneOf": [ { - "type": "integer" + "$ref": "#/definitions/WhereFilter" }, { "type": "null" } ] }, - "period": { + "alias": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "offset_window": { + "oneOf": [ + { + "$ref": "#/definitions/MetricTimeWindow" + }, + { + "type": "null" + } + ] + }, + "offset_to_grain": { "oneOf": [ { "type": "string", @@ -4830,6 +5004,7 @@ "day", "week", "month", + "quarter", "year" ] }, @@ -4840,7 +5015,49 @@ } }, "additionalProperties": false, - "description": "MetricTime(count: Optional[int] = None, period: Optional[dbt.contracts.graph.unparsed.MetricTimePeriod] = None)" + "description": "MetricInput(name: str, filter: Union[dbt.contracts.graph.nodes.WhereFilter, NoneType] = None, alias: Union[str, NoneType] = None, offset_window: Union[dbt.contracts.graph.nodes.MetricTimeWindow, NoneType] = None, offset_to_grain: Union[dbt_semantic_interfaces.type_enums.time_granularity.TimeGranularity, NoneType] = None)" + }, + "Metadata": { + "type": "object", + "required": [ + "repo_file_path", + "file_slice" + ], + "properties": { + "repo_file_path": { + "type": "string" + }, + "file_slice": { + "$ref": "#/definitions/FileSlice" + } + }, + "additionalProperties": false, + "description": "Provides file context about what something was created from.\n\n Implementation of the dbt-semantic-interfaces `Metadata` protocol\n " + }, + "FileSlice": { + "type": "object", + "required": [ + "filename", + "content", + "start_line_number", + "end_line_number" + ], + "properties": { + "filename": { + "type": "string" + }, + "content": { + "type": "string" + }, + "start_line_number": { + "type": "integer" + }, + "end_line_number": { + "type": "integer" + } + }, + "additionalProperties": false, + "description": "Provides file slice level context about what something was created from.\n\n Implementation of the dbt-semantic-interfaces `FileSlice` protocol\n " }, "MetricConfig": { "type": "object", @@ -4862,7 +5079,7 @@ } }, "additionalProperties": true, - "description": "MetricConfig(_extra: Dict[str, Any] = , enabled: bool = True, group: Optional[str] = None)" + "description": "MetricConfig(_extra: Dict[str, Any] = , enabled: bool = True, group: Union[str, NoneType] = None)" }, "Group": { "type": "object", @@ -4991,7 +5208,7 @@ "generated_at": { "type": "string", "format": "date-time", - "default": "2023-06-07T22:58:05.235799Z" + "default": "2023-06-08T14:09:51.798685Z" }, "deprecation_date": { "oneOf": [ @@ -5108,7 +5325,7 @@ } }, "additionalProperties": false, - "description": "SemanticModel(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], description: Optional[str], model: str, node_relation: Optional[dbt.contracts.graph.nodes.NodeRelation], entities: Sequence[dbt.contracts.graph.unparsed.Entity], measures: Sequence[dbt.contracts.graph.unparsed.Measure], dimensions: Sequence[dbt.contracts.graph.unparsed.Dimension])" + "description": "SemanticModel(name: str, resource_type: dbt.node_types.NodeType, package_name: str, path: str, original_file_path: str, unique_id: str, fqn: List[str], description: Union[str, NoneType], model: str, node_relation: Union[dbt.contracts.graph.nodes.NodeRelation, NoneType], entities: Sequence[dbt.contracts.graph.unparsed.Entity], measures: Sequence[dbt.contracts.graph.unparsed.Measure], dimensions: Sequence[dbt.contracts.graph.unparsed.Dimension])" }, "NodeRelation": { "type": "object", @@ -5135,7 +5352,7 @@ } }, "additionalProperties": false, - "description": "NodeRelation(alias: str, schema_name: str, database: Optional[str] = None)" + "description": "NodeRelation(alias: str, schema_name: str, database: Union[str, NoneType] = None)" }, "Entity": { "type": "object", @@ -5182,7 +5399,7 @@ } }, "additionalProperties": false, - "description": "Entity(name: str, type: str, description: Optional[str] = None, role: Optional[str] = None, expr: Optional[str] = None)" + "description": "Entity(name: str, type: str, description: Union[str, NoneType] = None, role: Union[str, NoneType] = None, expr: Union[str, NoneType] = None)" }, "Measure": { "type": "object", @@ -5259,7 +5476,7 @@ } }, "additionalProperties": false, - "description": "Measure(name: str, agg: str, description: Optional[str] = None, create_metric: Optional[bool] = None, expr: Optional[str] = None, agg_params: Optional[dbt.contracts.graph.unparsed.MeasureAggregationParameters] = None, non_additive_dimension: Optional[Dict[str, Any]] = None, agg_time_dimension: Optional[str] = None)" + "description": "Measure(name: str, agg: str, description: Union[str, NoneType] = None, create_metric: Union[bool, NoneType] = None, expr: Union[str, NoneType] = None, agg_params: Union[dbt.contracts.graph.unparsed.MeasureAggregationParameters, NoneType] = None, non_additive_dimension: Union[Dict[str, Any], NoneType] = None, agg_time_dimension: Union[str, NoneType] = None)" }, "MeasureAggregationParameters": { "type": "object", @@ -5285,7 +5502,7 @@ } }, "additionalProperties": false, - "description": "MeasureAggregationParameters(percentile: Optional[float] = None, use_discrete_percentile: bool = False, use_approximate_percentile: bool = False)" + "description": "MeasureAggregationParameters(percentile: Union[float, NoneType] = None, use_discrete_percentile: bool = False, use_approximate_percentile: bool = False)" }, "Dimension": { "type": "object", @@ -5343,7 +5560,7 @@ } }, "additionalProperties": false, - "description": "Dimension(name: str, type: str, description: Optional[str] = None, is_partition: Optional[bool] = False, type_params: Optional[Dict[str, Any]] = None, expr: Optional[str] = None)" + "description": "Dimension(name: str, type: str, description: Union[str, NoneType] = None, is_partition: Union[bool, NoneType] = False, type_params: Union[Dict[str, Any], NoneType] = None, expr: Union[str, NoneType] = None)" } }, "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/test/unit/test_contracts_graph_parsed.py b/test/unit/test_contracts_graph_parsed.py index 65b1e254711..2eac9d7ab3e 100644 --- a/test/unit/test_contracts_graph_parsed.py +++ b/test/unit/test_contracts_graph_parsed.py @@ -23,6 +23,8 @@ Macro, Exposure, Metric, + MetricTypeParams, + MetricInputMeasure, SeedNode, Docs, MacroDependsOn, @@ -44,6 +46,7 @@ from argparse import Namespace from dbt.dataclass_schema import ValidationError +from dbt_semantic_interfaces.type_enums.metric_type import MetricType from .utils import ( ContractTestCase, assert_symmetric, @@ -2315,7 +2318,8 @@ def test_compare_changed_exposure(func, basic_parsed_exposure_object): def minimal_parsed_metric_dict(): return { "name": "my_metric", - "type": "count", + "type": "simple", + "type_params": {"measure": {"name": "my_measure"}}, "timestamp": "created_at", "time_grains": ["day"], "fqn": ["test", "metrics", "my_metric"], @@ -2335,19 +2339,10 @@ def basic_parsed_metric_dict(): return { "name": "new_customers", "label": "New Customers", - "model": 'ref("dim_customers")', - "calculation_method": "count", - "expression": "user_id", - "timestamp": "signup_date", - "time_grains": ["day", "week", "month"], - "dimensions": ["plan", "country"], - "filters": [ - { - "field": "is_paying", - "value": "true", - "operator": "=", - } - ], + "type": "simple", + "type_params": { + "measure": {"name": "customers", "filter": {"where_sql_template": "is_new = true"}}, + }, "resource_type": "metric", "refs": [["dim_customers"]], "sources": [], @@ -2357,7 +2352,7 @@ def basic_parsed_metric_dict(): "package_name": "test", "path": "models/something.yml", "original_file_path": "models/something.yml", - "description": "", + "description": "New Customers", "meta": {}, "tags": [], "created_at": 1.0, @@ -2374,8 +2369,9 @@ def basic_parsed_metric_object(): return Metric( name="my_metric", resource_type=NodeType.Metric, - calculation_method="count", - fqn=["test", "metrics", "my_metric"], + type=MetricType.SIMPLE, + type_params=MetricTypeParams(measure=MetricInputMeasure(name="a_measure")), + fqn=["test", "metrics", "myq_metric"], unique_id="metric.test.my_metric", package_name="test", path="models/something.yml", diff --git a/test/unit/test_contracts_graph_unparsed.py b/test/unit/test_contracts_graph_unparsed.py index 4f944990af7..ad9f6d74922 100644 --- a/test/unit/test_contracts_graph_unparsed.py +++ b/test/unit/test_contracts_graph_unparsed.py @@ -21,9 +21,8 @@ Owner, ExposureType, UnparsedMetric, - MetricFilter, - MetricTime, - MetricTimePeriod, + UnparsedMetricTypeParams, + UnparsedMetricInputMeasure, UnparsedVersion, ) from dbt.contracts.results import FreshnessStatus @@ -864,40 +863,16 @@ def get_ok_dict(self): return { "name": "new_customers", "label": "New Customers", - "model": 'ref("dim_customers")', "description": "New customers", - "calculation_method": "count", - "expression": "user_id", - "config": {}, - "timestamp": "signup_date", - "time_grains": ["day", "week", "month"], - "dimensions": ["plan", "country"], - "filters": [ - { - "field": "is_paying", - "value": "True", - "operator": "=", - } - ], - "window": {"count": 14, "period": "day"}, - "tags": [], - "meta": {"is_okr": True}, - } - - def get_ok_derived_dict(self): - return { - "name": "arpc", - "label": "revenue per customer", - "description": "", - "calculation_method": "derived", - "expression": "{{ metric('revenue') }} / {{ metric('customers') }}", + "type": "simple", + "type_params": { + "measure": { + "name": "customers", + "filter": "is_new = true", + }, + }, "config": {}, - "time_grains": ["day", "week", "month"], - "timestamp": "signup_date", - "dimensions": [], - "filters": [], "tags": [], - "window": {}, "meta": {"is_okr": True}, } @@ -905,63 +880,24 @@ def test_ok(self): metric = self.ContractType( name="new_customers", label="New Customers", - model='ref("dim_customers")', description="New customers", - calculation_method="count", - expression="user_id", - config={}, - timestamp="signup_date", - time_grains=["day", "week", "month"], - dimensions=["plan", "country"], - filters=[ - MetricFilter( - field="is_paying", - value="True", - operator="=", + type="simple", + type_params=UnparsedMetricTypeParams( + measure=UnparsedMetricInputMeasure( + name="customers", + filter="is_new = true", ) - ], - window=MetricTime(count=14, period=MetricTimePeriod.day), - meta={"is_okr": True}, - ) - dct = self.get_ok_dict() - self.assert_symmetric(metric, dct) - pickle.loads(pickle.dumps(metric)) - - def test_ok_metric_no_model(self): - # Derived metrics do not have model properties - metric = self.ContractType( - name="arpc", - label="revenue per customer", - model=None, - description="", - calculation_method="derived", - expression="{{ metric('revenue') }} / {{ metric('customers') }}", - timestamp="signup_date", + ), config={}, - time_grains=["day", "week", "month"], - window=MetricTime(), - dimensions=[], meta={"is_okr": True}, ) - dct = self.get_ok_derived_dict() + dct = self.get_ok_dict() self.assert_symmetric(metric, dct) pickle.loads(pickle.dumps(metric)) - def test_bad_metric_no_calculation_method(self): - tst = self.get_ok_dict() - del tst["calculation_method"] - self.assert_fails_validation(tst) - - def test_bad_metric_no_model(self): - tst = self.get_ok_dict() - # Metrics with calculation_type='derived' do not have model props - tst["model"] = None - tst["calculation_method"] = "sum" - self.assert_fails_validation(tst) - - def test_bad_filter_missing_things(self): + def test_bad_metric_no_type_params(self): tst = self.get_ok_dict() - del tst["filters"][0]["operator"] + del tst["type_params"] self.assert_fails_validation(tst) def test_bad_tags(self): diff --git a/test/unit/test_graph_selector_methods.py b/test/unit/test_graph_selector_methods.py index eaac2479979..868c2954c9d 100644 --- a/test/unit/test_graph_selector_methods.py +++ b/test/unit/test_graph_selector_methods.py @@ -14,6 +14,8 @@ ModelNode, Exposure, Metric, + MetricTypeParams, + MetricInputMeasure, Group, SeedNode, SingularTestNode, @@ -24,7 +26,7 @@ ColumnInfo, ) from dbt.contracts.graph.manifest import Manifest, ManifestMetadata -from dbt.contracts.graph.unparsed import ExposureType, Owner, MetricFilter, MetricTime +from dbt.contracts.graph.unparsed import ExposureType, Owner from dbt.contracts.state import PreviousState from dbt.node_types import NodeType from dbt.graph.selector_methods import ( @@ -47,6 +49,7 @@ ) import dbt.exceptions import dbt.contracts.graph.nodes +from dbt_semantic_interfaces.type_enums.metric_type import MetricType from .utils import replace_config @@ -401,21 +404,9 @@ def make_metric(pkg, name, path=None): unique_id=f"metric.{pkg}.{name}", fqn=[pkg, "metrics", name], label="New Customers", - model='ref("multi")', description="New customers", - calculation_method="count", - expression="user_id", - timestamp="signup_date", - time_grains=["day", "week", "month"], - dimensions=["plan", "country"], - filters=[ - MetricFilter( - field="is_paying", - value=True, - operator="=", - ) - ], - window=MetricTime(), + type=MetricType.SIMPLE, + type_params=MetricTypeParams(measure=MetricInputMeasure(name="count_cats")), meta={"is_okr": True}, tags=["okrs"], ) diff --git a/test/unit/test_manifest.py b/test/unit/test_manifest.py index e7de7ba248a..c5cae56c293 100644 --- a/test/unit/test_manifest.py +++ b/test/unit/test_manifest.py @@ -24,6 +24,9 @@ SourceDefinition, Exposure, Metric, + MetricInputMeasure, + MetricTypeParams, + WhereFilter, Group, RefArgs, ) @@ -31,13 +34,13 @@ ExposureType, Owner, MaturityType, - MetricFilter, - MetricTime, ) from dbt.events.functions import reset_metadata_vars from dbt.exceptions import AmbiguousResourceNameRefError from dbt.flags import set_from_args from dbt.node_types import NodeType +from dbt_semantic_interfaces.type_enums.metric_type import MetricType + from .utils import ( MockMacro, MockDocumentation, @@ -147,28 +150,18 @@ def setUp(self): "metric.root.my_metric": Metric( name="new_customers", label="New Customers", - model='ref("multi")', description="New customers", - calculation_method="count", - expression="user_id", - timestamp="signup_date", - time_grains=["day", "week", "month"], - dimensions=["plan", "country"], - filters=[ - MetricFilter( - field="is_paying", - value="True", - operator="=", - ) - ], meta={"is_okr": True}, tags=["okrs"], - window=MetricTime(), + type=MetricType.SIMPLE, + type_params=MetricTypeParams( + measure=MetricInputMeasure( + name="customers", filter=WhereFilter(where_sql_template="is_new = True") + ) + ), resource_type=NodeType.Metric, - depends_on=DependsOn(nodes=["model.root.multi"]), - refs=[RefArgs(name="multi")], - sources=[], - metrics=[], + depends_on=DependsOn(nodes=["semantic_model.root.customers"]), + refs=[RefArgs(name="customers")], fqn=["root", "my_metric"], unique_id="metric.root.my_metric", package_name="root", diff --git a/tests/functional/artifacts/data/state/v10/manifest.json b/tests/functional/artifacts/data/state/v10/manifest.json index c804f0c3022..21fbb8447b7 100644 --- a/tests/functional/artifacts/data/state/v10/manifest.json +++ b/tests/functional/artifacts/data/state/v10/manifest.json @@ -1 +1 @@ -{"metadata": {"dbt_schema_version": "https://schemas.getdbt.com/dbt/manifest/v10.json", "dbt_version": "1.5.0rc1", "generated_at": "2023-04-17T21:01:28.367373Z", "invocation_id": "0541b9e6-335e-4123-9e79-1cf158eadf06", "env": {}, "project_id": "098f6bcd4621d373cade4e832627b4f6", "user_id": null, "send_anonymous_usage_stats": false, "adapter_type": "postgres"}, "nodes": {"model.test.my_model": {"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state", "name": "my_model", "resource_type": "model", "package_name": "test", "path": "my_model.sql", "original_file_path": "models/my_model.sql", "unique_id": "model.test.my_model", "fqn": ["test", "my_model"], "alias": "my_model", "checksum": {"name": "sha256", "checksum": "3ea0f972fa1b56aa2dc2f56ee784b6a5796312f9a813d59ae70fd8855f10d16d"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "view", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "post-hook": [], "pre-hook": []}, "tags": [], "description": "Example model", "columns": {"id": {"name": "id", "description": "", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "test://models/schema.yml", "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1681765286.472233, "relation_name": "\"dbt\".\"test16817652848506647403_test_previous_version_state\".\"my_model\"", "raw_code": "select 1 as id", "language": "sql", "refs": [], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null}, "snapshot.test.snapshot_seed": {"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state", "name": "snapshot_seed", "resource_type": "snapshot", "package_name": "test", "path": "snapshot_seed.sql", "original_file_path": "snapshots/snapshot_seed.sql", "unique_id": "snapshot.test.snapshot_seed", "fqn": ["test", "snapshot_seed", "snapshot_seed"], "alias": "snapshot_seed", "checksum": {"name": "sha256", "checksum": "5fc998f39655f8fe52443a919e749b6e23883ef90202b040412baac13c6bfe18"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "snapshot", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": "id", "on_schema_change": "ignore", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "strategy": "check", "target_schema": "test16817652848506647403_test_previous_version_state", "target_database": null, "updated_at": null, "check_cols": "all", "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"unique_key": "id", "strategy": "check", "check_cols": "all", "target_schema": "test16817652848506647403_test_previous_version_state"}, "created_at": 1681765286.142283, "relation_name": "\"dbt\".\"test16817652848506647403_test_previous_version_state\".\"snapshot_seed\"", "raw_code": "\n{{\n config(\n unique_key='id',\n strategy='check',\n check_cols='all',\n target_schema=schema,\n )\n}}\nselect * from {{ ref('my_seed') }}\n", "language": "sql", "refs": [{"name": "my_seed", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["seed.test.my_seed"]}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}, "analysis.test.a": {"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state", "name": "a", "resource_type": "analysis", "package_name": "test", "path": "analysis/a.sql", "original_file_path": "analyses/a.sql", "unique_id": "analysis.test.a", "fqn": ["test", "analysis", "a"], "alias": "a", "checksum": {"name": "sha256", "checksum": "a389c282f569f0bbdc2a8a4f174dea746c28582fdaf2048d31d9226af9feab23"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "view", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1681765286.286958, "relation_name": null, "raw_code": "select 4 as id", "language": "sql", "refs": [], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}, "test.test.just_my": {"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state_dbt_test__audit", "name": "just_my", "resource_type": "test", "package_name": "test", "path": "just_my.sql", "original_file_path": "tests/just_my.sql", "unique_id": "test.test.just_my", "fqn": ["test", "just_my"], "alias": "just_my", "checksum": {"name": "sha256", "checksum": "744889a2e2d9ce380619265e1217d7ccf6e6ca896c048d42ebe0f9cfb74d7156"}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": ["data_test_tag"], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": ["data_test_tag"], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"tags": ["data_test_tag"]}, "created_at": 1681765286.4204879, "relation_name": null, "raw_code": "{{ config(tags = ['data_test_tag']) }}\n\nselect * from {{ ref('my_model') }}\nwhere false", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.test.my_model"]}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}, "seed.test.my_seed": {"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state", "name": "my_seed", "resource_type": "seed", "package_name": "test", "path": "my_seed.csv", "original_file_path": "seeds/my_seed.csv", "unique_id": "seed.test.my_seed", "fqn": ["test", "my_seed"], "alias": "my_seed", "checksum": {"name": "sha256", "checksum": "f7ede83f36165ac6b7a047aa2c3f212dff385bfa9f35f395108cd06fc8e96943"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "seed", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "quote_columns": null, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1681765286.443077, "relation_name": "\"dbt\".\"test16817652848506647403_test_previous_version_state\".\"my_seed\"", "raw_code": "", "root_path": "/private/var/folders/qt/vw8wqdgx4w381wh14b9y25m40000gn/T/pytest-of-gerda/pytest-600/project6", "depends_on": {"macros": []}}, "test.test.not_null_my_model_id.43e0e9183a": {"test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('my_model')) }}"}, "namespace": null}, "database": "dbt", "schema": "test16817652848506647403_test_previous_version_state_dbt_test__audit", "name": "not_null_my_model_id", "resource_type": "test", "package_name": "test", "path": "not_null_my_model_id.sql", "original_file_path": "models/schema.yml", "unique_id": "test.test.not_null_my_model_id.43e0e9183a", "fqn": ["test", "not_null_my_model_id"], "alias": "not_null_my_model_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1681765286.475051, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.test.my_model"]}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "column_name": "id", "file_key_name": "models.my_model", "attached_node": "model.test.my_model"}, "test.test.check_nothing_my_model_.d5a5e66110": {"test_metadata": {"name": "check_nothing", "kwargs": {"model": "{{ get_where_subquery(ref('my_model')) }}"}, "namespace": null}, "database": "dbt", "schema": "test16817652848506647403_test_previous_version_state_dbt_test__audit", "name": "check_nothing_my_model_", "resource_type": "test", "package_name": "test", "path": "check_nothing_my_model_.sql", "original_file_path": "models/schema.yml", "unique_id": "test.test.check_nothing_my_model_.d5a5e66110", "fqn": ["test", "check_nothing_my_model_"], "alias": "check_nothing_my_model_", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1681765286.4796748, "relation_name": null, "raw_code": "{{ test_check_nothing(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.test.test_check_nothing", "macro.dbt.get_where_subquery"], "nodes": ["model.test.my_model"]}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "column_name": null, "file_key_name": "models.my_model", "attached_node": "model.test.my_model"}}, "sources": {"source.test.my_source.my_table": {"database": "dbt", "schema": "my_source", "name": "my_table", "resource_type": "source", "package_name": "test", "path": "models/schema.yml", "original_file_path": "models/schema.yml", "unique_id": "source.test.my_source.my_table", "fqn": ["test", "my_source", "my_table"], "source_name": "my_source", "source_description": "My source", "loader": "a_loader", "identifier": "my_seed", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "My table", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"dbt\".\"my_source\".\"my_seed\"", "created_at": 1681765286.764481}}, "macros": {"macro.test.test_check_nothing": {"name": "test_check_nothing", "resource_type": "macro", "package_name": "test", "path": "macros/dummy_test.sql", "original_file_path": "macros/dummy_test.sql", "unique_id": "macro.test.test_check_nothing", "macro_sql": "{% test check_nothing(model) %}\n-- a silly test to make sure that table-level tests show up in the manifest\n-- without a column_name field\n\nselect 0\n\n{% endtest %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.988441, "supported_languages": null}, "macro.test.test_disabled_check_nothing": {"name": "test_disabled_check_nothing", "resource_type": "macro", "package_name": "test", "path": "macros/disabled_dummy_test.sql", "original_file_path": "macros/disabled_dummy_test.sql", "unique_id": "macro.test.test_disabled_check_nothing", "macro_sql": "{% test disabled_check_nothing(model) %}\n-- a silly test to make sure that table-level tests show up in the manifest\n-- without a column_name field\n\n{{ config(enabled=False) }}\nselect 0\n\n{% endtest %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.989334, "supported_languages": null}, "macro.test.do_nothing": {"name": "do_nothing", "resource_type": "macro", "package_name": "test", "path": "macros/do_nothing.sql", "original_file_path": "macros/do_nothing.sql", "unique_id": "macro.test.do_nothing", "macro_sql": "{% macro do_nothing(foo2, bar2) %}\n select\n '{{ foo2 }}' as foo2,\n '{{ bar2 }}' as bar2\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.99017, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp": {"name": "postgres__current_timestamp", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp", "macro_sql": "{% macro postgres__current_timestamp() -%}\n now()\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.9916, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_string_as_time": {"name": "postgres__snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_string_as_time", "macro_sql": "{% macro postgres__snapshot_string_as_time(timestamp) -%}\n {%- set result = \"'\" ~ timestamp ~ \"'::timestamp without time zone\" -%}\n {{ return(result) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.9925592, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_get_time": {"name": "postgres__snapshot_get_time", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_get_time", "macro_sql": "{% macro postgres__snapshot_get_time() -%}\n {{ current_timestamp() }}::timestamp without time zone\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.9931011, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp_backcompat": {"name": "postgres__current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp_backcompat", "macro_sql": "{% macro postgres__current_timestamp_backcompat() %}\n current_timestamp::{{ type_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.993658, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat": {"name": "postgres__current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat", "macro_sql": "{% macro postgres__current_timestamp_in_utc_backcompat() %}\n (current_timestamp at time zone 'utc')::{{ type_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.994296, "supported_languages": null}, "macro.dbt_postgres.postgres__get_catalog": {"name": "postgres__get_catalog", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/catalog.sql", "original_file_path": "macros/catalog.sql", "unique_id": "macro.dbt_postgres.postgres__get_catalog", "macro_sql": "{% macro postgres__get_catalog(information_schema, schemas) -%}\n\n {%- call statement('catalog', fetch_result=True) -%}\n {#\n If the user has multiple databases set and the first one is wrong, this will fail.\n But we won't fail in the case where there are multiple quoting-difference-only dbs, which is better.\n #}\n {% set database = information_schema.database %}\n {{ adapter.verify_database(database) }}\n\n select\n '{{ database }}' as table_database,\n sch.nspname as table_schema,\n tbl.relname as table_name,\n case tbl.relkind\n when 'v' then 'VIEW'\n else 'BASE TABLE'\n end as table_type,\n tbl_desc.description as table_comment,\n col.attname as column_name,\n col.attnum as column_index,\n pg_catalog.format_type(col.atttypid, col.atttypmod) as column_type,\n col_desc.description as column_comment,\n pg_get_userbyid(tbl.relowner) as table_owner\n\n from pg_catalog.pg_namespace sch\n join pg_catalog.pg_class tbl on tbl.relnamespace = sch.oid\n join pg_catalog.pg_attribute col on col.attrelid = tbl.oid\n left outer join pg_catalog.pg_description tbl_desc on (tbl_desc.objoid = tbl.oid and tbl_desc.objsubid = 0)\n left outer join pg_catalog.pg_description col_desc on (col_desc.objoid = tbl.oid and col_desc.objsubid = col.attnum)\n\n where (\n {%- for schema in schemas -%}\n upper(sch.nspname) = upper('{{ schema }}'){%- if not loop.last %} or {% endif -%}\n {%- endfor -%}\n )\n and not pg_is_other_temp_schema(sch.oid) -- not a temporary schema belonging to another session\n and tbl.relpersistence in ('p', 'u') -- [p]ermanent table or [u]nlogged table. Exclude [t]emporary tables\n and tbl.relkind in ('r', 'v', 'f', 'p') -- o[r]dinary table, [v]iew, [f]oreign table, [p]artitioned table. Other values are [i]ndex, [S]equence, [c]omposite type, [t]OAST table, [m]aterialized view\n and col.attnum > 0 -- negative numbers are used for system columns such as oid\n and not col.attisdropped -- column as not been dropped\n\n order by\n sch.nspname,\n tbl.relname,\n col.attnum\n\n {%- endcall -%}\n\n {{ return(load_result('catalog').table) }}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765284.9990342, "supported_languages": null}, "macro.dbt_postgres.postgres_get_relations": {"name": "postgres_get_relations", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations.sql", "original_file_path": "macros/relations.sql", "unique_id": "macro.dbt_postgres.postgres_get_relations", "macro_sql": "{% macro postgres_get_relations () -%}\n\n {#\n -- in pg_depend, objid is the dependent, refobjid is the referenced object\n -- > a pg_depend entry indicates that the referenced object cannot be\n -- > dropped without also dropping the dependent object.\n #}\n\n {%- call statement('relations', fetch_result=True) -%}\n with relation as (\n select\n pg_rewrite.ev_class as class,\n pg_rewrite.oid as id\n from pg_rewrite\n ),\n class as (\n select\n oid as id,\n relname as name,\n relnamespace as schema,\n relkind as kind\n from pg_class\n ),\n dependency as (\n select distinct\n pg_depend.objid as id,\n pg_depend.refobjid as ref\n from pg_depend\n ),\n schema as (\n select\n pg_namespace.oid as id,\n pg_namespace.nspname as name\n from pg_namespace\n where nspname != 'information_schema' and nspname not like 'pg\\_%'\n ),\n referenced as (\n select\n relation.id AS id,\n referenced_class.name ,\n referenced_class.schema ,\n referenced_class.kind\n from relation\n join class as referenced_class on relation.class=referenced_class.id\n where referenced_class.kind in ('r', 'v')\n ),\n relationships as (\n select\n referenced.name as referenced_name,\n referenced.schema as referenced_schema_id,\n dependent_class.name as dependent_name,\n dependent_class.schema as dependent_schema_id,\n referenced.kind as kind\n from referenced\n join dependency on referenced.id=dependency.id\n join class as dependent_class on dependency.ref=dependent_class.id\n where\n (referenced.name != dependent_class.name or\n referenced.schema != dependent_class.schema)\n )\n\n select\n referenced_schema.name as referenced_schema,\n relationships.referenced_name as referenced_name,\n dependent_schema.name as dependent_schema,\n relationships.dependent_name as dependent_name\n from relationships\n join schema as dependent_schema on relationships.dependent_schema_id=dependent_schema.id\n join schema as referenced_schema on relationships.referenced_schema_id=referenced_schema.id\n group by referenced_schema, referenced_name, dependent_schema, dependent_name\n order by referenced_schema, referenced_name, dependent_schema, dependent_name;\n\n {%- endcall -%}\n\n {{ return(load_result('relations').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.001633, "supported_languages": null}, "macro.dbt_postgres.postgres__create_table_as": {"name": "postgres__create_table_as", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__create_table_as", "macro_sql": "{% macro postgres__create_table_as(temporary, relation, sql) -%}\n {%- set unlogged = config.get('unlogged', default=false) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n\n create {% if temporary -%}\n temporary\n {%- elif unlogged -%}\n unlogged\n {%- endif %} table {{ relation }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {{ get_table_columns_and_constraints() }} ;\n insert into {{ relation }} {{ get_column_names() }}\n {%- set sql = get_select_subquery(sql) %}\n {% else %}\n as\n {% endif %}\n (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_table_columns_and_constraints", "macro.dbt_postgres.get_column_names", "macro.dbt.get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.023157, "supported_languages": null}, "macro.dbt_postgres.postgres__get_create_index_sql": {"name": "postgres__get_create_index_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_create_index_sql", "macro_sql": "{% macro postgres__get_create_index_sql(relation, index_dict) -%}\n {%- set index_config = adapter.parse_index(index_dict) -%}\n {%- set comma_separated_columns = \", \".join(index_config.columns) -%}\n {%- set index_name = index_config.render(relation) -%}\n\n create {% if index_config.unique -%}\n unique\n {%- endif %} index if not exists\n \"{{ index_name }}\"\n on {{ relation }} {% if index_config.type -%}\n using {{ index_config.type }}\n {%- endif %}\n ({{ comma_separated_columns }});\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.025606, "supported_languages": null}, "macro.dbt_postgres.postgres__create_schema": {"name": "postgres__create_schema", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__create_schema", "macro_sql": "{% macro postgres__create_schema(relation) -%}\n {% if relation.database -%}\n {{ adapter.verify_database(relation.database) }}\n {%- endif -%}\n {%- call statement('create_schema') -%}\n create schema if not exists {{ relation.without_identifier().include(database=False) }}\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0267, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_schema": {"name": "postgres__drop_schema", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__drop_schema", "macro_sql": "{% macro postgres__drop_schema(relation) -%}\n {% if relation.database -%}\n {{ adapter.verify_database(relation.database) }}\n {%- endif -%}\n {%- call statement('drop_schema') -%}\n drop schema if exists {{ relation.without_identifier().include(database=False) }} cascade\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0277581, "supported_languages": null}, "macro.dbt_postgres.postgres__get_columns_in_relation": {"name": "postgres__get_columns_in_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_columns_in_relation", "macro_sql": "{% macro postgres__get_columns_in_relation(relation) -%}\n {% call statement('get_columns_in_relation', fetch_result=True) %}\n select\n column_name,\n data_type,\n character_maximum_length,\n numeric_precision,\n numeric_scale\n\n from {{ relation.information_schema('columns') }}\n where table_name = '{{ relation.identifier }}'\n {% if relation.schema %}\n and table_schema = '{{ relation.schema }}'\n {% endif %}\n order by ordinal_position\n\n {% endcall %}\n {% set table = load_result('get_columns_in_relation').table %}\n {{ return(sql_convert_columns_in_relation(table)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.sql_convert_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0293078, "supported_languages": null}, "macro.dbt_postgres.postgres__list_relations_without_caching": {"name": "postgres__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__list_relations_without_caching", "macro_sql": "{% macro postgres__list_relations_without_caching(schema_relation) %}\n {% call statement('list_relations_without_caching', fetch_result=True) -%}\n select\n '{{ schema_relation.database }}' as database,\n tablename as name,\n schemaname as schema,\n 'table' as type\n from pg_tables\n where schemaname ilike '{{ schema_relation.schema }}'\n union all\n select\n '{{ schema_relation.database }}' as database,\n viewname as name,\n schemaname as schema,\n 'view' as type\n from pg_views\n where schemaname ilike '{{ schema_relation.schema }}'\n {% endcall %}\n {{ return(load_result('list_relations_without_caching').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0309381, "supported_languages": null}, "macro.dbt_postgres.postgres__information_schema_name": {"name": "postgres__information_schema_name", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__information_schema_name", "macro_sql": "{% macro postgres__information_schema_name(database) -%}\n {% if database_name -%}\n {{ adapter.verify_database(database_name) }}\n {%- endif -%}\n information_schema\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.031904, "supported_languages": null}, "macro.dbt_postgres.postgres__list_schemas": {"name": "postgres__list_schemas", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__list_schemas", "macro_sql": "{% macro postgres__list_schemas(database) %}\n {% if database -%}\n {{ adapter.verify_database(database) }}\n {%- endif -%}\n {% call statement('list_schemas', fetch_result=True, auto_begin=False) %}\n select distinct nspname from pg_namespace\n {% endcall %}\n {{ return(load_result('list_schemas').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0337138, "supported_languages": null}, "macro.dbt_postgres.postgres__check_schema_exists": {"name": "postgres__check_schema_exists", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__check_schema_exists", "macro_sql": "{% macro postgres__check_schema_exists(information_schema, schema) -%}\n {% if information_schema.database -%}\n {{ adapter.verify_database(information_schema.database) }}\n {%- endif -%}\n {% call statement('check_schema_exists', fetch_result=True, auto_begin=False) %}\n select count(*) from pg_namespace where nspname = '{{ schema }}'\n {% endcall %}\n {{ return(load_result('check_schema_exists').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0352619, "supported_languages": null}, "macro.dbt_postgres.postgres__make_relation_with_suffix": {"name": "postgres__make_relation_with_suffix", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_relation_with_suffix", "macro_sql": "{% macro postgres__make_relation_with_suffix(base_relation, suffix, dstring) %}\n {% if dstring %}\n {% set dt = modules.datetime.datetime.now() %}\n {% set dtstring = dt.strftime(\"%H%M%S%f\") %}\n {% set suffix = suffix ~ dtstring %}\n {% endif %}\n {% set suffix_length = suffix|length %}\n {% set relation_max_name_length = base_relation.relation_max_name_length() %}\n {% if suffix_length > relation_max_name_length %}\n {% do exceptions.raise_compiler_error('Relation suffix is too long (' ~ suffix_length ~ ' characters). Maximum length is ' ~ relation_max_name_length ~ ' characters.') %}\n {% endif %}\n {% set identifier = base_relation.identifier[:relation_max_name_length - suffix_length] ~ suffix %}\n\n {{ return(base_relation.incorporate(path={\"identifier\": identifier })) }}\n\n {% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.038024, "supported_languages": null}, "macro.dbt_postgres.postgres__make_intermediate_relation": {"name": "postgres__make_intermediate_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_intermediate_relation", "macro_sql": "{% macro postgres__make_intermediate_relation(base_relation, suffix) %}\n {{ return(postgres__make_relation_with_suffix(base_relation, suffix, dstring=False)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.038731, "supported_languages": null}, "macro.dbt_postgres.postgres__make_temp_relation": {"name": "postgres__make_temp_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_temp_relation", "macro_sql": "{% macro postgres__make_temp_relation(base_relation, suffix) %}\n {% set temp_relation = postgres__make_relation_with_suffix(base_relation, suffix, dstring=True) %}\n {{ return(temp_relation.incorporate(path={\"schema\": none,\n \"database\": none})) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.040375, "supported_languages": null}, "macro.dbt_postgres.postgres__make_backup_relation": {"name": "postgres__make_backup_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_backup_relation", "macro_sql": "{% macro postgres__make_backup_relation(base_relation, backup_relation_type, suffix) %}\n {% set backup_relation = postgres__make_relation_with_suffix(base_relation, suffix, dstring=False) %}\n {{ return(backup_relation.incorporate(type=backup_relation_type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.041929, "supported_languages": null}, "macro.dbt_postgres.postgres_escape_comment": {"name": "postgres_escape_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres_escape_comment", "macro_sql": "{% macro postgres_escape_comment(comment) -%}\n {% if comment is not string %}\n {% do exceptions.raise_compiler_error('cannot escape a non-string: ' ~ comment) %}\n {% endif %}\n {%- set magic = '$dbt_comment_literal_block$' -%}\n {%- if magic in comment -%}\n {%- do exceptions.raise_compiler_error('The string ' ~ magic ~ ' is not allowed in comments.') -%}\n {%- endif -%}\n {{ magic }}{{ comment }}{{ magic }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.044319, "supported_languages": null}, "macro.dbt_postgres.postgres__alter_relation_comment": {"name": "postgres__alter_relation_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__alter_relation_comment", "macro_sql": "{% macro postgres__alter_relation_comment(relation, comment) %}\n {% set escaped_comment = postgres_escape_comment(comment) %}\n comment on {{ relation.type }} {{ relation }} is {{ escaped_comment }};\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres_escape_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0456471, "supported_languages": null}, "macro.dbt_postgres.postgres__alter_column_comment": {"name": "postgres__alter_column_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__alter_column_comment", "macro_sql": "{% macro postgres__alter_column_comment(relation, column_dict) %}\n {% set existing_columns = adapter.get_columns_in_relation(relation) | map(attribute=\"name\") | list %}\n {% for column_name in column_dict if (column_name in existing_columns) %}\n {% set comment = column_dict[column_name]['description'] %}\n {% set escaped_comment = postgres_escape_comment(comment) %}\n comment on column {{ relation }}.{{ adapter.quote(column_name) if column_dict[column_name]['quote'] else column_name }} is {{ escaped_comment }};\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres_escape_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.047966, "supported_languages": null}, "macro.dbt_postgres.postgres__get_show_grant_sql": {"name": "postgres__get_show_grant_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_show_grant_sql", "macro_sql": "\n\n{%- macro postgres__get_show_grant_sql(relation) -%}\n select grantee, privilege_type\n from {{ relation.information_schema('role_table_grants') }}\n where grantor = current_role\n and grantee != current_role\n and table_schema = '{{ relation.schema }}'\n and table_name = '{{ relation.identifier }}'\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.048686, "supported_languages": null}, "macro.dbt_postgres.postgres__copy_grants": {"name": "postgres__copy_grants", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__copy_grants", "macro_sql": "{% macro postgres__copy_grants() %}\n {{ return(False) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0490959, "supported_languages": null}, "macro.dbt_postgres.postgres__get_incremental_default_sql": {"name": "postgres__get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/incremental_strategies.sql", "original_file_path": "macros/materializations/incremental_strategies.sql", "unique_id": "macro.dbt_postgres.postgres__get_incremental_default_sql", "macro_sql": "{% macro postgres__get_incremental_default_sql(arg_dict) %}\n\n {% if arg_dict[\"unique_key\"] %}\n {% do return(get_incremental_delete_insert_sql(arg_dict)) %}\n {% else %}\n {% do return(get_incremental_append_sql(arg_dict)) %}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_incremental_delete_insert_sql", "macro.dbt.get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0503528, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_merge_sql": {"name": "postgres__snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/snapshot_merge.sql", "original_file_path": "macros/materializations/snapshot_merge.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_merge_sql", "macro_sql": "{% macro postgres__snapshot_merge_sql(target, source, insert_cols) -%}\n {%- set insert_cols_csv = insert_cols | join(', ') -%}\n\n update {{ target }}\n set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to\n from {{ source }} as DBT_INTERNAL_SOURCE\n where DBT_INTERNAL_SOURCE.dbt_scd_id::text = {{ target }}.dbt_scd_id::text\n and DBT_INTERNAL_SOURCE.dbt_change_type::text in ('update'::text, 'delete'::text)\n and {{ target }}.dbt_valid_to is null;\n\n insert into {{ target }} ({{ insert_cols_csv }})\n select {% for column in insert_cols -%}\n DBT_INTERNAL_SOURCE.{{ column }} {%- if not loop.last %}, {%- endif %}\n {%- endfor %}\n from {{ source }} as DBT_INTERNAL_SOURCE\n where DBT_INTERNAL_SOURCE.dbt_change_type::text = 'insert'::text;\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.052476, "supported_languages": null}, "macro.dbt_postgres.get_column_names": {"name": "get_column_names", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/columns_spec_ddl.sql", "original_file_path": "macros/utils/columns_spec_ddl.sql", "unique_id": "macro.dbt_postgres.get_column_names", "macro_sql": "{% macro get_column_names() %}\n {# loop through user_provided_columns to get column names #}\n {%- set user_provided_columns = model['columns'] -%}\n (\n {% for i in user_provided_columns %}\n {% set col = user_provided_columns[i] %}\n {{ col['name'] }} {{ \",\" if not loop.last }}\n {% endfor %}\n )\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.053956, "supported_languages": null}, "macro.dbt_postgres.postgres__dateadd": {"name": "postgres__dateadd", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/dateadd.sql", "original_file_path": "macros/utils/dateadd.sql", "unique_id": "macro.dbt_postgres.postgres__dateadd", "macro_sql": "{% macro postgres__dateadd(datepart, interval, from_date_or_timestamp) %}\n\n {{ from_date_or_timestamp }} + ((interval '1 {{ datepart }}') * ({{ interval }}))\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.054674, "supported_languages": null}, "macro.dbt_postgres.postgres__listagg": {"name": "postgres__listagg", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/listagg.sql", "original_file_path": "macros/utils/listagg.sql", "unique_id": "macro.dbt_postgres.postgres__listagg", "macro_sql": "{% macro postgres__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}\n\n {% if limit_num -%}\n array_to_string(\n (array_agg(\n {{ measure }}\n {% if order_by_clause -%}\n {{ order_by_clause }}\n {%- endif %}\n ))[1:{{ limit_num }}],\n {{ delimiter_text }}\n )\n {%- else %}\n string_agg(\n {{ measure }},\n {{ delimiter_text }}\n {% if order_by_clause -%}\n {{ order_by_clause }}\n {%- endif %}\n )\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.057587, "supported_languages": null}, "macro.dbt_postgres.postgres__datediff": {"name": "postgres__datediff", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/datediff.sql", "original_file_path": "macros/utils/datediff.sql", "unique_id": "macro.dbt_postgres.postgres__datediff", "macro_sql": "{% macro postgres__datediff(first_date, second_date, datepart) -%}\n\n {% if datepart == 'year' %}\n (date_part('year', ({{second_date}})::date) - date_part('year', ({{first_date}})::date))\n {% elif datepart == 'quarter' %}\n ({{ datediff(first_date, second_date, 'year') }} * 4 + date_part('quarter', ({{second_date}})::date) - date_part('quarter', ({{first_date}})::date))\n {% elif datepart == 'month' %}\n ({{ datediff(first_date, second_date, 'year') }} * 12 + date_part('month', ({{second_date}})::date) - date_part('month', ({{first_date}})::date))\n {% elif datepart == 'day' %}\n (({{second_date}})::date - ({{first_date}})::date)\n {% elif datepart == 'week' %}\n ({{ datediff(first_date, second_date, 'day') }} / 7 + case\n when date_part('dow', ({{first_date}})::timestamp) <= date_part('dow', ({{second_date}})::timestamp) then\n case when {{first_date}} <= {{second_date}} then 0 else -1 end\n else\n case when {{first_date}} <= {{second_date}} then 1 else 0 end\n end)\n {% elif datepart == 'hour' %}\n ({{ datediff(first_date, second_date, 'day') }} * 24 + date_part('hour', ({{second_date}})::timestamp) - date_part('hour', ({{first_date}})::timestamp))\n {% elif datepart == 'minute' %}\n ({{ datediff(first_date, second_date, 'hour') }} * 60 + date_part('minute', ({{second_date}})::timestamp) - date_part('minute', ({{first_date}})::timestamp))\n {% elif datepart == 'second' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60 + floor(date_part('second', ({{second_date}})::timestamp)) - floor(date_part('second', ({{first_date}})::timestamp)))\n {% elif datepart == 'millisecond' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60000 + floor(date_part('millisecond', ({{second_date}})::timestamp)) - floor(date_part('millisecond', ({{first_date}})::timestamp)))\n {% elif datepart == 'microsecond' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60000000 + floor(date_part('microsecond', ({{second_date}})::timestamp)) - floor(date_part('microsecond', ({{first_date}})::timestamp)))\n {% else %}\n {{ exceptions.raise_compiler_error(\"Unsupported datepart for macro datediff in postgres: {!r}\".format(datepart)) }}\n {% endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.068467, "supported_languages": null}, "macro.dbt_postgres.postgres__any_value": {"name": "postgres__any_value", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/any_value.sql", "original_file_path": "macros/utils/any_value.sql", "unique_id": "macro.dbt_postgres.postgres__any_value", "macro_sql": "{% macro postgres__any_value(expression) -%}\n\n min({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.069037, "supported_languages": null}, "macro.dbt_postgres.postgres__last_day": {"name": "postgres__last_day", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt_postgres.postgres__last_day", "macro_sql": "{% macro postgres__last_day(date, datepart) -%}\n\n {%- if datepart == 'quarter' -%}\n -- postgres dateadd does not support quarter interval.\n cast(\n {{dbt.dateadd('day', '-1',\n dbt.dateadd('month', '3', dbt.date_trunc(datepart, date))\n )}}\n as date)\n {%- else -%}\n {{dbt.default_last_day(date, datepart)}}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.date_trunc", "macro.dbt.default_last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.070621, "supported_languages": null}, "macro.dbt_postgres.postgres__split_part": {"name": "postgres__split_part", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt_postgres.postgres__split_part", "macro_sql": "{% macro postgres__split_part(string_text, delimiter_text, part_number) %}\n\n {% if part_number >= 0 %}\n {{ dbt.default__split_part(string_text, delimiter_text, part_number) }}\n {% else %}\n {{ dbt._split_part_negative(string_text, delimiter_text, part_number) }}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__split_part", "macro.dbt._split_part_negative"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0719318, "supported_languages": null}, "macro.dbt.run_hooks": {"name": "run_hooks", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.run_hooks", "macro_sql": "{% macro run_hooks(hooks, inside_transaction=True) %}\n {% for hook in hooks | selectattr('transaction', 'equalto', inside_transaction) %}\n {% if not inside_transaction and loop.first %}\n {% call statement(auto_begin=inside_transaction) %}\n commit;\n {% endcall %}\n {% endif %}\n {% set rendered = render(hook.get('sql')) | trim %}\n {% if (rendered | length) > 0 %}\n {% call statement(auto_begin=inside_transaction) %}\n {{ rendered }}\n {% endcall %}\n {% endif %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.07588, "supported_languages": null}, "macro.dbt.make_hook_config": {"name": "make_hook_config", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.make_hook_config", "macro_sql": "{% macro make_hook_config(sql, inside_transaction) %}\n {{ tojson({\"sql\": sql, \"transaction\": inside_transaction}) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.076942, "supported_languages": null}, "macro.dbt.before_begin": {"name": "before_begin", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.before_begin", "macro_sql": "{% macro before_begin(sql) %}\n {{ make_hook_config(sql, inside_transaction=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.077777, "supported_languages": null}, "macro.dbt.in_transaction": {"name": "in_transaction", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.in_transaction", "macro_sql": "{% macro in_transaction(sql) %}\n {{ make_hook_config(sql, inside_transaction=True) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.078659, "supported_languages": null}, "macro.dbt.after_commit": {"name": "after_commit", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.after_commit", "macro_sql": "{% macro after_commit(sql) %}\n {{ make_hook_config(sql, inside_transaction=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0794592, "supported_languages": null}, "macro.dbt.set_sql_header": {"name": "set_sql_header", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/configs.sql", "original_file_path": "macros/materializations/configs.sql", "unique_id": "macro.dbt.set_sql_header", "macro_sql": "{% macro set_sql_header(config) -%}\n {{ config.set('sql_header', caller()) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.0811782, "supported_languages": null}, "macro.dbt.should_full_refresh": {"name": "should_full_refresh", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/configs.sql", "original_file_path": "macros/materializations/configs.sql", "unique_id": "macro.dbt.should_full_refresh", "macro_sql": "{% macro should_full_refresh() %}\n {% set config_full_refresh = config.get('full_refresh') %}\n {% if config_full_refresh is none %}\n {% set config_full_refresh = flags.FULL_REFRESH %}\n {% endif %}\n {% do return(config_full_refresh) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.082933, "supported_languages": null}, "macro.dbt.should_store_failures": {"name": "should_store_failures", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/configs.sql", "original_file_path": "macros/materializations/configs.sql", "unique_id": "macro.dbt.should_store_failures", "macro_sql": "{% macro should_store_failures() %}\n {% set config_store_failures = config.get('store_failures') %}\n {% if config_store_failures is none %}\n {% set config_store_failures = flags.STORE_FAILURES %}\n {% endif %}\n {% do return(config_store_failures) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.08456, "supported_languages": null}, "macro.dbt.snapshot_merge_sql": {"name": "snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/snapshot_merge.sql", "original_file_path": "macros/materializations/snapshots/snapshot_merge.sql", "unique_id": "macro.dbt.snapshot_merge_sql", "macro_sql": "{% macro snapshot_merge_sql(target, source, insert_cols) -%}\n {{ adapter.dispatch('snapshot_merge_sql', 'dbt')(target, source, insert_cols) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__snapshot_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.086729, "supported_languages": null}, "macro.dbt.default__snapshot_merge_sql": {"name": "default__snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/snapshot_merge.sql", "original_file_path": "macros/materializations/snapshots/snapshot_merge.sql", "unique_id": "macro.dbt.default__snapshot_merge_sql", "macro_sql": "{% macro default__snapshot_merge_sql(target, source, insert_cols) -%}\n {%- set insert_cols_csv = insert_cols | join(', ') -%}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on DBT_INTERNAL_SOURCE.dbt_scd_id = DBT_INTERNAL_DEST.dbt_scd_id\n\n when matched\n and DBT_INTERNAL_DEST.dbt_valid_to is null\n and DBT_INTERNAL_SOURCE.dbt_change_type in ('update', 'delete')\n then update\n set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to\n\n when not matched\n and DBT_INTERNAL_SOURCE.dbt_change_type = 'insert'\n then insert ({{ insert_cols_csv }})\n values ({{ insert_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.088037, "supported_languages": null}, "macro.dbt.strategy_dispatch": {"name": "strategy_dispatch", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.strategy_dispatch", "macro_sql": "{% macro strategy_dispatch(name) -%}\n{% set original_name = name %}\n {% if '.' in name %}\n {% set package_name, name = name.split(\".\", 1) %}\n {% else %}\n {% set package_name = none %}\n {% endif %}\n\n {% if package_name is none %}\n {% set package_context = context %}\n {% elif package_name in context %}\n {% set package_context = context[package_name] %}\n {% else %}\n {% set error_msg %}\n Could not find package '{{package_name}}', called with '{{original_name}}'\n {% endset %}\n {{ exceptions.raise_compiler_error(error_msg | trim) }}\n {% endif %}\n\n {%- set search_name = 'snapshot_' ~ name ~ '_strategy' -%}\n\n {% if search_name not in package_context %}\n {% set error_msg %}\n The specified strategy macro '{{name}}' was not found in package '{{ package_name }}'\n {% endset %}\n {{ exceptions.raise_compiler_error(error_msg | trim) }}\n {% endif %}\n {{ return(package_context[search_name]) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.100239, "supported_languages": null}, "macro.dbt.snapshot_hash_arguments": {"name": "snapshot_hash_arguments", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_hash_arguments", "macro_sql": "{% macro snapshot_hash_arguments(args) -%}\n {{ adapter.dispatch('snapshot_hash_arguments', 'dbt')(args) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.100829, "supported_languages": null}, "macro.dbt.default__snapshot_hash_arguments": {"name": "default__snapshot_hash_arguments", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.default__snapshot_hash_arguments", "macro_sql": "{% macro default__snapshot_hash_arguments(args) -%}\n md5({%- for arg in args -%}\n coalesce(cast({{ arg }} as varchar ), '')\n {% if not loop.last %} || '|' || {% endif %}\n {%- endfor -%})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.101579, "supported_languages": null}, "macro.dbt.snapshot_timestamp_strategy": {"name": "snapshot_timestamp_strategy", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_timestamp_strategy", "macro_sql": "{% macro snapshot_timestamp_strategy(node, snapshotted_rel, current_rel, config, target_exists) %}\n {% set primary_key = config['unique_key'] %}\n {% set updated_at = config['updated_at'] %}\n {% set invalidate_hard_deletes = config.get('invalidate_hard_deletes', false) %}\n\n {#/*\n The snapshot relation might not have an {{ updated_at }} value if the\n snapshot strategy is changed from `check` to `timestamp`. We\n should use a dbt-created column for the comparison in the snapshot\n table instead of assuming that the user-supplied {{ updated_at }}\n will be present in the historical data.\n\n See https://github.com/dbt-labs/dbt-core/issues/2350\n */ #}\n {% set row_changed_expr -%}\n ({{ snapshotted_rel }}.dbt_valid_from < {{ current_rel }}.{{ updated_at }})\n {%- endset %}\n\n {% set scd_id_expr = snapshot_hash_arguments([primary_key, updated_at]) %}\n\n {% do return({\n \"unique_key\": primary_key,\n \"updated_at\": updated_at,\n \"row_changed\": row_changed_expr,\n \"scd_id\": scd_id_expr,\n \"invalidate_hard_deletes\": invalidate_hard_deletes\n }) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.104542, "supported_languages": null}, "macro.dbt.snapshot_string_as_time": {"name": "snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_string_as_time", "macro_sql": "{% macro snapshot_string_as_time(timestamp) -%}\n {{ adapter.dispatch('snapshot_string_as_time', 'dbt')(timestamp) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__snapshot_string_as_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.105419, "supported_languages": null}, "macro.dbt.default__snapshot_string_as_time": {"name": "default__snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.default__snapshot_string_as_time", "macro_sql": "{% macro default__snapshot_string_as_time(timestamp) %}\n {% do exceptions.raise_not_implemented(\n 'snapshot_string_as_time macro not implemented for adapter '+adapter.type()\n ) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.106352, "supported_languages": null}, "macro.dbt.snapshot_check_all_get_existing_columns": {"name": "snapshot_check_all_get_existing_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_check_all_get_existing_columns", "macro_sql": "{% macro snapshot_check_all_get_existing_columns(node, target_exists, check_cols_config) -%}\n {%- if not target_exists -%}\n {#-- no table yet -> return whatever the query does --#}\n {{ return((false, query_columns)) }}\n {%- endif -%}\n\n {#-- handle any schema changes --#}\n {%- set target_relation = adapter.get_relation(database=node.database, schema=node.schema, identifier=node.alias) -%}\n\n {% if check_cols_config == 'all' %}\n {%- set query_columns = get_columns_in_query(node['compiled_code']) -%}\n\n {% elif check_cols_config is iterable and (check_cols_config | length) > 0 %}\n {#-- query for proper casing/quoting, to support comparison below --#}\n {%- set select_check_cols_from_target -%}\n {#-- N.B. The whitespace below is necessary to avoid edge case issue with comments --#}\n {#-- See: https://github.com/dbt-labs/dbt-core/issues/6781 --#}\n select {{ check_cols_config | join(', ') }} from (\n {{ node['compiled_code'] }}\n ) subq\n {%- endset -%}\n {% set query_columns = get_columns_in_query(select_check_cols_from_target) %}\n\n {% else %}\n {% do exceptions.raise_compiler_error(\"Invalid value for 'check_cols': \" ~ check_cols_config) %}\n {% endif %}\n\n {%- set existing_cols = adapter.get_columns_in_relation(target_relation) | map(attribute = 'name') | list -%}\n {%- set ns = namespace() -%} {#-- handle for-loop scoping with a namespace --#}\n {%- set ns.column_added = false -%}\n\n {%- set intersection = [] -%}\n {%- for col in query_columns -%}\n {%- if col in existing_cols -%}\n {%- do intersection.append(adapter.quote(col)) -%}\n {%- else -%}\n {% set ns.column_added = true %}\n {%- endif -%}\n {%- endfor -%}\n {{ return((ns.column_added, intersection)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_columns_in_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.113815, "supported_languages": null}, "macro.dbt.snapshot_check_strategy": {"name": "snapshot_check_strategy", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_check_strategy", "macro_sql": "{% macro snapshot_check_strategy(node, snapshotted_rel, current_rel, config, target_exists) %}\n {% set check_cols_config = config['check_cols'] %}\n {% set primary_key = config['unique_key'] %}\n {% set invalidate_hard_deletes = config.get('invalidate_hard_deletes', false) %}\n {% set updated_at = config.get('updated_at', snapshot_get_time()) %}\n\n {% set column_added = false %}\n\n {% set column_added, check_cols = snapshot_check_all_get_existing_columns(node, target_exists, check_cols_config) %}\n\n {%- set row_changed_expr -%}\n (\n {%- if column_added -%}\n {{ get_true_sql() }}\n {%- else -%}\n {%- for col in check_cols -%}\n {{ snapshotted_rel }}.{{ col }} != {{ current_rel }}.{{ col }}\n or\n (\n (({{ snapshotted_rel }}.{{ col }} is null) and not ({{ current_rel }}.{{ col }} is null))\n or\n ((not {{ snapshotted_rel }}.{{ col }} is null) and ({{ current_rel }}.{{ col }} is null))\n )\n {%- if not loop.last %} or {% endif -%}\n {%- endfor -%}\n {%- endif -%}\n )\n {%- endset %}\n\n {% set scd_id_expr = snapshot_hash_arguments([primary_key, updated_at]) %}\n\n {% do return({\n \"unique_key\": primary_key,\n \"updated_at\": updated_at,\n \"row_changed\": row_changed_expr,\n \"scd_id\": scd_id_expr,\n \"invalidate_hard_deletes\": invalidate_hard_deletes\n }) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_get_time", "macro.dbt.snapshot_check_all_get_existing_columns", "macro.dbt.get_true_sql", "macro.dbt.snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.119117, "supported_languages": null}, "macro.dbt.create_columns": {"name": "create_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.create_columns", "macro_sql": "{% macro create_columns(relation, columns) %}\n {{ adapter.dispatch('create_columns', 'dbt')(relation, columns) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.1292858, "supported_languages": null}, "macro.dbt.default__create_columns": {"name": "default__create_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__create_columns", "macro_sql": "{% macro default__create_columns(relation, columns) %}\n {% for column in columns %}\n {% call statement() %}\n alter table {{ relation }} add column \"{{ column.name }}\" {{ column.data_type }};\n {% endcall %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.130292, "supported_languages": null}, "macro.dbt.post_snapshot": {"name": "post_snapshot", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.post_snapshot", "macro_sql": "{% macro post_snapshot(staging_relation) %}\n {{ adapter.dispatch('post_snapshot', 'dbt')(staging_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.130888, "supported_languages": null}, "macro.dbt.default__post_snapshot": {"name": "default__post_snapshot", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__post_snapshot", "macro_sql": "{% macro default__post_snapshot(staging_relation) %}\n {# no-op #}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.131217, "supported_languages": null}, "macro.dbt.get_true_sql": {"name": "get_true_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.get_true_sql", "macro_sql": "{% macro get_true_sql() %}\n {{ adapter.dispatch('get_true_sql', 'dbt')() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_true_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.1317189, "supported_languages": null}, "macro.dbt.default__get_true_sql": {"name": "default__get_true_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__get_true_sql", "macro_sql": "{% macro default__get_true_sql() %}\n {{ return('TRUE') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.132121, "supported_languages": null}, "macro.dbt.snapshot_staging_table": {"name": "snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.snapshot_staging_table", "macro_sql": "{% macro snapshot_staging_table(strategy, source_sql, target_relation) -%}\n {{ adapter.dispatch('snapshot_staging_table', 'dbt')(strategy, source_sql, target_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__snapshot_staging_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.132813, "supported_languages": null}, "macro.dbt.default__snapshot_staging_table": {"name": "default__snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__snapshot_staging_table", "macro_sql": "{% macro default__snapshot_staging_table(strategy, source_sql, target_relation) -%}\n\n with snapshot_query as (\n\n {{ source_sql }}\n\n ),\n\n snapshotted_data as (\n\n select *,\n {{ strategy.unique_key }} as dbt_unique_key\n\n from {{ target_relation }}\n where dbt_valid_to is null\n\n ),\n\n insertions_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_unique_key,\n {{ strategy.updated_at }} as dbt_updated_at,\n {{ strategy.updated_at }} as dbt_valid_from,\n nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}) as dbt_valid_to,\n {{ strategy.scd_id }} as dbt_scd_id\n\n from snapshot_query\n ),\n\n updates_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_unique_key,\n {{ strategy.updated_at }} as dbt_updated_at,\n {{ strategy.updated_at }} as dbt_valid_from,\n {{ strategy.updated_at }} as dbt_valid_to\n\n from snapshot_query\n ),\n\n {%- if strategy.invalidate_hard_deletes %}\n\n deletes_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_unique_key\n from snapshot_query\n ),\n {% endif %}\n\n insertions as (\n\n select\n 'insert' as dbt_change_type,\n source_data.*\n\n from insertions_source_data as source_data\n left outer join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where snapshotted_data.dbt_unique_key is null\n or (\n snapshotted_data.dbt_unique_key is not null\n and (\n {{ strategy.row_changed }}\n )\n )\n\n ),\n\n updates as (\n\n select\n 'update' as dbt_change_type,\n source_data.*,\n snapshotted_data.dbt_scd_id\n\n from updates_source_data as source_data\n join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where (\n {{ strategy.row_changed }}\n )\n )\n\n {%- if strategy.invalidate_hard_deletes -%}\n ,\n\n deletes as (\n\n select\n 'delete' as dbt_change_type,\n source_data.*,\n {{ snapshot_get_time() }} as dbt_valid_from,\n {{ snapshot_get_time() }} as dbt_updated_at,\n {{ snapshot_get_time() }} as dbt_valid_to,\n snapshotted_data.dbt_scd_id\n\n from snapshotted_data\n left join deletes_source_data as source_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where source_data.dbt_unique_key is null\n )\n {%- endif %}\n\n select * from insertions\n union all\n select * from updates\n {%- if strategy.invalidate_hard_deletes %}\n union all\n select * from deletes\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.135626, "supported_languages": null}, "macro.dbt.build_snapshot_table": {"name": "build_snapshot_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.build_snapshot_table", "macro_sql": "{% macro build_snapshot_table(strategy, sql) -%}\n {{ adapter.dispatch('build_snapshot_table', 'dbt')(strategy, sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__build_snapshot_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.136369, "supported_languages": null}, "macro.dbt.default__build_snapshot_table": {"name": "default__build_snapshot_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__build_snapshot_table", "macro_sql": "{% macro default__build_snapshot_table(strategy, sql) %}\n\n select *,\n {{ strategy.scd_id }} as dbt_scd_id,\n {{ strategy.updated_at }} as dbt_updated_at,\n {{ strategy.updated_at }} as dbt_valid_from,\n nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}) as dbt_valid_to\n from (\n {{ sql }}\n ) sbq\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.137247, "supported_languages": null}, "macro.dbt.build_snapshot_staging_table": {"name": "build_snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.build_snapshot_staging_table", "macro_sql": "{% macro build_snapshot_staging_table(strategy, sql, target_relation) %}\n {% set temp_relation = make_temp_relation(target_relation) %}\n\n {% set select = snapshot_staging_table(strategy, sql, target_relation) %}\n\n {% call statement('build_snapshot_staging_relation') %}\n {{ create_table_as(True, temp_relation, select) }}\n {% endcall %}\n\n {% do return(temp_relation) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_temp_relation", "macro.dbt.snapshot_staging_table", "macro.dbt.statement", "macro.dbt.create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.1386938, "supported_languages": null}, "macro.dbt.materialization_snapshot_default": {"name": "materialization_snapshot_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/snapshot.sql", "original_file_path": "macros/materializations/snapshots/snapshot.sql", "unique_id": "macro.dbt.materialization_snapshot_default", "macro_sql": "{% materialization snapshot, default %}\n {%- set config = model['config'] -%}\n\n {%- set target_table = model.get('alias', model.get('name')) -%}\n\n {%- set strategy_name = config.get('strategy') -%}\n {%- set unique_key = config.get('unique_key') %}\n -- grab current tables grants config for comparision later on\n {%- set grant_config = config.get('grants') -%}\n\n {% set target_relation_exists, target_relation = get_or_create_relation(\n database=model.database,\n schema=model.schema,\n identifier=target_table,\n type='table') -%}\n\n {%- if not target_relation.is_table -%}\n {% do exceptions.relation_wrong_type(target_relation, 'table') %}\n {%- endif -%}\n\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set strategy_macro = strategy_dispatch(strategy_name) %}\n {% set strategy = strategy_macro(model, \"snapshotted_data\", \"source_data\", config, target_relation_exists) %}\n\n {% if not target_relation_exists %}\n\n {% set build_sql = build_snapshot_table(strategy, model['compiled_code']) %}\n {% set final_sql = create_table_as(False, target_relation, build_sql) %}\n\n {% else %}\n\n {{ adapter.valid_snapshot_target(target_relation) }}\n\n {% set staging_table = build_snapshot_staging_table(strategy, sql, target_relation) %}\n\n -- this may no-op if the database does not require column expansion\n {% do adapter.expand_target_column_types(from_relation=staging_table,\n to_relation=target_relation) %}\n\n {% set missing_columns = adapter.get_missing_columns(staging_table, target_relation)\n | rejectattr('name', 'equalto', 'dbt_change_type')\n | rejectattr('name', 'equalto', 'DBT_CHANGE_TYPE')\n | rejectattr('name', 'equalto', 'dbt_unique_key')\n | rejectattr('name', 'equalto', 'DBT_UNIQUE_KEY')\n | list %}\n\n {% do create_columns(target_relation, missing_columns) %}\n\n {% set source_columns = adapter.get_columns_in_relation(staging_table)\n | rejectattr('name', 'equalto', 'dbt_change_type')\n | rejectattr('name', 'equalto', 'DBT_CHANGE_TYPE')\n | rejectattr('name', 'equalto', 'dbt_unique_key')\n | rejectattr('name', 'equalto', 'DBT_UNIQUE_KEY')\n | list %}\n\n {% set quoted_source_columns = [] %}\n {% for column in source_columns %}\n {% do quoted_source_columns.append(adapter.quote(column.name)) %}\n {% endfor %}\n\n {% set final_sql = snapshot_merge_sql(\n target = target_relation,\n source = staging_table,\n insert_cols = quoted_source_columns\n )\n %}\n\n {% endif %}\n\n {% call statement('main') %}\n {{ final_sql }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(target_relation_exists, full_refresh_mode=False) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if not target_relation_exists %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n {% if staging_table is defined %}\n {% do post_snapshot(staging_table) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.get_or_create_relation", "macro.dbt.run_hooks", "macro.dbt.strategy_dispatch", "macro.dbt.build_snapshot_table", "macro.dbt.create_table_as", "macro.dbt.build_snapshot_staging_table", "macro.dbt.create_columns", "macro.dbt.snapshot_merge_sql", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes", "macro.dbt.post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.1590972, "supported_languages": ["sql"]}, "macro.dbt.materialization_test_default": {"name": "materialization_test_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/test.sql", "original_file_path": "macros/materializations/tests/test.sql", "unique_id": "macro.dbt.materialization_test_default", "macro_sql": "{%- materialization test, default -%}\n\n {% set relations = [] %}\n\n {% if should_store_failures() %}\n\n {% set identifier = model['alias'] %}\n {% set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) %}\n {% set target_relation = api.Relation.create(\n identifier=identifier, schema=schema, database=database, type='table') -%} %}\n\n {% if old_relation %}\n {% do adapter.drop_relation(old_relation) %}\n {% endif %}\n\n {% call statement(auto_begin=True) %}\n {{ create_table_as(False, target_relation, sql) }}\n {% endcall %}\n\n {% do relations.append(target_relation) %}\n\n {% set main_sql %}\n select *\n from {{ target_relation }}\n {% endset %}\n\n {{ adapter.commit() }}\n\n {% else %}\n\n {% set main_sql = sql %}\n\n {% endif %}\n\n {% set limit = config.get('limit') %}\n {% set fail_calc = config.get('fail_calc') %}\n {% set warn_if = config.get('warn_if') %}\n {% set error_if = config.get('error_if') %}\n\n {% call statement('main', fetch_result=True) -%}\n\n {{ get_test_sql(main_sql, fail_calc, warn_if, error_if, limit)}}\n\n {%- endcall %}\n\n {{ return({'relations': relations}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.should_store_failures", "macro.dbt.statement", "macro.dbt.create_table_as", "macro.dbt.get_test_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.165946, "supported_languages": ["sql"]}, "macro.dbt.get_test_sql": {"name": "get_test_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/helpers.sql", "original_file_path": "macros/materializations/tests/helpers.sql", "unique_id": "macro.dbt.get_test_sql", "macro_sql": "{% macro get_test_sql(main_sql, fail_calc, warn_if, error_if, limit) -%}\n {{ adapter.dispatch('get_test_sql', 'dbt')(main_sql, fail_calc, warn_if, error_if, limit) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_test_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.1673322, "supported_languages": null}, "macro.dbt.default__get_test_sql": {"name": "default__get_test_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/helpers.sql", "original_file_path": "macros/materializations/tests/helpers.sql", "unique_id": "macro.dbt.default__get_test_sql", "macro_sql": "{% macro default__get_test_sql(main_sql, fail_calc, warn_if, error_if, limit) -%}\n select\n {{ fail_calc }} as failures,\n {{ fail_calc }} {{ warn_if }} as should_warn,\n {{ fail_calc }} {{ error_if }} as should_error\n from (\n {{ main_sql }}\n {{ \"limit \" ~ limit if limit != none }}\n ) dbt_internal_test\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.170771, "supported_languages": null}, "macro.dbt.get_where_subquery": {"name": "get_where_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/where_subquery.sql", "original_file_path": "macros/materializations/tests/where_subquery.sql", "unique_id": "macro.dbt.get_where_subquery", "macro_sql": "{% macro get_where_subquery(relation) -%}\n {% do return(adapter.dispatch('get_where_subquery', 'dbt')(relation)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_where_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.1740868, "supported_languages": null}, "macro.dbt.default__get_where_subquery": {"name": "default__get_where_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/where_subquery.sql", "original_file_path": "macros/materializations/tests/where_subquery.sql", "unique_id": "macro.dbt.default__get_where_subquery", "macro_sql": "{% macro default__get_where_subquery(relation) -%}\n {% set where = config.get('where', '') %}\n {% if where %}\n {%- set filtered -%}\n (select * from {{ relation }} where {{ where }}) dbt_subquery\n {%- endset -%}\n {% do return(filtered) %}\n {%- else -%}\n {% do return(relation) %}\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.17696, "supported_languages": null}, "macro.dbt.get_quoted_csv": {"name": "get_quoted_csv", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.get_quoted_csv", "macro_sql": "{% macro get_quoted_csv(column_names) %}\n\n {% set quoted = [] %}\n {% for col in column_names -%}\n {%- do quoted.append(adapter.quote(col)) -%}\n {%- endfor %}\n\n {%- set dest_cols_csv = quoted | join(', ') -%}\n {{ return(dest_cols_csv) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.187813, "supported_languages": null}, "macro.dbt.diff_columns": {"name": "diff_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.diff_columns", "macro_sql": "{% macro diff_columns(source_columns, target_columns) %}\n\n {% set result = [] %}\n {% set source_names = source_columns | map(attribute = 'column') | list %}\n {% set target_names = target_columns | map(attribute = 'column') | list %}\n\n {# --check whether the name attribute exists in the target - this does not perform a data type check #}\n {% for sc in source_columns %}\n {% if sc.name not in target_names %}\n {{ result.append(sc) }}\n {% endif %}\n {% endfor %}\n\n {{ return(result) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.1896791, "supported_languages": null}, "macro.dbt.diff_column_data_types": {"name": "diff_column_data_types", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.diff_column_data_types", "macro_sql": "{% macro diff_column_data_types(source_columns, target_columns) %}\n\n {% set result = [] %}\n {% for sc in source_columns %}\n {% set tc = target_columns | selectattr(\"name\", \"equalto\", sc.name) | list | first %}\n {% if tc %}\n {% if sc.data_type != tc.data_type and not sc.can_expand_to(other_column=tc) %}\n {{ result.append( { 'column_name': tc.name, 'new_type': sc.data_type } ) }}\n {% endif %}\n {% endif %}\n {% endfor %}\n\n {{ return(result) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.192773, "supported_languages": null}, "macro.dbt.get_merge_update_columns": {"name": "get_merge_update_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.get_merge_update_columns", "macro_sql": "{% macro get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) %}\n {{ return(adapter.dispatch('get_merge_update_columns', 'dbt')(merge_update_columns, merge_exclude_columns, dest_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_merge_update_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.1950452, "supported_languages": null}, "macro.dbt.default__get_merge_update_columns": {"name": "default__get_merge_update_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.default__get_merge_update_columns", "macro_sql": "{% macro default__get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) %}\n {%- set default_cols = dest_columns | map(attribute=\"quoted\") | list -%}\n\n {%- if merge_update_columns and merge_exclude_columns -%}\n {{ exceptions.raise_compiler_error(\n 'Model cannot specify merge_update_columns and merge_exclude_columns. Please update model to use only one config'\n )}}\n {%- elif merge_update_columns -%}\n {%- set update_columns = merge_update_columns -%}\n {%- elif merge_exclude_columns -%}\n {%- set update_columns = [] -%}\n {%- for column in dest_columns -%}\n {% if column.column | lower not in merge_exclude_columns | map(\"lower\") | list %}\n {%- do update_columns.append(column.quoted) -%}\n {% endif %}\n {%- endfor -%}\n {%- else -%}\n {%- set update_columns = default_cols -%}\n {%- endif -%}\n\n {{ return(update_columns) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.203396, "supported_languages": null}, "macro.dbt.get_merge_sql": {"name": "get_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.get_merge_sql", "macro_sql": "{% macro get_merge_sql(target, source, unique_key, dest_columns, incremental_predicates=none) -%}\n -- back compat for old kwarg name\n {% set incremental_predicates = kwargs.get('predicates', incremental_predicates) %}\n {{ adapter.dispatch('get_merge_sql', 'dbt')(target, source, unique_key, dest_columns, incremental_predicates) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.231102, "supported_languages": null}, "macro.dbt.default__get_merge_sql": {"name": "default__get_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.default__get_merge_sql", "macro_sql": "{% macro default__get_merge_sql(target, source, unique_key, dest_columns, incremental_predicates=none) -%}\n {%- set predicates = [] if incremental_predicates is none else [] + incremental_predicates -%}\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n {%- set merge_update_columns = config.get('merge_update_columns') -%}\n {%- set merge_exclude_columns = config.get('merge_exclude_columns') -%}\n {%- set update_columns = get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {% if unique_key %}\n {% if unique_key is sequence and unique_key is not mapping and unique_key is not string %}\n {% for key in unique_key %}\n {% set this_key_match %}\n DBT_INTERNAL_SOURCE.{{ key }} = DBT_INTERNAL_DEST.{{ key }}\n {% endset %}\n {% do predicates.append(this_key_match) %}\n {% endfor %}\n {% else %}\n {% set unique_key_match %}\n DBT_INTERNAL_SOURCE.{{ unique_key }} = DBT_INTERNAL_DEST.{{ unique_key }}\n {% endset %}\n {% do predicates.append(unique_key_match) %}\n {% endif %}\n {% else %}\n {% do predicates.append('FALSE') %}\n {% endif %}\n\n {{ sql_header if sql_header is not none }}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on {{\"(\" ~ predicates | join(\") and (\") ~ \")\"}}\n\n {% if unique_key %}\n when matched then update set\n {% for column_name in update_columns -%}\n {{ column_name }} = DBT_INTERNAL_SOURCE.{{ column_name }}\n {%- if not loop.last %}, {%- endif %}\n {%- endfor %}\n {% endif %}\n\n when not matched then insert\n ({{ dest_cols_csv }})\n values\n ({{ dest_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv", "macro.dbt.get_merge_update_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.2380428, "supported_languages": null}, "macro.dbt.get_delete_insert_merge_sql": {"name": "get_delete_insert_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.get_delete_insert_merge_sql", "macro_sql": "{% macro get_delete_insert_merge_sql(target, source, unique_key, dest_columns, incremental_predicates) -%}\n {{ adapter.dispatch('get_delete_insert_merge_sql', 'dbt')(target, source, unique_key, dest_columns, incremental_predicates) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_delete_insert_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.2389219, "supported_languages": null}, "macro.dbt.default__get_delete_insert_merge_sql": {"name": "default__get_delete_insert_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.default__get_delete_insert_merge_sql", "macro_sql": "{% macro default__get_delete_insert_merge_sql(target, source, unique_key, dest_columns, incremental_predicates) -%}\n\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n\n {% if unique_key %}\n {% if unique_key is sequence and unique_key is not string %}\n delete from {{target }}\n using {{ source }}\n where (\n {% for key in unique_key %}\n {{ source }}.{{ key }} = {{ target }}.{{ key }}\n {{ \"and \" if not loop.last}}\n {% endfor %}\n {% if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {% endif %}\n );\n {% else %}\n delete from {{ target }}\n where (\n {{ unique_key }}) in (\n select ({{ unique_key }})\n from {{ source }}\n )\n {%- if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {%- endif -%};\n\n {% endif %}\n {% endif %}\n\n insert into {{ target }} ({{ dest_cols_csv }})\n (\n select {{ dest_cols_csv }}\n from {{ source }}\n )\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.2424781, "supported_languages": null}, "macro.dbt.get_insert_overwrite_merge_sql": {"name": "get_insert_overwrite_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.get_insert_overwrite_merge_sql", "macro_sql": "{% macro get_insert_overwrite_merge_sql(target, source, dest_columns, predicates, include_sql_header=false) -%}\n {{ adapter.dispatch('get_insert_overwrite_merge_sql', 'dbt')(target, source, dest_columns, predicates, include_sql_header) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_insert_overwrite_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.243894, "supported_languages": null}, "macro.dbt.default__get_insert_overwrite_merge_sql": {"name": "default__get_insert_overwrite_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.default__get_insert_overwrite_merge_sql", "macro_sql": "{% macro default__get_insert_overwrite_merge_sql(target, source, dest_columns, predicates, include_sql_header) -%}\n {#-- The only time include_sql_header is True: --#}\n {#-- BigQuery + insert_overwrite strategy + \"static\" partitions config --#}\n {#-- We should consider including the sql header at the materialization level instead --#}\n\n {%- set predicates = [] if predicates is none else [] + predicates -%}\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none and include_sql_header }}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on FALSE\n\n when not matched by source\n {% if predicates %} and {{ predicates | join(' and ') }} {% endif %}\n then delete\n\n when not matched then insert\n ({{ dest_cols_csv }})\n values\n ({{ dest_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.247385, "supported_languages": null}, "macro.dbt.is_incremental": {"name": "is_incremental", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/is_incremental.sql", "original_file_path": "macros/materializations/models/incremental/is_incremental.sql", "unique_id": "macro.dbt.is_incremental", "macro_sql": "{% macro is_incremental() %}\n {#-- do not run introspective queries in parsing #}\n {% if not execute %}\n {{ return(False) }}\n {% else %}\n {% set relation = adapter.get_relation(this.database, this.schema, this.table) %}\n {{ return(relation is not none\n and relation.type == 'table'\n and model.config.materialized == 'incremental'\n and not should_full_refresh()) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.2502668, "supported_languages": null}, "macro.dbt.get_incremental_append_sql": {"name": "get_incremental_append_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_append_sql", "macro_sql": "{% macro get_incremental_append_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_append_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.253136, "supported_languages": null}, "macro.dbt.default__get_incremental_append_sql": {"name": "default__get_incremental_append_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_append_sql", "macro_sql": "{% macro default__get_incremental_append_sql(arg_dict) %}\n\n {% do return(get_insert_into_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"dest_columns\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_insert_into_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.254039, "supported_languages": null}, "macro.dbt.get_incremental_delete_insert_sql": {"name": "get_incremental_delete_insert_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_delete_insert_sql", "macro_sql": "{% macro get_incremental_delete_insert_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_delete_insert_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_delete_insert_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.254694, "supported_languages": null}, "macro.dbt.default__get_incremental_delete_insert_sql": {"name": "default__get_incremental_delete_insert_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_delete_insert_sql", "macro_sql": "{% macro default__get_incremental_delete_insert_sql(arg_dict) %}\n\n {% do return(get_delete_insert_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"unique_key\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_delete_insert_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.25567, "supported_languages": null}, "macro.dbt.get_incremental_merge_sql": {"name": "get_incremental_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_merge_sql", "macro_sql": "{% macro get_incremental_merge_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_merge_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.256355, "supported_languages": null}, "macro.dbt.default__get_incremental_merge_sql": {"name": "default__get_incremental_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_merge_sql", "macro_sql": "{% macro default__get_incremental_merge_sql(arg_dict) %}\n\n {% do return(get_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"unique_key\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.257864, "supported_languages": null}, "macro.dbt.get_incremental_insert_overwrite_sql": {"name": "get_incremental_insert_overwrite_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_insert_overwrite_sql", "macro_sql": "{% macro get_incremental_insert_overwrite_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_insert_overwrite_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_insert_overwrite_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.258934, "supported_languages": null}, "macro.dbt.default__get_incremental_insert_overwrite_sql": {"name": "default__get_incremental_insert_overwrite_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_insert_overwrite_sql", "macro_sql": "{% macro default__get_incremental_insert_overwrite_sql(arg_dict) %}\n\n {% do return(get_insert_overwrite_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_insert_overwrite_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.260382, "supported_languages": null}, "macro.dbt.get_incremental_default_sql": {"name": "get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_default_sql", "macro_sql": "{% macro get_incremental_default_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_default_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_incremental_default_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.261295, "supported_languages": null}, "macro.dbt.default__get_incremental_default_sql": {"name": "default__get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_default_sql", "macro_sql": "{% macro default__get_incremental_default_sql(arg_dict) %}\n\n {% do return(get_incremental_append_sql(arg_dict)) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.261853, "supported_languages": null}, "macro.dbt.get_insert_into_sql": {"name": "get_insert_into_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_insert_into_sql", "macro_sql": "{% macro get_insert_into_sql(target_relation, temp_relation, dest_columns) %}\n\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n\n insert into {{ target_relation }} ({{ dest_cols_csv }})\n (\n select {{ dest_cols_csv }}\n from {{ temp_relation }}\n )\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.262785, "supported_languages": null}, "macro.dbt.materialization_incremental_default": {"name": "materialization_incremental_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/incremental.sql", "original_file_path": "macros/materializations/models/incremental/incremental.sql", "unique_id": "macro.dbt.materialization_incremental_default", "macro_sql": "{% materialization incremental, default -%}\n\n -- relations\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='table') -%}\n {%- set temp_relation = make_temp_relation(target_relation)-%}\n {%- set intermediate_relation = make_intermediate_relation(target_relation)-%}\n {%- set backup_relation_type = 'table' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n\n -- configs\n {%- set unique_key = config.get('unique_key') -%}\n {%- set full_refresh_mode = (should_full_refresh() or existing_relation.is_view) -%}\n {%- set on_schema_change = incremental_validate_on_schema_change(config.get('on_schema_change'), default='ignore') -%}\n\n -- the temp_ and backup_ relations should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation. This has to happen before\n -- BEGIN, in a separate transaction\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation)-%}\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set to_drop = [] %}\n\n {% if existing_relation is none %}\n {% set build_sql = get_create_table_as_sql(False, target_relation, sql) %}\n {% elif full_refresh_mode %}\n {% set build_sql = get_create_table_as_sql(False, intermediate_relation, sql) %}\n {% set need_swap = true %}\n {% else %}\n {% do run_query(get_create_table_as_sql(True, temp_relation, sql)) %}\n {% do adapter.expand_target_column_types(\n from_relation=temp_relation,\n to_relation=target_relation) %}\n {#-- Process schema changes. Returns dict of changes if successful. Use source columns for upserting/merging --#}\n {% set dest_columns = process_schema_changes(on_schema_change, temp_relation, existing_relation) %}\n {% if not dest_columns %}\n {% set dest_columns = adapter.get_columns_in_relation(existing_relation) %}\n {% endif %}\n\n {#-- Get the incremental_strategy, the macro to use for the strategy, and build the sql --#}\n {% set incremental_strategy = config.get('incremental_strategy') or 'default' %}\n {% set incremental_predicates = config.get('predicates', none) or config.get('incremental_predicates', none) %}\n {% set strategy_sql_macro_func = adapter.get_incremental_strategy_macro(context, incremental_strategy) %}\n {% set strategy_arg_dict = ({'target_relation': target_relation, 'temp_relation': temp_relation, 'unique_key': unique_key, 'dest_columns': dest_columns, 'incremental_predicates': incremental_predicates }) %}\n {% set build_sql = strategy_sql_macro_func(strategy_arg_dict) %}\n\n {% endif %}\n\n {% call statement(\"main\") %}\n {{ build_sql }}\n {% endcall %}\n\n {% if need_swap %}\n {% do adapter.rename_relation(target_relation, backup_relation) %}\n {% do adapter.rename_relation(intermediate_relation, target_relation) %}\n {% do to_drop.append(backup_relation) %}\n {% endif %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if existing_relation is none or existing_relation.is_view or should_full_refresh() %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n -- `COMMIT` happens here\n {% do adapter.commit() %}\n\n {% for rel in to_drop %}\n {% do adapter.drop_relation(rel) %}\n {% endfor %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_temp_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.should_full_refresh", "macro.dbt.incremental_validate_on_schema_change", "macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks", "macro.dbt.get_create_table_as_sql", "macro.dbt.run_query", "macro.dbt.process_schema_changes", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.279187, "supported_languages": ["sql"]}, "macro.dbt.incremental_validate_on_schema_change": {"name": "incremental_validate_on_schema_change", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/on_schema_change.sql", "original_file_path": "macros/materializations/models/incremental/on_schema_change.sql", "unique_id": "macro.dbt.incremental_validate_on_schema_change", "macro_sql": "{% macro incremental_validate_on_schema_change(on_schema_change, default='ignore') %}\n\n {% if on_schema_change not in ['sync_all_columns', 'append_new_columns', 'fail', 'ignore'] %}\n\n {% set log_message = 'Invalid value for on_schema_change (%s) specified. Setting default value of %s.' % (on_schema_change, default) %}\n {% do log(log_message) %}\n\n {{ return(default) }}\n\n {% else %}\n\n {{ return(on_schema_change) }}\n\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.2952828, "supported_languages": null}, "macro.dbt.check_for_schema_changes": {"name": "check_for_schema_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/on_schema_change.sql", "original_file_path": "macros/materializations/models/incremental/on_schema_change.sql", "unique_id": "macro.dbt.check_for_schema_changes", "macro_sql": "{% macro check_for_schema_changes(source_relation, target_relation) %}\n\n {% set schema_changed = False %}\n\n {%- set source_columns = adapter.get_columns_in_relation(source_relation) -%}\n {%- set target_columns = adapter.get_columns_in_relation(target_relation) -%}\n {%- set source_not_in_target = diff_columns(source_columns, target_columns) -%}\n {%- set target_not_in_source = diff_columns(target_columns, source_columns) -%}\n\n {% set new_target_types = diff_column_data_types(source_columns, target_columns) %}\n\n {% if source_not_in_target != [] %}\n {% set schema_changed = True %}\n {% elif target_not_in_source != [] or new_target_types != [] %}\n {% set schema_changed = True %}\n {% elif new_target_types != [] %}\n {% set schema_changed = True %}\n {% endif %}\n\n {% set changes_dict = {\n 'schema_changed': schema_changed,\n 'source_not_in_target': source_not_in_target,\n 'target_not_in_source': target_not_in_source,\n 'source_columns': source_columns,\n 'target_columns': target_columns,\n 'new_target_types': new_target_types\n } %}\n\n {% set msg %}\n In {{ target_relation }}:\n Schema changed: {{ schema_changed }}\n Source columns not in target: {{ source_not_in_target }}\n Target columns not in source: {{ target_not_in_source }}\n New column types: {{ new_target_types }}\n {% endset %}\n\n {% do log(msg) %}\n\n {{ return(changes_dict) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.diff_columns", "macro.dbt.diff_column_data_types"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.300311, "supported_languages": null}, "macro.dbt.sync_column_schemas": {"name": "sync_column_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/on_schema_change.sql", "original_file_path": "macros/materializations/models/incremental/on_schema_change.sql", "unique_id": "macro.dbt.sync_column_schemas", "macro_sql": "{% macro sync_column_schemas(on_schema_change, target_relation, schema_changes_dict) %}\n\n {%- set add_to_target_arr = schema_changes_dict['source_not_in_target'] -%}\n\n {%- if on_schema_change == 'append_new_columns'-%}\n {%- if add_to_target_arr | length > 0 -%}\n {%- do alter_relation_add_remove_columns(target_relation, add_to_target_arr, none) -%}\n {%- endif -%}\n\n {% elif on_schema_change == 'sync_all_columns' %}\n {%- set remove_from_target_arr = schema_changes_dict['target_not_in_source'] -%}\n {%- set new_target_types = schema_changes_dict['new_target_types'] -%}\n\n {% if add_to_target_arr | length > 0 or remove_from_target_arr | length > 0 %}\n {%- do alter_relation_add_remove_columns(target_relation, add_to_target_arr, remove_from_target_arr) -%}\n {% endif %}\n\n {% if new_target_types != [] %}\n {% for ntt in new_target_types %}\n {% set column_name = ntt['column_name'] %}\n {% set new_type = ntt['new_type'] %}\n {% do alter_column_type(target_relation, column_name, new_type) %}\n {% endfor %}\n {% endif %}\n\n {% endif %}\n\n {% set schema_change_message %}\n In {{ target_relation }}:\n Schema change approach: {{ on_schema_change }}\n Columns added: {{ add_to_target_arr }}\n Columns removed: {{ remove_from_target_arr }}\n Data types changed: {{ new_target_types }}\n {% endset %}\n\n {% do log(schema_change_message) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.alter_relation_add_remove_columns", "macro.dbt.alter_column_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.305781, "supported_languages": null}, "macro.dbt.process_schema_changes": {"name": "process_schema_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/on_schema_change.sql", "original_file_path": "macros/materializations/models/incremental/on_schema_change.sql", "unique_id": "macro.dbt.process_schema_changes", "macro_sql": "{% macro process_schema_changes(on_schema_change, source_relation, target_relation) %}\n\n {% if on_schema_change == 'ignore' %}\n\n {{ return({}) }}\n\n {% else %}\n\n {% set schema_changes_dict = check_for_schema_changes(source_relation, target_relation) %}\n\n {% if schema_changes_dict['schema_changed'] %}\n\n {% if on_schema_change == 'fail' %}\n\n {% set fail_msg %}\n The source and target schemas on this incremental model are out of sync!\n They can be reconciled in several ways:\n - set the `on_schema_change` config to either append_new_columns or sync_all_columns, depending on your situation.\n - Re-run the incremental model with `full_refresh: True` to update the target schema.\n - update the schema manually and re-run the process.\n\n Additional troubleshooting context:\n Source columns not in target: {{ schema_changes_dict['source_not_in_target'] }}\n Target columns not in source: {{ schema_changes_dict['target_not_in_source'] }}\n New column types: {{ schema_changes_dict['new_target_types'] }}\n {% endset %}\n\n {% do exceptions.raise_compiler_error(fail_msg) %}\n\n {# -- unless we ignore, run the sync operation per the config #}\n {% else %}\n\n {% do sync_column_schemas(on_schema_change, target_relation, schema_changes_dict) %}\n\n {% endif %}\n\n {% endif %}\n\n {{ return(schema_changes_dict['source_columns']) }}\n\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.check_for_schema_changes", "macro.dbt.sync_column_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3093288, "supported_languages": null}, "macro.dbt.get_table_columns_and_constraints": {"name": "get_table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.get_table_columns_and_constraints", "macro_sql": "{%- macro get_table_columns_and_constraints() -%}\n {{ adapter.dispatch('get_table_columns_and_constraints', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__get_table_columns_and_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.313204, "supported_languages": null}, "macro.dbt.default__get_table_columns_and_constraints": {"name": "default__get_table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.default__get_table_columns_and_constraints", "macro_sql": "{% macro default__get_table_columns_and_constraints() -%}\n {{ return(table_columns_and_constraints()) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.table_columns_and_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.313637, "supported_languages": null}, "macro.dbt.table_columns_and_constraints": {"name": "table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.table_columns_and_constraints", "macro_sql": "{% macro table_columns_and_constraints() %}\n {# loop through user_provided_columns to create DDL with data types and constraints #}\n {%- set raw_column_constraints = adapter.render_raw_columns_constraints(raw_columns=model['columns']) -%}\n {%- set raw_model_constraints = adapter.render_raw_model_constraints(raw_constraints=model['constraints']) -%}\n (\n {% for c in raw_column_constraints -%}\n {{ c }}{{ \",\" if not loop.last or raw_model_constraints }}\n {% endfor %}\n {% for c in raw_model_constraints -%}\n {{ c }}{{ \",\" if not loop.last }}\n {% endfor -%}\n )\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3153942, "supported_languages": null}, "macro.dbt.get_assert_columns_equivalent": {"name": "get_assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.get_assert_columns_equivalent", "macro_sql": "\n\n{%- macro get_assert_columns_equivalent(sql) -%}\n {{ adapter.dispatch('get_assert_columns_equivalent', 'dbt')(sql) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3159528, "supported_languages": null}, "macro.dbt.default__get_assert_columns_equivalent": {"name": "default__get_assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.default__get_assert_columns_equivalent", "macro_sql": "{% macro default__get_assert_columns_equivalent(sql) -%}\n {{ return(assert_columns_equivalent(sql)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3164108, "supported_languages": null}, "macro.dbt.assert_columns_equivalent": {"name": "assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.assert_columns_equivalent", "macro_sql": "{% macro assert_columns_equivalent(sql) %}\n {#-- Obtain the column schema provided by sql file. #}\n {%- set sql_file_provided_columns = get_column_schema_from_query(sql) -%}\n {#--Obtain the column schema provided by the schema file by generating an 'empty schema' query from the model's columns. #}\n {%- set schema_file_provided_columns = get_column_schema_from_query(get_empty_schema_sql(model['columns'])) -%}\n\n {#-- create dictionaries with name and formatted data type and strings for exception #}\n {%- set sql_columns = format_columns(sql_file_provided_columns) -%}\n {%- set yaml_columns = format_columns(schema_file_provided_columns) -%}\n\n {%- if sql_columns|length != yaml_columns|length -%}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n\n {%- for sql_col in sql_columns -%}\n {%- set yaml_col = [] -%}\n {%- for this_col in yaml_columns -%}\n {%- if this_col['name'] == sql_col['name'] -%}\n {%- do yaml_col.append(this_col) -%}\n {%- break -%}\n {%- endif -%}\n {%- endfor -%}\n {%- if not yaml_col -%}\n {#-- Column with name not found in yaml #}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n {%- if sql_col['formatted'] != yaml_col[0]['formatted'] -%}\n {#-- Column data types don't match #}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n {%- endfor -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_column_schema_from_query", "macro.dbt.get_empty_schema_sql", "macro.dbt.format_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.320151, "supported_languages": null}, "macro.dbt.format_columns": {"name": "format_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.format_columns", "macro_sql": "{% macro format_columns(columns) %}\n {% set formatted_columns = [] %}\n {% for column in columns %}\n {%- set formatted_column = adapter.dispatch('format_column', 'dbt')(column) -%}\n {%- do formatted_columns.append(formatted_column) -%}\n {% endfor %}\n {{ return(formatted_columns) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__format_column"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.321425, "supported_languages": null}, "macro.dbt.default__format_column": {"name": "default__format_column", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.default__format_column", "macro_sql": "{% macro default__format_column(column) -%}\n {% set data_type = column.dtype %}\n {% set formatted = column.column.lower() ~ \" \" ~ data_type %}\n {{ return({'name': column.name, 'data_type': data_type, 'formatted': formatted}) }}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.322925, "supported_languages": null}, "macro.dbt.materialization_table_default": {"name": "materialization_table_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/table.sql", "original_file_path": "macros/materializations/models/table/table.sql", "unique_id": "macro.dbt.materialization_table_default", "macro_sql": "{% materialization table, default %}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='table') %}\n {%- set intermediate_relation = make_intermediate_relation(target_relation) -%}\n -- the intermediate_relation should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}\n /*\n See ../view/view.sql for more information about this relation.\n */\n {%- set backup_relation_type = 'table' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n -- as above, the backup_relation should not already exist\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n\n -- drop the temp relations if they exist already in the database\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_table_as_sql(False, intermediate_relation, sql) }}\n {%- endcall %}\n\n -- cleanup\n {% if existing_relation is not none %}\n {{ adapter.rename_relation(existing_relation, backup_relation) }}\n {% endif %}\n\n {{ adapter.rename_relation(intermediate_relation, target_relation) }}\n\n {% do create_indexes(target_relation) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n -- `COMMIT` happens here\n {{ adapter.commit() }}\n\n -- finally, drop the existing/backup relation after the commit\n {{ drop_relation_if_exists(backup_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks", "macro.dbt.statement", "macro.dbt.get_create_table_as_sql", "macro.dbt.create_indexes", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.335243, "supported_languages": ["sql"]}, "macro.dbt.get_create_table_as_sql": {"name": "get_create_table_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.get_create_table_as_sql", "macro_sql": "{% macro get_create_table_as_sql(temporary, relation, sql) -%}\n {{ adapter.dispatch('get_create_table_as_sql', 'dbt')(temporary, relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_create_table_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.339065, "supported_languages": null}, "macro.dbt.default__get_create_table_as_sql": {"name": "default__get_create_table_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.default__get_create_table_as_sql", "macro_sql": "{% macro default__get_create_table_as_sql(temporary, relation, sql) -%}\n {{ return(create_table_as(temporary, relation, sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.340021, "supported_languages": null}, "macro.dbt.create_table_as": {"name": "create_table_as", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.create_table_as", "macro_sql": "{% macro create_table_as(temporary, relation, compiled_code, language='sql') -%}\n {# backward compatibility for create_table_as that does not support language #}\n {% if language == \"sql\" %}\n {{ adapter.dispatch('create_table_as', 'dbt')(temporary, relation, compiled_code)}}\n {% else %}\n {{ adapter.dispatch('create_table_as', 'dbt')(temporary, relation, compiled_code, language) }}\n {% endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3425002, "supported_languages": null}, "macro.dbt.default__create_table_as": {"name": "default__create_table_as", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.default__create_table_as", "macro_sql": "{% macro default__create_table_as(temporary, relation, sql) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n\n create {% if temporary: -%}temporary{%- endif %} table\n {{ relation.include(database=(not temporary), schema=(not temporary)) }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {{ get_table_columns_and_constraints() }}\n {%- set sql = get_select_subquery(sql) %}\n {% endif %}\n as (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_table_columns_and_constraints", "macro.dbt.get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3450649, "supported_languages": null}, "macro.dbt.get_select_subquery": {"name": "get_select_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.get_select_subquery", "macro_sql": "{% macro get_select_subquery(sql) %}\n {{ return(adapter.dispatch('get_select_subquery', 'dbt')(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.345741, "supported_languages": null}, "macro.dbt.default__get_select_subquery": {"name": "default__get_select_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.default__get_select_subquery", "macro_sql": "{% macro default__get_select_subquery(sql) %}\n select\n {% for column in model['columns'] %}\n {{ column }}{{ \", \" if not loop.last }}\n {% endfor %}\n from (\n {{ sql }}\n ) as model_subq\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.346612, "supported_languages": null}, "macro.dbt.materialization_view_default": {"name": "materialization_view_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/view.sql", "original_file_path": "macros/materializations/models/view/view.sql", "unique_id": "macro.dbt.materialization_view_default", "macro_sql": "{%- materialization view, default -%}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='view') -%}\n {%- set intermediate_relation = make_intermediate_relation(target_relation) -%}\n\n -- the intermediate_relation should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}\n /*\n This relation (probably) doesn't exist yet. If it does exist, it's a leftover from\n a previous run, and we're going to try to drop it immediately. At the end of this\n materialization, we're going to rename the \"existing_relation\" to this identifier,\n and then we're going to drop it. In order to make sure we run the correct one of:\n - drop view ...\n - drop table ...\n\n We need to set the type of this relation to be the type of the existing_relation, if it exists,\n or else \"view\" as a sane default if it does not. Note that if the existing_relation does not\n exist, then there is nothing to move out of the way and subsequentally drop. In that case,\n this relation will be effectively unused.\n */\n {%- set backup_relation_type = 'view' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n -- as above, the backup_relation should not already exist\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- drop the temp relations if they exist already in the database\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_view_as_sql(intermediate_relation, sql) }}\n {%- endcall %}\n\n -- cleanup\n -- move the existing view out of the way\n {% if existing_relation is not none %}\n {{ adapter.rename_relation(existing_relation, backup_relation) }}\n {% endif %}\n {{ adapter.rename_relation(intermediate_relation, target_relation) }}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n {{ drop_relation_if_exists(backup_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.run_hooks", "macro.dbt.drop_relation_if_exists", "macro.dbt.statement", "macro.dbt.get_create_view_as_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.355264, "supported_languages": ["sql"]}, "macro.dbt.handle_existing_table": {"name": "handle_existing_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/helpers.sql", "original_file_path": "macros/materializations/models/view/helpers.sql", "unique_id": "macro.dbt.handle_existing_table", "macro_sql": "{% macro handle_existing_table(full_refresh, old_relation) %}\n {{ adapter.dispatch('handle_existing_table', 'dbt')(full_refresh, old_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__handle_existing_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.356865, "supported_languages": null}, "macro.dbt.default__handle_existing_table": {"name": "default__handle_existing_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/helpers.sql", "original_file_path": "macros/materializations/models/view/helpers.sql", "unique_id": "macro.dbt.default__handle_existing_table", "macro_sql": "{% macro default__handle_existing_table(full_refresh, old_relation) %}\n {{ log(\"Dropping relation \" ~ old_relation ~ \" because it is of type \" ~ old_relation.type) }}\n {{ adapter.drop_relation(old_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.358191, "supported_languages": null}, "macro.dbt.create_or_replace_view": {"name": "create_or_replace_view", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_or_replace_view.sql", "original_file_path": "macros/materializations/models/view/create_or_replace_view.sql", "unique_id": "macro.dbt.create_or_replace_view", "macro_sql": "{% macro create_or_replace_view() %}\n {%- set identifier = model['alias'] -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) -%}\n {%- set exists_as_view = (old_relation is not none and old_relation.is_view) -%}\n\n {%- set target_relation = api.Relation.create(\n identifier=identifier, schema=schema, database=database,\n type='view') -%}\n {% set grant_config = config.get('grants') %}\n\n {{ run_hooks(pre_hooks) }}\n\n -- If there's a table with the same name and we weren't told to full refresh,\n -- that's an error. If we were told to full refresh, drop it. This behavior differs\n -- for Snowflake and BigQuery, so multiple dispatch is used.\n {%- if old_relation is not none and old_relation.is_table -%}\n {{ handle_existing_table(should_full_refresh(), old_relation) }}\n {%- endif -%}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_view_as_sql(target_relation, sql) }}\n {%- endcall %}\n\n {% set should_revoke = should_revoke(exists_as_view, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {{ run_hooks(post_hooks) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks", "macro.dbt.handle_existing_table", "macro.dbt.should_full_refresh", "macro.dbt.statement", "macro.dbt.get_create_view_as_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.363323, "supported_languages": null}, "macro.dbt.get_create_view_as_sql": {"name": "get_create_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_view_as.sql", "original_file_path": "macros/materializations/models/view/create_view_as.sql", "unique_id": "macro.dbt.get_create_view_as_sql", "macro_sql": "{% macro get_create_view_as_sql(relation, sql) -%}\n {{ adapter.dispatch('get_create_view_as_sql', 'dbt')(relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_create_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3646479, "supported_languages": null}, "macro.dbt.default__get_create_view_as_sql": {"name": "default__get_create_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_view_as.sql", "original_file_path": "macros/materializations/models/view/create_view_as.sql", "unique_id": "macro.dbt.default__get_create_view_as_sql", "macro_sql": "{% macro default__get_create_view_as_sql(relation, sql) -%}\n {{ return(create_view_as(relation, sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.365272, "supported_languages": null}, "macro.dbt.create_view_as": {"name": "create_view_as", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_view_as.sql", "original_file_path": "macros/materializations/models/view/create_view_as.sql", "unique_id": "macro.dbt.create_view_as", "macro_sql": "{% macro create_view_as(relation, sql) -%}\n {{ adapter.dispatch('create_view_as', 'dbt')(relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.365932, "supported_languages": null}, "macro.dbt.default__create_view_as": {"name": "default__create_view_as", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_view_as.sql", "original_file_path": "macros/materializations/models/view/create_view_as.sql", "unique_id": "macro.dbt.default__create_view_as", "macro_sql": "{% macro default__create_view_as(relation, sql) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n create view {{ relation }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {%- endif %}\n as (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3673458, "supported_languages": null}, "macro.dbt.materialization_seed_default": {"name": "materialization_seed_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/seed.sql", "original_file_path": "macros/materializations/seeds/seed.sql", "unique_id": "macro.dbt.materialization_seed_default", "macro_sql": "{% materialization seed, default %}\n\n {%- set identifier = model['alias'] -%}\n {%- set full_refresh_mode = (should_full_refresh()) -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) -%}\n\n {%- set exists_as_table = (old_relation is not none and old_relation.is_table) -%}\n {%- set exists_as_view = (old_relation is not none and old_relation.is_view) -%}\n\n {%- set grant_config = config.get('grants') -%}\n {%- set agate_table = load_agate_table() -%}\n -- grab current tables grants config for comparision later on\n\n {%- do store_result('agate_table', response='OK', agate_table=agate_table) -%}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% set create_table_sql = \"\" %}\n {% if exists_as_view %}\n {{ exceptions.raise_compiler_error(\"Cannot seed to '{}', it is a view\".format(old_relation)) }}\n {% elif exists_as_table %}\n {% set create_table_sql = reset_csv_table(model, full_refresh_mode, old_relation, agate_table) %}\n {% else %}\n {% set create_table_sql = create_csv_table(model, agate_table) %}\n {% endif %}\n\n {% set code = 'CREATE' if full_refresh_mode else 'INSERT' %}\n {% set rows_affected = (agate_table.rows | length) %}\n {% set sql = load_csv_rows(model, agate_table) %}\n\n {% call noop_statement('main', code ~ ' ' ~ rows_affected, code, rows_affected) %}\n {{ get_csv_sql(create_table_sql, sql) }};\n {% endcall %}\n\n {% set target_relation = this.incorporate(type='table') %}\n\n {% set should_revoke = should_revoke(old_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if full_refresh_mode or not exists_as_table %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n -- `COMMIT` happens here\n {{ adapter.commit() }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt.run_hooks", "macro.dbt.reset_csv_table", "macro.dbt.create_csv_table", "macro.dbt.load_csv_rows", "macro.dbt.noop_statement", "macro.dbt.get_csv_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.378048, "supported_languages": ["sql"]}, "macro.dbt.create_csv_table": {"name": "create_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.create_csv_table", "macro_sql": "{% macro create_csv_table(model, agate_table) -%}\n {{ adapter.dispatch('create_csv_table', 'dbt')(model, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.393653, "supported_languages": null}, "macro.dbt.default__create_csv_table": {"name": "default__create_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__create_csv_table", "macro_sql": "{% macro default__create_csv_table(model, agate_table) %}\n {%- set column_override = model['config'].get('column_types', {}) -%}\n {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}\n\n {% set sql %}\n create table {{ this.render() }} (\n {%- for col_name in agate_table.column_names -%}\n {%- set inferred_type = adapter.convert_type(agate_table, loop.index0) -%}\n {%- set type = column_override.get(col_name, inferred_type) -%}\n {%- set column_name = (col_name | string) -%}\n {{ adapter.quote_seed_column(column_name, quote_seed_column) }} {{ type }} {%- if not loop.last -%}, {%- endif -%}\n {%- endfor -%}\n )\n {% endset %}\n\n {% call statement('_') -%}\n {{ sql }}\n {%- endcall %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.3983638, "supported_languages": null}, "macro.dbt.reset_csv_table": {"name": "reset_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.reset_csv_table", "macro_sql": "{% macro reset_csv_table(model, full_refresh, old_relation, agate_table) -%}\n {{ adapter.dispatch('reset_csv_table', 'dbt')(model, full_refresh, old_relation, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__reset_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.399613, "supported_languages": null}, "macro.dbt.default__reset_csv_table": {"name": "default__reset_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__reset_csv_table", "macro_sql": "{% macro default__reset_csv_table(model, full_refresh, old_relation, agate_table) %}\n {% set sql = \"\" %}\n {% if full_refresh %}\n {{ adapter.drop_relation(old_relation) }}\n {% set sql = create_csv_table(model, agate_table) %}\n {% else %}\n {{ adapter.truncate_relation(old_relation) }}\n {% set sql = \"truncate table \" ~ old_relation %}\n {% endif %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.40133, "supported_languages": null}, "macro.dbt.get_csv_sql": {"name": "get_csv_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.get_csv_sql", "macro_sql": "{% macro get_csv_sql(create_or_truncate_sql, insert_sql) %}\n {{ adapter.dispatch('get_csv_sql', 'dbt')(create_or_truncate_sql, insert_sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_csv_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.402015, "supported_languages": null}, "macro.dbt.default__get_csv_sql": {"name": "default__get_csv_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__get_csv_sql", "macro_sql": "{% macro default__get_csv_sql(create_or_truncate_sql, insert_sql) %}\n {{ create_or_truncate_sql }};\n -- dbt seed --\n {{ insert_sql }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.402716, "supported_languages": null}, "macro.dbt.get_binding_char": {"name": "get_binding_char", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.get_binding_char", "macro_sql": "{% macro get_binding_char() -%}\n {{ adapter.dispatch('get_binding_char', 'dbt')() }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.403498, "supported_languages": null}, "macro.dbt.default__get_binding_char": {"name": "default__get_binding_char", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__get_binding_char", "macro_sql": "{% macro default__get_binding_char() %}\n {{ return('%s') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.404243, "supported_languages": null}, "macro.dbt.get_batch_size": {"name": "get_batch_size", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.get_batch_size", "macro_sql": "{% macro get_batch_size() -%}\n {{ return(adapter.dispatch('get_batch_size', 'dbt')()) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_batch_size"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4052322, "supported_languages": null}, "macro.dbt.default__get_batch_size": {"name": "default__get_batch_size", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__get_batch_size", "macro_sql": "{% macro default__get_batch_size() %}\n {{ return(10000) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.406008, "supported_languages": null}, "macro.dbt.get_seed_column_quoted_csv": {"name": "get_seed_column_quoted_csv", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.get_seed_column_quoted_csv", "macro_sql": "{% macro get_seed_column_quoted_csv(model, column_names) %}\n {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}\n {% set quoted = [] %}\n {% for col in column_names -%}\n {%- do quoted.append(adapter.quote_seed_column(col, quote_seed_column)) -%}\n {%- endfor %}\n\n {%- set dest_cols_csv = quoted | join(', ') -%}\n {{ return(dest_cols_csv) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.408007, "supported_languages": null}, "macro.dbt.load_csv_rows": {"name": "load_csv_rows", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.load_csv_rows", "macro_sql": "{% macro load_csv_rows(model, agate_table) -%}\n {{ adapter.dispatch('load_csv_rows', 'dbt')(model, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__load_csv_rows"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.408972, "supported_languages": null}, "macro.dbt.default__load_csv_rows": {"name": "default__load_csv_rows", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__load_csv_rows", "macro_sql": "{% macro default__load_csv_rows(model, agate_table) %}\n\n {% set batch_size = get_batch_size() %}\n\n {% set cols_sql = get_seed_column_quoted_csv(model, agate_table.column_names) %}\n {% set bindings = [] %}\n\n {% set statements = [] %}\n\n {% for chunk in agate_table.rows | batch(batch_size) %}\n {% set bindings = [] %}\n\n {% for row in chunk %}\n {% do bindings.extend(row) %}\n {% endfor %}\n\n {% set sql %}\n insert into {{ this.render() }} ({{ cols_sql }}) values\n {% for row in chunk -%}\n ({%- for column in agate_table.column_names -%}\n {{ get_binding_char() }}\n {%- if not loop.last%},{%- endif %}\n {%- endfor -%})\n {%- if not loop.last%},{%- endif %}\n {%- endfor %}\n {% endset %}\n\n {% do adapter.add_query(sql, bindings=bindings, abridge_sql_log=True) %}\n\n {% if loop.index0 == 0 %}\n {% do statements.append(sql) %}\n {% endif %}\n {% endfor %}\n\n {# Return SQL so we can render it out into the compiled files #}\n {{ return(statements[0]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_batch_size", "macro.dbt.get_seed_column_quoted_csv", "macro.dbt.get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.413654, "supported_languages": null}, "macro.dbt.generate_alias_name": {"name": "generate_alias_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_alias.sql", "original_file_path": "macros/get_custom_name/get_custom_alias.sql", "unique_id": "macro.dbt.generate_alias_name", "macro_sql": "{% macro generate_alias_name(custom_alias_name=none, node=none) -%}\n {% do return(adapter.dispatch('generate_alias_name', 'dbt')(custom_alias_name, node)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_alias_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.415117, "supported_languages": null}, "macro.dbt.default__generate_alias_name": {"name": "default__generate_alias_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_alias.sql", "original_file_path": "macros/get_custom_name/get_custom_alias.sql", "unique_id": "macro.dbt.default__generate_alias_name", "macro_sql": "{% macro default__generate_alias_name(custom_alias_name=none, node=none) -%}\n\n {%- if custom_alias_name -%}\n\n {{ custom_alias_name | trim }}\n\n {%- elif node.version -%}\n\n {{ return(node.name ~ \"_v\" ~ (node.version | replace(\".\", \"_\"))) }}\n\n {%- else -%}\n\n {{ node.name }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4166331, "supported_languages": null}, "macro.dbt.generate_schema_name": {"name": "generate_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_schema.sql", "original_file_path": "macros/get_custom_name/get_custom_schema.sql", "unique_id": "macro.dbt.generate_schema_name", "macro_sql": "{% macro generate_schema_name(custom_schema_name=none, node=none) -%}\n {{ return(adapter.dispatch('generate_schema_name', 'dbt')(custom_schema_name, node)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_schema_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.418188, "supported_languages": null}, "macro.dbt.default__generate_schema_name": {"name": "default__generate_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_schema.sql", "original_file_path": "macros/get_custom_name/get_custom_schema.sql", "unique_id": "macro.dbt.default__generate_schema_name", "macro_sql": "{% macro default__generate_schema_name(custom_schema_name, node) -%}\n\n {%- set default_schema = target.schema -%}\n {%- if custom_schema_name is none -%}\n\n {{ default_schema }}\n\n {%- else -%}\n\n {{ default_schema }}_{{ custom_schema_name | trim }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4190989, "supported_languages": null}, "macro.dbt.generate_schema_name_for_env": {"name": "generate_schema_name_for_env", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_schema.sql", "original_file_path": "macros/get_custom_name/get_custom_schema.sql", "unique_id": "macro.dbt.generate_schema_name_for_env", "macro_sql": "{% macro generate_schema_name_for_env(custom_schema_name, node) -%}\n\n {%- set default_schema = target.schema -%}\n {%- if target.name == 'prod' and custom_schema_name is not none -%}\n\n {{ custom_schema_name | trim }}\n\n {%- else -%}\n\n {{ default_schema }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4200692, "supported_languages": null}, "macro.dbt.generate_database_name": {"name": "generate_database_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_database.sql", "original_file_path": "macros/get_custom_name/get_custom_database.sql", "unique_id": "macro.dbt.generate_database_name", "macro_sql": "{% macro generate_database_name(custom_database_name=none, node=none) -%}\n {% do return(adapter.dispatch('generate_database_name', 'dbt')(custom_database_name, node)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_database_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4219341, "supported_languages": null}, "macro.dbt.default__generate_database_name": {"name": "default__generate_database_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_database.sql", "original_file_path": "macros/get_custom_name/get_custom_database.sql", "unique_id": "macro.dbt.default__generate_database_name", "macro_sql": "{% macro default__generate_database_name(custom_database_name=none, node=none) -%}\n {%- set default_database = target.database -%}\n {%- if custom_database_name is none -%}\n\n {{ default_database }}\n\n {%- else -%}\n\n {{ custom_database_name }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.42356, "supported_languages": null}, "macro.dbt.default__test_relationships": {"name": "default__test_relationships", "resource_type": "macro", "package_name": "dbt", "path": "macros/generic_test_sql/relationships.sql", "original_file_path": "macros/generic_test_sql/relationships.sql", "unique_id": "macro.dbt.default__test_relationships", "macro_sql": "{% macro default__test_relationships(model, column_name, to, field) %}\n\nwith child as (\n select {{ column_name }} as from_field\n from {{ model }}\n where {{ column_name }} is not null\n),\n\nparent as (\n select {{ field }} as to_field\n from {{ to }}\n)\n\nselect\n from_field\n\nfrom child\nleft join parent\n on child.from_field = parent.to_field\n\nwhere parent.to_field is null\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.425482, "supported_languages": null}, "macro.dbt.default__test_not_null": {"name": "default__test_not_null", "resource_type": "macro", "package_name": "dbt", "path": "macros/generic_test_sql/not_null.sql", "original_file_path": "macros/generic_test_sql/not_null.sql", "unique_id": "macro.dbt.default__test_not_null", "macro_sql": "{% macro default__test_not_null(model, column_name) %}\n\n{% set column_list = '*' if should_store_failures() else column_name %}\n\nselect {{ column_list }}\nfrom {{ model }}\nwhere {{ column_name }} is null\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_store_failures"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.42728, "supported_languages": null}, "macro.dbt.default__test_unique": {"name": "default__test_unique", "resource_type": "macro", "package_name": "dbt", "path": "macros/generic_test_sql/unique.sql", "original_file_path": "macros/generic_test_sql/unique.sql", "unique_id": "macro.dbt.default__test_unique", "macro_sql": "{% macro default__test_unique(model, column_name) %}\n\nselect\n {{ column_name }} as unique_field,\n count(*) as n_records\n\nfrom {{ model }}\nwhere {{ column_name }} is not null\ngroup by {{ column_name }}\nhaving count(*) > 1\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.428704, "supported_languages": null}, "macro.dbt.default__test_accepted_values": {"name": "default__test_accepted_values", "resource_type": "macro", "package_name": "dbt", "path": "macros/generic_test_sql/accepted_values.sql", "original_file_path": "macros/generic_test_sql/accepted_values.sql", "unique_id": "macro.dbt.default__test_accepted_values", "macro_sql": "{% macro default__test_accepted_values(model, column_name, values, quote=True) %}\n\nwith all_values as (\n\n select\n {{ column_name }} as value_field,\n count(*) as n_records\n\n from {{ model }}\n group by {{ column_name }}\n\n)\n\nselect *\nfrom all_values\nwhere value_field not in (\n {% for value in values -%}\n {% if quote -%}\n '{{ value }}'\n {%- else -%}\n {{ value }}\n {%- endif -%}\n {%- if not loop.last -%},{%- endif %}\n {%- endfor %}\n)\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.431814, "supported_languages": null}, "macro.dbt.statement": {"name": "statement", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/statement.sql", "original_file_path": "macros/etc/statement.sql", "unique_id": "macro.dbt.statement", "macro_sql": "\n{%- macro statement(name=None, fetch_result=False, auto_begin=True, language='sql') -%}\n {%- if execute: -%}\n {%- set compiled_code = caller() -%}\n\n {%- if name == 'main' -%}\n {{ log('Writing runtime {} for node \"{}\"'.format(language, model['unique_id'])) }}\n {{ write(compiled_code) }}\n {%- endif -%}\n {%- if language == 'sql'-%}\n {%- set res, table = adapter.execute(compiled_code, auto_begin=auto_begin, fetch=fetch_result) -%}\n {%- elif language == 'python' -%}\n {%- set res = submit_python_job(model, compiled_code) -%}\n {#-- TODO: What should table be for python models? --#}\n {%- set table = None -%}\n {%- else -%}\n {% do exceptions.raise_compiler_error(\"statement macro didn't get supported language\") %}\n {%- endif -%}\n\n {%- if name is not none -%}\n {{ store_result(name, response=res, agate_table=table) }}\n {%- endif -%}\n\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.437546, "supported_languages": null}, "macro.dbt.noop_statement": {"name": "noop_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/statement.sql", "original_file_path": "macros/etc/statement.sql", "unique_id": "macro.dbt.noop_statement", "macro_sql": "{% macro noop_statement(name=None, message=None, code=None, rows_affected=None, res=None) -%}\n {%- set sql = caller() -%}\n\n {%- if name == 'main' -%}\n {{ log('Writing runtime SQL for node \"{}\"'.format(model['unique_id'])) }}\n {{ write(sql) }}\n {%- endif -%}\n\n {%- if name is not none -%}\n {{ store_raw_result(name, message=message, code=code, rows_affected=rows_affected, agate_table=res) }}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4396338, "supported_languages": null}, "macro.dbt.run_query": {"name": "run_query", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/statement.sql", "original_file_path": "macros/etc/statement.sql", "unique_id": "macro.dbt.run_query", "macro_sql": "{% macro run_query(sql) %}\n {% call statement(\"run_query_statement\", fetch_result=true, auto_begin=false) %}\n {{ sql }}\n {% endcall %}\n\n {% do return(load_result(\"run_query_statement\").table) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.440604, "supported_languages": null}, "macro.dbt.convert_datetime": {"name": "convert_datetime", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/datetime.sql", "original_file_path": "macros/etc/datetime.sql", "unique_id": "macro.dbt.convert_datetime", "macro_sql": "{% macro convert_datetime(date_str, date_fmt) %}\n\n {% set error_msg -%}\n The provided partition date '{{ date_str }}' does not match the expected format '{{ date_fmt }}'\n {%- endset %}\n\n {% set res = try_or_compiler_error(error_msg, modules.datetime.datetime.strptime, date_str.strip(), date_fmt) %}\n {{ return(res) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.447525, "supported_languages": null}, "macro.dbt.dates_in_range": {"name": "dates_in_range", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/datetime.sql", "original_file_path": "macros/etc/datetime.sql", "unique_id": "macro.dbt.dates_in_range", "macro_sql": "{% macro dates_in_range(start_date_str, end_date_str=none, in_fmt=\"%Y%m%d\", out_fmt=\"%Y%m%d\") %}\n {% set end_date_str = start_date_str if end_date_str is none else end_date_str %}\n\n {% set start_date = convert_datetime(start_date_str, in_fmt) %}\n {% set end_date = convert_datetime(end_date_str, in_fmt) %}\n\n {% set day_count = (end_date - start_date).days %}\n {% if day_count < 0 %}\n {% set msg -%}\n Partiton start date is after the end date ({{ start_date }}, {{ end_date }})\n {%- endset %}\n\n {{ exceptions.raise_compiler_error(msg, model) }}\n {% endif %}\n\n {% set date_list = [] %}\n {% for i in range(0, day_count + 1) %}\n {% set the_date = (modules.datetime.timedelta(days=i) + start_date) %}\n {% if not out_fmt %}\n {% set _ = date_list.append(the_date) %}\n {% else %}\n {% set _ = date_list.append(the_date.strftime(out_fmt)) %}\n {% endif %}\n {% endfor %}\n\n {{ return(date_list) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.convert_datetime"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4520488, "supported_languages": null}, "macro.dbt.partition_range": {"name": "partition_range", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/datetime.sql", "original_file_path": "macros/etc/datetime.sql", "unique_id": "macro.dbt.partition_range", "macro_sql": "{% macro partition_range(raw_partition_date, date_fmt='%Y%m%d') %}\n {% set partition_range = (raw_partition_date | string).split(\",\") %}\n\n {% if (partition_range | length) == 1 %}\n {% set start_date = partition_range[0] %}\n {% set end_date = none %}\n {% elif (partition_range | length) == 2 %}\n {% set start_date = partition_range[0] %}\n {% set end_date = partition_range[1] %}\n {% else %}\n {{ exceptions.raise_compiler_error(\"Invalid partition time. Expected format: {Start Date}[,{End Date}]. Got: \" ~ raw_partition_date) }}\n {% endif %}\n\n {{ return(dates_in_range(start_date, end_date, in_fmt=date_fmt)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.dates_in_range"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.455408, "supported_languages": null}, "macro.dbt.py_current_timestring": {"name": "py_current_timestring", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/datetime.sql", "original_file_path": "macros/etc/datetime.sql", "unique_id": "macro.dbt.py_current_timestring", "macro_sql": "{% macro py_current_timestring() %}\n {% set dt = modules.datetime.datetime.now() %}\n {% do return(dt.strftime(\"%Y%m%d%H%M%S%f\")) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4567401, "supported_languages": null}, "macro.dbt.except": {"name": "except", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/except.sql", "original_file_path": "macros/utils/except.sql", "unique_id": "macro.dbt.except", "macro_sql": "{% macro except() %}\n {{ return(adapter.dispatch('except', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__except"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.458046, "supported_languages": null}, "macro.dbt.default__except": {"name": "default__except", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/except.sql", "original_file_path": "macros/utils/except.sql", "unique_id": "macro.dbt.default__except", "macro_sql": "{% macro default__except() %}\n\n except\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.45853, "supported_languages": null}, "macro.dbt.replace": {"name": "replace", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/replace.sql", "original_file_path": "macros/utils/replace.sql", "unique_id": "macro.dbt.replace", "macro_sql": "{% macro replace(field, old_chars, new_chars) -%}\n {{ return(adapter.dispatch('replace', 'dbt') (field, old_chars, new_chars)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__replace"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.460074, "supported_languages": null}, "macro.dbt.default__replace": {"name": "default__replace", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/replace.sql", "original_file_path": "macros/utils/replace.sql", "unique_id": "macro.dbt.default__replace", "macro_sql": "{% macro default__replace(field, old_chars, new_chars) %}\n\n replace(\n {{ field }},\n {{ old_chars }},\n {{ new_chars }}\n )\n\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.460947, "supported_languages": null}, "macro.dbt.concat": {"name": "concat", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/concat.sql", "original_file_path": "macros/utils/concat.sql", "unique_id": "macro.dbt.concat", "macro_sql": "{% macro concat(fields) -%}\n {{ return(adapter.dispatch('concat', 'dbt')(fields)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4621649, "supported_languages": null}, "macro.dbt.default__concat": {"name": "default__concat", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/concat.sql", "original_file_path": "macros/utils/concat.sql", "unique_id": "macro.dbt.default__concat", "macro_sql": "{% macro default__concat(fields) -%}\n {{ fields|join(' || ') }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.463027, "supported_languages": null}, "macro.dbt.length": {"name": "length", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/length.sql", "original_file_path": "macros/utils/length.sql", "unique_id": "macro.dbt.length", "macro_sql": "{% macro length(expression) -%}\n {{ return(adapter.dispatch('length', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__length"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.464535, "supported_languages": null}, "macro.dbt.default__length": {"name": "default__length", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/length.sql", "original_file_path": "macros/utils/length.sql", "unique_id": "macro.dbt.default__length", "macro_sql": "{% macro default__length(expression) %}\n\n length(\n {{ expression }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.465174, "supported_languages": null}, "macro.dbt.dateadd": {"name": "dateadd", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/dateadd.sql", "original_file_path": "macros/utils/dateadd.sql", "unique_id": "macro.dbt.dateadd", "macro_sql": "{% macro dateadd(datepart, interval, from_date_or_timestamp) %}\n {{ return(adapter.dispatch('dateadd', 'dbt')(datepart, interval, from_date_or_timestamp)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.466362, "supported_languages": null}, "macro.dbt.default__dateadd": {"name": "default__dateadd", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/dateadd.sql", "original_file_path": "macros/utils/dateadd.sql", "unique_id": "macro.dbt.default__dateadd", "macro_sql": "{% macro default__dateadd(datepart, interval, from_date_or_timestamp) %}\n\n dateadd(\n {{ datepart }},\n {{ interval }},\n {{ from_date_or_timestamp }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.466932, "supported_languages": null}, "macro.dbt.intersect": {"name": "intersect", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/intersect.sql", "original_file_path": "macros/utils/intersect.sql", "unique_id": "macro.dbt.intersect", "macro_sql": "{% macro intersect() %}\n {{ return(adapter.dispatch('intersect', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__intersect"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.46766, "supported_languages": null}, "macro.dbt.default__intersect": {"name": "default__intersect", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/intersect.sql", "original_file_path": "macros/utils/intersect.sql", "unique_id": "macro.dbt.default__intersect", "macro_sql": "{% macro default__intersect() %}\n\n intersect\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.467943, "supported_languages": null}, "macro.dbt.escape_single_quotes": {"name": "escape_single_quotes", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/escape_single_quotes.sql", "original_file_path": "macros/utils/escape_single_quotes.sql", "unique_id": "macro.dbt.escape_single_quotes", "macro_sql": "{% macro escape_single_quotes(expression) %}\n {{ return(adapter.dispatch('escape_single_quotes', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__escape_single_quotes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4687831, "supported_languages": null}, "macro.dbt.default__escape_single_quotes": {"name": "default__escape_single_quotes", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/escape_single_quotes.sql", "original_file_path": "macros/utils/escape_single_quotes.sql", "unique_id": "macro.dbt.default__escape_single_quotes", "macro_sql": "{% macro default__escape_single_quotes(expression) -%}\n{{ expression | replace(\"'\",\"''\") }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4692538, "supported_languages": null}, "macro.dbt.right": {"name": "right", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/right.sql", "original_file_path": "macros/utils/right.sql", "unique_id": "macro.dbt.right", "macro_sql": "{% macro right(string_text, length_expression) -%}\n {{ return(adapter.dispatch('right', 'dbt') (string_text, length_expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__right"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.470367, "supported_languages": null}, "macro.dbt.default__right": {"name": "default__right", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/right.sql", "original_file_path": "macros/utils/right.sql", "unique_id": "macro.dbt.default__right", "macro_sql": "{% macro default__right(string_text, length_expression) %}\n\n right(\n {{ string_text }},\n {{ length_expression }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.471358, "supported_languages": null}, "macro.dbt.listagg": {"name": "listagg", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/listagg.sql", "original_file_path": "macros/utils/listagg.sql", "unique_id": "macro.dbt.listagg", "macro_sql": "{% macro listagg(measure, delimiter_text=\"','\", order_by_clause=none, limit_num=none) -%}\n {{ return(adapter.dispatch('listagg', 'dbt') (measure, delimiter_text, order_by_clause, limit_num)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__listagg"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4743428, "supported_languages": null}, "macro.dbt.default__listagg": {"name": "default__listagg", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/listagg.sql", "original_file_path": "macros/utils/listagg.sql", "unique_id": "macro.dbt.default__listagg", "macro_sql": "{% macro default__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}\n\n {% if limit_num -%}\n array_to_string(\n array_slice(\n array_agg(\n {{ measure }}\n ){% if order_by_clause -%}\n within group ({{ order_by_clause }})\n {%- endif %}\n ,0\n ,{{ limit_num }}\n ),\n {{ delimiter_text }}\n )\n {%- else %}\n listagg(\n {{ measure }},\n {{ delimiter_text }}\n )\n {% if order_by_clause -%}\n within group ({{ order_by_clause }})\n {%- endif %}\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4766002, "supported_languages": null}, "macro.dbt.datediff": {"name": "datediff", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/datediff.sql", "original_file_path": "macros/utils/datediff.sql", "unique_id": "macro.dbt.datediff", "macro_sql": "{% macro datediff(first_date, second_date, datepart) %}\n {{ return(adapter.dispatch('datediff', 'dbt')(first_date, second_date, datepart)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4779341, "supported_languages": null}, "macro.dbt.default__datediff": {"name": "default__datediff", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/datediff.sql", "original_file_path": "macros/utils/datediff.sql", "unique_id": "macro.dbt.default__datediff", "macro_sql": "{% macro default__datediff(first_date, second_date, datepart) -%}\n\n datediff(\n {{ datepart }},\n {{ first_date }},\n {{ second_date }}\n )\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.47853, "supported_languages": null}, "macro.dbt.safe_cast": {"name": "safe_cast", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/safe_cast.sql", "original_file_path": "macros/utils/safe_cast.sql", "unique_id": "macro.dbt.safe_cast", "macro_sql": "{% macro safe_cast(field, type) %}\n {{ return(adapter.dispatch('safe_cast', 'dbt') (field, type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__safe_cast"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4795399, "supported_languages": null}, "macro.dbt.default__safe_cast": {"name": "default__safe_cast", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/safe_cast.sql", "original_file_path": "macros/utils/safe_cast.sql", "unique_id": "macro.dbt.default__safe_cast", "macro_sql": "{% macro default__safe_cast(field, type) %}\n {# most databases don't support this function yet\n so we just need to use cast #}\n cast({{field}} as {{type}})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4803882, "supported_languages": null}, "macro.dbt.hash": {"name": "hash", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/hash.sql", "original_file_path": "macros/utils/hash.sql", "unique_id": "macro.dbt.hash", "macro_sql": "{% macro hash(field) -%}\n {{ return(adapter.dispatch('hash', 'dbt') (field)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__hash"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.48174, "supported_languages": null}, "macro.dbt.default__hash": {"name": "default__hash", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/hash.sql", "original_file_path": "macros/utils/hash.sql", "unique_id": "macro.dbt.default__hash", "macro_sql": "{% macro default__hash(field) -%}\n md5(cast({{ field }} as {{ api.Column.translate_type('string') }}))\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4826639, "supported_languages": null}, "macro.dbt.cast_bool_to_text": {"name": "cast_bool_to_text", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/cast_bool_to_text.sql", "original_file_path": "macros/utils/cast_bool_to_text.sql", "unique_id": "macro.dbt.cast_bool_to_text", "macro_sql": "{% macro cast_bool_to_text(field) %}\n {{ adapter.dispatch('cast_bool_to_text', 'dbt') (field) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__cast_bool_to_text"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4838998, "supported_languages": null}, "macro.dbt.default__cast_bool_to_text": {"name": "default__cast_bool_to_text", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/cast_bool_to_text.sql", "original_file_path": "macros/utils/cast_bool_to_text.sql", "unique_id": "macro.dbt.default__cast_bool_to_text", "macro_sql": "{% macro default__cast_bool_to_text(field) %}\n cast({{ field }} as {{ api.Column.translate_type('string') }})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4848268, "supported_languages": null}, "macro.dbt.any_value": {"name": "any_value", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/any_value.sql", "original_file_path": "macros/utils/any_value.sql", "unique_id": "macro.dbt.any_value", "macro_sql": "{% macro any_value(expression) -%}\n {{ return(adapter.dispatch('any_value', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__any_value"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.486154, "supported_languages": null}, "macro.dbt.default__any_value": {"name": "default__any_value", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/any_value.sql", "original_file_path": "macros/utils/any_value.sql", "unique_id": "macro.dbt.default__any_value", "macro_sql": "{% macro default__any_value(expression) -%}\n\n any_value({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.486689, "supported_languages": null}, "macro.dbt.position": {"name": "position", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/position.sql", "original_file_path": "macros/utils/position.sql", "unique_id": "macro.dbt.position", "macro_sql": "{% macro position(substring_text, string_text) -%}\n {{ return(adapter.dispatch('position', 'dbt') (substring_text, string_text)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__position"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.487958, "supported_languages": null}, "macro.dbt.default__position": {"name": "default__position", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/position.sql", "original_file_path": "macros/utils/position.sql", "unique_id": "macro.dbt.default__position", "macro_sql": "{% macro default__position(substring_text, string_text) %}\n\n position(\n {{ substring_text }} in {{ string_text }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.488462, "supported_languages": null}, "macro.dbt.string_literal": {"name": "string_literal", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/literal.sql", "original_file_path": "macros/utils/literal.sql", "unique_id": "macro.dbt.string_literal", "macro_sql": "{%- macro string_literal(value) -%}\n {{ return(adapter.dispatch('string_literal', 'dbt') (value)) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__string_literal"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.489259, "supported_languages": null}, "macro.dbt.default__string_literal": {"name": "default__string_literal", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/literal.sql", "original_file_path": "macros/utils/literal.sql", "unique_id": "macro.dbt.default__string_literal", "macro_sql": "{% macro default__string_literal(value) -%}\n '{{ value }}'\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4896178, "supported_languages": null}, "macro.dbt.type_string": {"name": "type_string", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_string", "macro_sql": "\n\n{%- macro type_string() -%}\n {{ return(adapter.dispatch('type_string', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_string"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.492476, "supported_languages": null}, "macro.dbt.default__type_string": {"name": "default__type_string", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_string", "macro_sql": "{% macro default__type_string() %}\n {{ return(api.Column.translate_type(\"string\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4930198, "supported_languages": null}, "macro.dbt.type_timestamp": {"name": "type_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_timestamp", "macro_sql": "\n\n{%- macro type_timestamp() -%}\n {{ return(adapter.dispatch('type_timestamp', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.494025, "supported_languages": null}, "macro.dbt.default__type_timestamp": {"name": "default__type_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_timestamp", "macro_sql": "{% macro default__type_timestamp() %}\n {{ return(api.Column.translate_type(\"timestamp\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4945521, "supported_languages": null}, "macro.dbt.type_float": {"name": "type_float", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_float", "macro_sql": "\n\n{%- macro type_float() -%}\n {{ return(adapter.dispatch('type_float', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_float"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.495102, "supported_languages": null}, "macro.dbt.default__type_float": {"name": "default__type_float", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_float", "macro_sql": "{% macro default__type_float() %}\n {{ return(api.Column.translate_type(\"float\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.495617, "supported_languages": null}, "macro.dbt.type_numeric": {"name": "type_numeric", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_numeric", "macro_sql": "\n\n{%- macro type_numeric() -%}\n {{ return(adapter.dispatch('type_numeric', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_numeric"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.496161, "supported_languages": null}, "macro.dbt.default__type_numeric": {"name": "default__type_numeric", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_numeric", "macro_sql": "{% macro default__type_numeric() %}\n {{ return(api.Column.numeric_type(\"numeric\", 28, 6)) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.496959, "supported_languages": null}, "macro.dbt.type_bigint": {"name": "type_bigint", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_bigint", "macro_sql": "\n\n{%- macro type_bigint() -%}\n {{ return(adapter.dispatch('type_bigint', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_bigint"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.497797, "supported_languages": null}, "macro.dbt.default__type_bigint": {"name": "default__type_bigint", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_bigint", "macro_sql": "{% macro default__type_bigint() %}\n {{ return(api.Column.translate_type(\"bigint\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4985201, "supported_languages": null}, "macro.dbt.type_int": {"name": "type_int", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_int", "macro_sql": "\n\n{%- macro type_int() -%}\n {{ return(adapter.dispatch('type_int', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_int"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.4995358, "supported_languages": null}, "macro.dbt.default__type_int": {"name": "default__type_int", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_int", "macro_sql": "{%- macro default__type_int() -%}\n {{ return(api.Column.translate_type(\"integer\")) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.500337, "supported_languages": null}, "macro.dbt.type_boolean": {"name": "type_boolean", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_boolean", "macro_sql": "\n\n{%- macro type_boolean() -%}\n {{ return(adapter.dispatch('type_boolean', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_boolean"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.50122, "supported_languages": null}, "macro.dbt.default__type_boolean": {"name": "default__type_boolean", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_boolean", "macro_sql": "{%- macro default__type_boolean() -%}\n {{ return(api.Column.translate_type(\"boolean\")) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.502151, "supported_languages": null}, "macro.dbt.array_concat": {"name": "array_concat", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_concat.sql", "original_file_path": "macros/utils/array_concat.sql", "unique_id": "macro.dbt.array_concat", "macro_sql": "{% macro array_concat(array_1, array_2) -%}\n {{ return(adapter.dispatch('array_concat', 'dbt')(array_1, array_2)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__array_concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.503809, "supported_languages": null}, "macro.dbt.default__array_concat": {"name": "default__array_concat", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_concat.sql", "original_file_path": "macros/utils/array_concat.sql", "unique_id": "macro.dbt.default__array_concat", "macro_sql": "{% macro default__array_concat(array_1, array_2) -%}\n array_cat({{ array_1 }}, {{ array_2 }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.504548, "supported_languages": null}, "macro.dbt.bool_or": {"name": "bool_or", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/bool_or.sql", "original_file_path": "macros/utils/bool_or.sql", "unique_id": "macro.dbt.bool_or", "macro_sql": "{% macro bool_or(expression) -%}\n {{ return(adapter.dispatch('bool_or', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__bool_or"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.505891, "supported_languages": null}, "macro.dbt.default__bool_or": {"name": "default__bool_or", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/bool_or.sql", "original_file_path": "macros/utils/bool_or.sql", "unique_id": "macro.dbt.default__bool_or", "macro_sql": "{% macro default__bool_or(expression) -%}\n\n bool_or({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5064828, "supported_languages": null}, "macro.dbt.last_day": {"name": "last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt.last_day", "macro_sql": "{% macro last_day(date, datepart) %}\n {{ return(adapter.dispatch('last_day', 'dbt') (date, datepart)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.508346, "supported_languages": null}, "macro.dbt.default_last_day": {"name": "default_last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt.default_last_day", "macro_sql": "\n\n{%- macro default_last_day(date, datepart) -%}\n cast(\n {{dbt.dateadd('day', '-1',\n dbt.dateadd(datepart, '1', dbt.date_trunc(datepart, date))\n )}}\n as date)\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.date_trunc"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.510078, "supported_languages": null}, "macro.dbt.default__last_day": {"name": "default__last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt.default__last_day", "macro_sql": "{% macro default__last_day(date, datepart) -%}\n {{dbt.default_last_day(date, datepart)}}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default_last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5108259, "supported_languages": null}, "macro.dbt.split_part": {"name": "split_part", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt.split_part", "macro_sql": "{% macro split_part(string_text, delimiter_text, part_number) %}\n {{ return(adapter.dispatch('split_part', 'dbt') (string_text, delimiter_text, part_number)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__split_part"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.512352, "supported_languages": null}, "macro.dbt.default__split_part": {"name": "default__split_part", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt.default__split_part", "macro_sql": "{% macro default__split_part(string_text, delimiter_text, part_number) %}\n\n split_part(\n {{ string_text }},\n {{ delimiter_text }},\n {{ part_number }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.512924, "supported_languages": null}, "macro.dbt._split_part_negative": {"name": "_split_part_negative", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt._split_part_negative", "macro_sql": "{% macro _split_part_negative(string_text, delimiter_text, part_number) %}\n\n split_part(\n {{ string_text }},\n {{ delimiter_text }},\n length({{ string_text }})\n - length(\n replace({{ string_text }}, {{ delimiter_text }}, '')\n ) + 2 {{ part_number }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.513867, "supported_languages": null}, "macro.dbt.date_trunc": {"name": "date_trunc", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/date_trunc.sql", "original_file_path": "macros/utils/date_trunc.sql", "unique_id": "macro.dbt.date_trunc", "macro_sql": "{% macro date_trunc(datepart, date) -%}\n {{ return(adapter.dispatch('date_trunc', 'dbt') (datepart, date)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__date_trunc"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.514844, "supported_languages": null}, "macro.dbt.default__date_trunc": {"name": "default__date_trunc", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/date_trunc.sql", "original_file_path": "macros/utils/date_trunc.sql", "unique_id": "macro.dbt.default__date_trunc", "macro_sql": "{% macro default__date_trunc(datepart, date) -%}\n date_trunc('{{datepart}}', {{date}})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.515432, "supported_languages": null}, "macro.dbt.array_construct": {"name": "array_construct", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_construct.sql", "original_file_path": "macros/utils/array_construct.sql", "unique_id": "macro.dbt.array_construct", "macro_sql": "{% macro array_construct(inputs=[], data_type=api.Column.translate_type('integer')) -%}\n {{ return(adapter.dispatch('array_construct', 'dbt')(inputs, data_type)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__array_construct"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.517139, "supported_languages": null}, "macro.dbt.default__array_construct": {"name": "default__array_construct", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_construct.sql", "original_file_path": "macros/utils/array_construct.sql", "unique_id": "macro.dbt.default__array_construct", "macro_sql": "{% macro default__array_construct(inputs, data_type) -%}\n {% if inputs|length > 0 %}\n array[ {{ inputs|join(' , ') }} ]\n {% else %}\n array[]::{{data_type}}[]\n {% endif %}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5182421, "supported_languages": null}, "macro.dbt.array_append": {"name": "array_append", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_append.sql", "original_file_path": "macros/utils/array_append.sql", "unique_id": "macro.dbt.array_append", "macro_sql": "{% macro array_append(array, new_element) -%}\n {{ return(adapter.dispatch('array_append', 'dbt')(array, new_element)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__array_append"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.519657, "supported_languages": null}, "macro.dbt.default__array_append": {"name": "default__array_append", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_append.sql", "original_file_path": "macros/utils/array_append.sql", "unique_id": "macro.dbt.default__array_append", "macro_sql": "{% macro default__array_append(array, new_element) -%}\n array_append({{ array }}, {{ new_element }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.520381, "supported_languages": null}, "macro.dbt.create_schema": {"name": "create_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/schema.sql", "original_file_path": "macros/adapters/schema.sql", "unique_id": "macro.dbt.create_schema", "macro_sql": "{% macro create_schema(relation) -%}\n {{ adapter.dispatch('create_schema', 'dbt')(relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__create_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.521816, "supported_languages": null}, "macro.dbt.default__create_schema": {"name": "default__create_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/schema.sql", "original_file_path": "macros/adapters/schema.sql", "unique_id": "macro.dbt.default__create_schema", "macro_sql": "{% macro default__create_schema(relation) -%}\n {%- call statement('create_schema') -%}\n create schema if not exists {{ relation.without_identifier() }}\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.522871, "supported_languages": null}, "macro.dbt.drop_schema": {"name": "drop_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/schema.sql", "original_file_path": "macros/adapters/schema.sql", "unique_id": "macro.dbt.drop_schema", "macro_sql": "{% macro drop_schema(relation) -%}\n {{ adapter.dispatch('drop_schema', 'dbt')(relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__drop_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5238159, "supported_languages": null}, "macro.dbt.default__drop_schema": {"name": "default__drop_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/schema.sql", "original_file_path": "macros/adapters/schema.sql", "unique_id": "macro.dbt.default__drop_schema", "macro_sql": "{% macro default__drop_schema(relation) -%}\n {%- call statement('drop_schema') -%}\n drop schema if exists {{ relation.without_identifier() }} cascade\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5247989, "supported_languages": null}, "macro.dbt.current_timestamp": {"name": "current_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.current_timestamp", "macro_sql": "{%- macro current_timestamp() -%}\n {{ adapter.dispatch('current_timestamp', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_postgres.postgres__current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.526212, "supported_languages": null}, "macro.dbt.default__current_timestamp": {"name": "default__current_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp", "macro_sql": "{% macro default__current_timestamp() -%}\n {{ exceptions.raise_not_implemented(\n 'current_timestamp macro not implemented for adapter ' + adapter.type()) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.526728, "supported_languages": null}, "macro.dbt.snapshot_get_time": {"name": "snapshot_get_time", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.snapshot_get_time", "macro_sql": "\n\n{%- macro snapshot_get_time() -%}\n {{ adapter.dispatch('snapshot_get_time', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_postgres.postgres__snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.527214, "supported_languages": null}, "macro.dbt.default__snapshot_get_time": {"name": "default__snapshot_get_time", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.default__snapshot_get_time", "macro_sql": "{% macro default__snapshot_get_time() %}\n {{ current_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.527582, "supported_languages": null}, "macro.dbt.current_timestamp_backcompat": {"name": "current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.current_timestamp_backcompat", "macro_sql": "{% macro current_timestamp_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5281448, "supported_languages": null}, "macro.dbt.default__current_timestamp_backcompat": {"name": "default__current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp_backcompat", "macro_sql": "{% macro default__current_timestamp_backcompat() %}\n current_timestamp::timestamp\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.528411, "supported_languages": null}, "macro.dbt.current_timestamp_in_utc_backcompat": {"name": "current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.current_timestamp_in_utc_backcompat", "macro_sql": "{% macro current_timestamp_in_utc_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_in_utc_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5290399, "supported_languages": null}, "macro.dbt.default__current_timestamp_in_utc_backcompat": {"name": "default__current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp_in_utc_backcompat", "macro_sql": "{% macro default__current_timestamp_in_utc_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp_backcompat", "macro.dbt_postgres.postgres__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5296772, "supported_languages": null}, "macro.dbt.get_create_index_sql": {"name": "get_create_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.get_create_index_sql", "macro_sql": "{% macro get_create_index_sql(relation, index_dict) -%}\n {{ return(adapter.dispatch('get_create_index_sql', 'dbt')(relation, index_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5310788, "supported_languages": null}, "macro.dbt.default__get_create_index_sql": {"name": "default__get_create_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.default__get_create_index_sql", "macro_sql": "{% macro default__get_create_index_sql(relation, index_dict) -%}\n {% do return(None) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.531748, "supported_languages": null}, "macro.dbt.create_indexes": {"name": "create_indexes", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.create_indexes", "macro_sql": "{% macro create_indexes(relation) -%}\n {{ adapter.dispatch('create_indexes', 'dbt')(relation) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5322912, "supported_languages": null}, "macro.dbt.default__create_indexes": {"name": "default__create_indexes", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.default__create_indexes", "macro_sql": "{% macro default__create_indexes(relation) -%}\n {%- set _indexes = config.get('indexes', default=[]) -%}\n\n {% for _index_dict in _indexes %}\n {% set create_index_sql = get_create_index_sql(relation, _index_dict) %}\n {% if create_index_sql %}\n {% do run_query(create_index_sql) %}\n {% endif %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_create_index_sql", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.533636, "supported_languages": null}, "macro.dbt.make_intermediate_relation": {"name": "make_intermediate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.make_intermediate_relation", "macro_sql": "{% macro make_intermediate_relation(base_relation, suffix='__dbt_tmp') %}\n {{ return(adapter.dispatch('make_intermediate_relation', 'dbt')(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_intermediate_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.541701, "supported_languages": null}, "macro.dbt.default__make_intermediate_relation": {"name": "default__make_intermediate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__make_intermediate_relation", "macro_sql": "{% macro default__make_intermediate_relation(base_relation, suffix) %}\n {{ return(default__make_temp_relation(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.54245, "supported_languages": null}, "macro.dbt.make_temp_relation": {"name": "make_temp_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.make_temp_relation", "macro_sql": "{% macro make_temp_relation(base_relation, suffix='__dbt_tmp') %}\n {{ return(adapter.dispatch('make_temp_relation', 'dbt')(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.543215, "supported_languages": null}, "macro.dbt.default__make_temp_relation": {"name": "default__make_temp_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__make_temp_relation", "macro_sql": "{% macro default__make_temp_relation(base_relation, suffix) %}\n {%- set temp_identifier = base_relation.identifier ~ suffix -%}\n {%- set temp_relation = base_relation.incorporate(\n path={\"identifier\": temp_identifier}) -%}\n\n {{ return(temp_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.544181, "supported_languages": null}, "macro.dbt.make_backup_relation": {"name": "make_backup_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.make_backup_relation", "macro_sql": "{% macro make_backup_relation(base_relation, backup_relation_type, suffix='__dbt_backup') %}\n {{ return(adapter.dispatch('make_backup_relation', 'dbt')(base_relation, backup_relation_type, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_backup_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5449972, "supported_languages": null}, "macro.dbt.default__make_backup_relation": {"name": "default__make_backup_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__make_backup_relation", "macro_sql": "{% macro default__make_backup_relation(base_relation, backup_relation_type, suffix) %}\n {%- set backup_identifier = base_relation.identifier ~ suffix -%}\n {%- set backup_relation = base_relation.incorporate(\n path={\"identifier\": backup_identifier},\n type=backup_relation_type\n ) -%}\n {{ return(backup_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.546206, "supported_languages": null}, "macro.dbt.drop_relation": {"name": "drop_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.drop_relation", "macro_sql": "{% macro drop_relation(relation) -%}\n {{ return(adapter.dispatch('drop_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__drop_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.546863, "supported_languages": null}, "macro.dbt.default__drop_relation": {"name": "default__drop_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__drop_relation", "macro_sql": "{% macro default__drop_relation(relation) -%}\n {% call statement('drop_relation', auto_begin=False) -%}\n drop {{ relation.type }} if exists {{ relation }} cascade\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.547938, "supported_languages": null}, "macro.dbt.truncate_relation": {"name": "truncate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.truncate_relation", "macro_sql": "{% macro truncate_relation(relation) -%}\n {{ return(adapter.dispatch('truncate_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__truncate_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.548612, "supported_languages": null}, "macro.dbt.default__truncate_relation": {"name": "default__truncate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__truncate_relation", "macro_sql": "{% macro default__truncate_relation(relation) -%}\n {% call statement('truncate_relation') -%}\n truncate table {{ relation }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5491798, "supported_languages": null}, "macro.dbt.rename_relation": {"name": "rename_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.rename_relation", "macro_sql": "{% macro rename_relation(from_relation, to_relation) -%}\n {{ return(adapter.dispatch('rename_relation', 'dbt')(from_relation, to_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__rename_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.54987, "supported_languages": null}, "macro.dbt.default__rename_relation": {"name": "default__rename_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__rename_relation", "macro_sql": "{% macro default__rename_relation(from_relation, to_relation) -%}\n {% set target_name = adapter.quote_as_configured(to_relation.identifier, 'identifier') %}\n {% call statement('rename_relation') -%}\n alter table {{ from_relation }} rename to {{ target_name }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5508428, "supported_languages": null}, "macro.dbt.get_or_create_relation": {"name": "get_or_create_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.get_or_create_relation", "macro_sql": "{% macro get_or_create_relation(database, schema, identifier, type) -%}\n {{ return(adapter.dispatch('get_or_create_relation', 'dbt')(database, schema, identifier, type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_or_create_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5516741, "supported_languages": null}, "macro.dbt.default__get_or_create_relation": {"name": "default__get_or_create_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__get_or_create_relation", "macro_sql": "{% macro default__get_or_create_relation(database, schema, identifier, type) %}\n {%- set target_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) %}\n\n {% if target_relation %}\n {% do return([true, target_relation]) %}\n {% endif %}\n\n {%- set new_relation = api.Relation.create(\n database=database,\n schema=schema,\n identifier=identifier,\n type=type\n ) -%}\n {% do return([false, new_relation]) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.555399, "supported_languages": null}, "macro.dbt.load_cached_relation": {"name": "load_cached_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.load_cached_relation", "macro_sql": "{% macro load_cached_relation(relation) %}\n {% do return(adapter.get_relation(\n database=relation.database,\n schema=relation.schema,\n identifier=relation.identifier\n )) -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5572731, "supported_languages": null}, "macro.dbt.load_relation": {"name": "load_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.load_relation", "macro_sql": "{% macro load_relation(relation) %}\n {{ return(load_cached_relation(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.557798, "supported_languages": null}, "macro.dbt.drop_relation_if_exists": {"name": "drop_relation_if_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.drop_relation_if_exists", "macro_sql": "{% macro drop_relation_if_exists(relation) %}\n {% if relation is not none %}\n {{ adapter.drop_relation(relation) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.558468, "supported_languages": null}, "macro.dbt.collect_freshness": {"name": "collect_freshness", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/freshness.sql", "original_file_path": "macros/adapters/freshness.sql", "unique_id": "macro.dbt.collect_freshness", "macro_sql": "{% macro collect_freshness(source, loaded_at_field, filter) %}\n {{ return(adapter.dispatch('collect_freshness', 'dbt')(source, loaded_at_field, filter))}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__collect_freshness"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5597389, "supported_languages": null}, "macro.dbt.default__collect_freshness": {"name": "default__collect_freshness", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/freshness.sql", "original_file_path": "macros/adapters/freshness.sql", "unique_id": "macro.dbt.default__collect_freshness", "macro_sql": "{% macro default__collect_freshness(source, loaded_at_field, filter) %}\n {% call statement('collect_freshness', fetch_result=True, auto_begin=False) -%}\n select\n max({{ loaded_at_field }}) as max_loaded_at,\n {{ current_timestamp() }} as snapshotted_at\n from {{ source }}\n {% if filter %}\n where {{ filter }}\n {% endif %}\n {% endcall %}\n {{ return(load_result('collect_freshness')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.561103, "supported_languages": null}, "macro.dbt.copy_grants": {"name": "copy_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.copy_grants", "macro_sql": "{% macro copy_grants() %}\n {{ return(adapter.dispatch('copy_grants', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__copy_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.567491, "supported_languages": null}, "macro.dbt.default__copy_grants": {"name": "default__copy_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__copy_grants", "macro_sql": "{% macro default__copy_grants() %}\n {{ return(True) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.567991, "supported_languages": null}, "macro.dbt.support_multiple_grantees_per_dcl_statement": {"name": "support_multiple_grantees_per_dcl_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.support_multiple_grantees_per_dcl_statement", "macro_sql": "{% macro support_multiple_grantees_per_dcl_statement() %}\n {{ return(adapter.dispatch('support_multiple_grantees_per_dcl_statement', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__support_multiple_grantees_per_dcl_statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.568581, "supported_languages": null}, "macro.dbt.default__support_multiple_grantees_per_dcl_statement": {"name": "default__support_multiple_grantees_per_dcl_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__support_multiple_grantees_per_dcl_statement", "macro_sql": "\n\n{%- macro default__support_multiple_grantees_per_dcl_statement() -%}\n {{ return(True) }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.569404, "supported_languages": null}, "macro.dbt.should_revoke": {"name": "should_revoke", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.should_revoke", "macro_sql": "{% macro should_revoke(existing_relation, full_refresh_mode=True) %}\n\n {% if not existing_relation %}\n {#-- The table doesn't already exist, so no grants to copy over --#}\n {{ return(False) }}\n {% elif full_refresh_mode %}\n {#-- The object is being REPLACED -- whether grants are copied over depends on the value of user config --#}\n {{ return(copy_grants()) }}\n {% else %}\n {#-- The table is being merged/upserted/inserted -- grants will be carried over --#}\n {{ return(True) }}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.copy_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5731158, "supported_languages": null}, "macro.dbt.get_show_grant_sql": {"name": "get_show_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.get_show_grant_sql", "macro_sql": "{% macro get_show_grant_sql(relation) %}\n {{ return(adapter.dispatch(\"get_show_grant_sql\", \"dbt\")(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_show_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.573929, "supported_languages": null}, "macro.dbt.default__get_show_grant_sql": {"name": "default__get_show_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__get_show_grant_sql", "macro_sql": "{% macro default__get_show_grant_sql(relation) %}\n show grants on {{ relation }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.574301, "supported_languages": null}, "macro.dbt.get_grant_sql": {"name": "get_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.get_grant_sql", "macro_sql": "{% macro get_grant_sql(relation, privilege, grantees) %}\n {{ return(adapter.dispatch('get_grant_sql', 'dbt')(relation, privilege, grantees)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.575246, "supported_languages": null}, "macro.dbt.default__get_grant_sql": {"name": "default__get_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__get_grant_sql", "macro_sql": "\n\n{%- macro default__get_grant_sql(relation, privilege, grantees) -%}\n grant {{ privilege }} on {{ relation }} to {{ grantees | join(', ') }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5760052, "supported_languages": null}, "macro.dbt.get_revoke_sql": {"name": "get_revoke_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.get_revoke_sql", "macro_sql": "{% macro get_revoke_sql(relation, privilege, grantees) %}\n {{ return(adapter.dispatch('get_revoke_sql', 'dbt')(relation, privilege, grantees)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_revoke_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5767932, "supported_languages": null}, "macro.dbt.default__get_revoke_sql": {"name": "default__get_revoke_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__get_revoke_sql", "macro_sql": "\n\n{%- macro default__get_revoke_sql(relation, privilege, grantees) -%}\n revoke {{ privilege }} on {{ relation }} from {{ grantees | join(', ') }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.577448, "supported_languages": null}, "macro.dbt.get_dcl_statement_list": {"name": "get_dcl_statement_list", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.get_dcl_statement_list", "macro_sql": "{% macro get_dcl_statement_list(relation, grant_config, get_dcl_macro) %}\n {{ return(adapter.dispatch('get_dcl_statement_list', 'dbt')(relation, grant_config, get_dcl_macro)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_dcl_statement_list"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.579498, "supported_languages": null}, "macro.dbt.default__get_dcl_statement_list": {"name": "default__get_dcl_statement_list", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__get_dcl_statement_list", "macro_sql": "\n\n{%- macro default__get_dcl_statement_list(relation, grant_config, get_dcl_macro) -%}\n {#\n -- Unpack grant_config into specific privileges and the set of users who need them granted/revoked.\n -- Depending on whether this database supports multiple grantees per statement, pass in the list of\n -- all grantees per privilege, or (if not) template one statement per privilege-grantee pair.\n -- `get_dcl_macro` will be either `get_grant_sql` or `get_revoke_sql`\n #}\n {%- set dcl_statements = [] -%}\n {%- for privilege, grantees in grant_config.items() %}\n {%- if support_multiple_grantees_per_dcl_statement() and grantees -%}\n {%- set dcl = get_dcl_macro(relation, privilege, grantees) -%}\n {%- do dcl_statements.append(dcl) -%}\n {%- else -%}\n {%- for grantee in grantees -%}\n {% set dcl = get_dcl_macro(relation, privilege, [grantee]) %}\n {%- do dcl_statements.append(dcl) -%}\n {% endfor -%}\n {%- endif -%}\n {%- endfor -%}\n {{ return(dcl_statements) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.support_multiple_grantees_per_dcl_statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5875552, "supported_languages": null}, "macro.dbt.call_dcl_statements": {"name": "call_dcl_statements", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.call_dcl_statements", "macro_sql": "{% macro call_dcl_statements(dcl_statement_list) %}\n {{ return(adapter.dispatch(\"call_dcl_statements\", \"dbt\")(dcl_statement_list)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__call_dcl_statements"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5899708, "supported_languages": null}, "macro.dbt.default__call_dcl_statements": {"name": "default__call_dcl_statements", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__call_dcl_statements", "macro_sql": "{% macro default__call_dcl_statements(dcl_statement_list) %}\n {#\n -- By default, supply all grant + revoke statements in a single semicolon-separated block,\n -- so that they're all processed together.\n\n -- Some databases do not support this. Those adapters will need to override this macro\n -- to run each statement individually.\n #}\n {% call statement('grants') %}\n {% for dcl_statement in dcl_statement_list %}\n {{ dcl_statement }};\n {% endfor %}\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.593122, "supported_languages": null}, "macro.dbt.apply_grants": {"name": "apply_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.apply_grants", "macro_sql": "{% macro apply_grants(relation, grant_config, should_revoke) %}\n {{ return(adapter.dispatch(\"apply_grants\", \"dbt\")(relation, grant_config, should_revoke)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__apply_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.5958788, "supported_languages": null}, "macro.dbt.default__apply_grants": {"name": "default__apply_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__apply_grants", "macro_sql": "{% macro default__apply_grants(relation, grant_config, should_revoke=True) %}\n {#-- If grant_config is {} or None, this is a no-op --#}\n {% if grant_config %}\n {% if should_revoke %}\n {#-- We think previous grants may have carried over --#}\n {#-- Show current grants and calculate diffs --#}\n {% set current_grants_table = run_query(get_show_grant_sql(relation)) %}\n {% set current_grants_dict = adapter.standardize_grants_dict(current_grants_table) %}\n {% set needs_granting = diff_of_two_dicts(grant_config, current_grants_dict) %}\n {% set needs_revoking = diff_of_two_dicts(current_grants_dict, grant_config) %}\n {% if not (needs_granting or needs_revoking) %}\n {{ log('On ' ~ relation ~': All grants are in place, no revocation or granting needed.')}}\n {% endif %}\n {% else %}\n {#-- We don't think there's any chance of previous grants having carried over. --#}\n {#-- Jump straight to granting what the user has configured. --#}\n {% set needs_revoking = {} %}\n {% set needs_granting = grant_config %}\n {% endif %}\n {% if needs_granting or needs_revoking %}\n {% set revoke_statement_list = get_dcl_statement_list(relation, needs_revoking, get_revoke_sql) %}\n {% set grant_statement_list = get_dcl_statement_list(relation, needs_granting, get_grant_sql) %}\n {% set dcl_statement_list = revoke_statement_list + grant_statement_list %}\n {% if dcl_statement_list %}\n {{ call_dcl_statements(dcl_statement_list) }}\n {% endif %}\n {% endif %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.get_show_grant_sql", "macro.dbt.get_dcl_statement_list", "macro.dbt.call_dcl_statements"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.60791, "supported_languages": null}, "macro.dbt.alter_column_comment": {"name": "alter_column_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.alter_column_comment", "macro_sql": "{% macro alter_column_comment(relation, column_dict) -%}\n {{ return(adapter.dispatch('alter_column_comment', 'dbt')(relation, column_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.610055, "supported_languages": null}, "macro.dbt.default__alter_column_comment": {"name": "default__alter_column_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.default__alter_column_comment", "macro_sql": "{% macro default__alter_column_comment(relation, column_dict) -%}\n {{ exceptions.raise_not_implemented(\n 'alter_column_comment macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.610645, "supported_languages": null}, "macro.dbt.alter_relation_comment": {"name": "alter_relation_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.alter_relation_comment", "macro_sql": "{% macro alter_relation_comment(relation, relation_comment) -%}\n {{ return(adapter.dispatch('alter_relation_comment', 'dbt')(relation, relation_comment)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__alter_relation_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.611326, "supported_languages": null}, "macro.dbt.default__alter_relation_comment": {"name": "default__alter_relation_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.default__alter_relation_comment", "macro_sql": "{% macro default__alter_relation_comment(relation, relation_comment) -%}\n {{ exceptions.raise_not_implemented(\n 'alter_relation_comment macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.611895, "supported_languages": null}, "macro.dbt.persist_docs": {"name": "persist_docs", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.persist_docs", "macro_sql": "{% macro persist_docs(relation, model, for_relation=true, for_columns=true) -%}\n {{ return(adapter.dispatch('persist_docs', 'dbt')(relation, model, for_relation, for_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.612798, "supported_languages": null}, "macro.dbt.default__persist_docs": {"name": "default__persist_docs", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.default__persist_docs", "macro_sql": "{% macro default__persist_docs(relation, model, for_relation, for_columns) -%}\n {% if for_relation and config.persist_relation_docs() and model.description %}\n {% do run_query(alter_relation_comment(relation, model.description)) %}\n {% endif %}\n\n {% if for_columns and config.persist_column_docs() and model.columns %}\n {% do run_query(alter_column_comment(relation, model.columns)) %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.alter_relation_comment", "macro.dbt.alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6151118, "supported_languages": null}, "macro.dbt.get_catalog": {"name": "get_catalog", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.get_catalog", "macro_sql": "{% macro get_catalog(information_schema, schemas) -%}\n {{ return(adapter.dispatch('get_catalog', 'dbt')(information_schema, schemas)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_catalog"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.618986, "supported_languages": null}, "macro.dbt.default__get_catalog": {"name": "default__get_catalog", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__get_catalog", "macro_sql": "{% macro default__get_catalog(information_schema, schemas) -%}\n\n {% set typename = adapter.type() %}\n {% set msg -%}\n get_catalog not implemented for {{ typename }}\n {%- endset %}\n\n {{ exceptions.raise_compiler_error(msg) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.619884, "supported_languages": null}, "macro.dbt.information_schema_name": {"name": "information_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.information_schema_name", "macro_sql": "{% macro information_schema_name(database) %}\n {{ return(adapter.dispatch('information_schema_name', 'dbt')(database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__information_schema_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.620524, "supported_languages": null}, "macro.dbt.default__information_schema_name": {"name": "default__information_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__information_schema_name", "macro_sql": "{% macro default__information_schema_name(database) -%}\n {%- if database -%}\n {{ database }}.INFORMATION_SCHEMA\n {%- else -%}\n INFORMATION_SCHEMA\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.621061, "supported_languages": null}, "macro.dbt.list_schemas": {"name": "list_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.list_schemas", "macro_sql": "{% macro list_schemas(database) -%}\n {{ return(adapter.dispatch('list_schemas', 'dbt')(database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__list_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.621661, "supported_languages": null}, "macro.dbt.default__list_schemas": {"name": "default__list_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__list_schemas", "macro_sql": "{% macro default__list_schemas(database) -%}\n {% set sql %}\n select distinct schema_name\n from {{ information_schema_name(database) }}.SCHEMATA\n where catalog_name ilike '{{ database }}'\n {% endset %}\n {{ return(run_query(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.information_schema_name", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.622491, "supported_languages": null}, "macro.dbt.check_schema_exists": {"name": "check_schema_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.check_schema_exists", "macro_sql": "{% macro check_schema_exists(information_schema, schema) -%}\n {{ return(adapter.dispatch('check_schema_exists', 'dbt')(information_schema, schema)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__check_schema_exists"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.623289, "supported_languages": null}, "macro.dbt.default__check_schema_exists": {"name": "default__check_schema_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__check_schema_exists", "macro_sql": "{% macro default__check_schema_exists(information_schema, schema) -%}\n {% set sql -%}\n select count(*)\n from {{ information_schema.replace(information_schema_view='SCHEMATA') }}\n where catalog_name='{{ information_schema.database }}'\n and schema_name='{{ schema }}'\n {%- endset %}\n {{ return(run_query(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.replace", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.624913, "supported_languages": null}, "macro.dbt.list_relations_without_caching": {"name": "list_relations_without_caching", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.list_relations_without_caching", "macro_sql": "{% macro list_relations_without_caching(schema_relation) %}\n {{ return(adapter.dispatch('list_relations_without_caching', 'dbt')(schema_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__list_relations_without_caching"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.625965, "supported_languages": null}, "macro.dbt.default__list_relations_without_caching": {"name": "default__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__list_relations_without_caching", "macro_sql": "{% macro default__list_relations_without_caching(schema_relation) %}\n {{ exceptions.raise_not_implemented(\n 'list_relations_without_caching macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6267369, "supported_languages": null}, "macro.dbt.get_columns_in_relation": {"name": "get_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_columns_in_relation", "macro_sql": "{% macro get_columns_in_relation(relation) -%}\n {{ return(adapter.dispatch('get_columns_in_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.632364, "supported_languages": null}, "macro.dbt.default__get_columns_in_relation": {"name": "default__get_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__get_columns_in_relation", "macro_sql": "{% macro default__get_columns_in_relation(relation) -%}\n {{ exceptions.raise_not_implemented(\n 'get_columns_in_relation macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.633219, "supported_languages": null}, "macro.dbt.sql_convert_columns_in_relation": {"name": "sql_convert_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.sql_convert_columns_in_relation", "macro_sql": "{% macro sql_convert_columns_in_relation(table) -%}\n {% set columns = [] %}\n {% for row in table %}\n {% do columns.append(api.Column(*row)) %}\n {% endfor %}\n {{ return(columns) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.63434, "supported_languages": null}, "macro.dbt.get_empty_subquery_sql": {"name": "get_empty_subquery_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_empty_subquery_sql", "macro_sql": "{% macro get_empty_subquery_sql(select_sql) -%}\n {{ return(adapter.dispatch('get_empty_subquery_sql', 'dbt')(select_sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.635029, "supported_languages": null}, "macro.dbt.default__get_empty_subquery_sql": {"name": "default__get_empty_subquery_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__get_empty_subquery_sql", "macro_sql": "{% macro default__get_empty_subquery_sql(select_sql) %}\n select * from (\n {{ select_sql }}\n ) as __dbt_sbq\n where false\n limit 0\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6354089, "supported_languages": null}, "macro.dbt.get_empty_schema_sql": {"name": "get_empty_schema_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_empty_schema_sql", "macro_sql": "{% macro get_empty_schema_sql(columns) -%}\n {{ return(adapter.dispatch('get_empty_schema_sql', 'dbt')(columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_empty_schema_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6360111, "supported_languages": null}, "macro.dbt.default__get_empty_schema_sql": {"name": "default__get_empty_schema_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__get_empty_schema_sql", "macro_sql": "{% macro default__get_empty_schema_sql(columns) %}\n {%- set col_err = [] -%}\n select\n {% for i in columns %}\n {%- set col = columns[i] -%}\n {%- if col['data_type'] is not defined -%}\n {{ col_err.append(col['name']) }}\n {%- endif -%}\n cast(null as {{ col['data_type'] }}) as {{ col['name'] }}{{ \", \" if not loop.last }}\n {%- endfor -%}\n {%- if (col_err | length) > 0 -%}\n {{ exceptions.column_type_missing(column_names=col_err) }}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.638068, "supported_languages": null}, "macro.dbt.get_column_schema_from_query": {"name": "get_column_schema_from_query", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_column_schema_from_query", "macro_sql": "{% macro get_column_schema_from_query(select_sql) -%}\n {% set columns = [] %}\n {# -- Using an 'empty subquery' here to get the same schema as the given select_sql statement, without necessitating a data scan.#}\n {% set sql = get_empty_subquery_sql(select_sql) %}\n {% set column_schema = adapter.get_column_schema_from_query(sql) %}\n {{ return(column_schema) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.639094, "supported_languages": null}, "macro.dbt.get_columns_in_query": {"name": "get_columns_in_query", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_columns_in_query", "macro_sql": "{% macro get_columns_in_query(select_sql) -%}\n {{ return(adapter.dispatch('get_columns_in_query', 'dbt')(select_sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_columns_in_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6398258, "supported_languages": null}, "macro.dbt.default__get_columns_in_query": {"name": "default__get_columns_in_query", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__get_columns_in_query", "macro_sql": "{% macro default__get_columns_in_query(select_sql) %}\n {% call statement('get_columns_in_query', fetch_result=True, auto_begin=False) -%}\n {{ get_empty_subquery_sql(select_sql) }}\n {% endcall %}\n {{ return(load_result('get_columns_in_query').table.columns | map(attribute='name') | list) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6413481, "supported_languages": null}, "macro.dbt.alter_column_type": {"name": "alter_column_type", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.alter_column_type", "macro_sql": "{% macro alter_column_type(relation, column_name, new_column_type) -%}\n {{ return(adapter.dispatch('alter_column_type', 'dbt')(relation, column_name, new_column_type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__alter_column_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6427572, "supported_languages": null}, "macro.dbt.default__alter_column_type": {"name": "default__alter_column_type", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__alter_column_type", "macro_sql": "{% macro default__alter_column_type(relation, column_name, new_column_type) -%}\n {#\n 1. Create a new column (w/ temp name and correct type)\n 2. Copy data over to it\n 3. Drop the existing column (cascade!)\n 4. Rename the new column to existing column\n #}\n {%- set tmp_column = column_name + \"__dbt_alter\" -%}\n\n {% call statement('alter_column_type') %}\n alter table {{ relation }} add column {{ adapter.quote(tmp_column) }} {{ new_column_type }};\n update {{ relation }} set {{ adapter.quote(tmp_column) }} = {{ adapter.quote(column_name) }};\n alter table {{ relation }} drop column {{ adapter.quote(column_name) }} cascade;\n alter table {{ relation }} rename column {{ adapter.quote(tmp_column) }} to {{ adapter.quote(column_name) }}\n {% endcall %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6450932, "supported_languages": null}, "macro.dbt.alter_relation_add_remove_columns": {"name": "alter_relation_add_remove_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.alter_relation_add_remove_columns", "macro_sql": "{% macro alter_relation_add_remove_columns(relation, add_columns = none, remove_columns = none) -%}\n {{ return(adapter.dispatch('alter_relation_add_remove_columns', 'dbt')(relation, add_columns, remove_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__alter_relation_add_remove_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.646657, "supported_languages": null}, "macro.dbt.default__alter_relation_add_remove_columns": {"name": "default__alter_relation_add_remove_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__alter_relation_add_remove_columns", "macro_sql": "{% macro default__alter_relation_add_remove_columns(relation, add_columns, remove_columns) %}\n\n {% if add_columns is none %}\n {% set add_columns = [] %}\n {% endif %}\n {% if remove_columns is none %}\n {% set remove_columns = [] %}\n {% endif %}\n\n {% set sql -%}\n\n alter {{ relation.type }} {{ relation }}\n\n {% for column in add_columns %}\n add column {{ column.name }} {{ column.data_type }}{{ ',' if not loop.last }}\n {% endfor %}{{ ',' if add_columns and remove_columns }}\n\n {% for column in remove_columns %}\n drop column {{ column.name }}{{ ',' if not loop.last }}\n {% endfor %}\n\n {%- endset -%}\n\n {% do run_query(sql) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.65105, "supported_languages": null}, "macro.dbt.resolve_model_name": {"name": "resolve_model_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.resolve_model_name", "macro_sql": "{% macro resolve_model_name(input_model_name) %}\n {{ return(adapter.dispatch('resolve_model_name', 'dbt')(input_model_name)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.657228, "supported_languages": null}, "macro.dbt.default__resolve_model_name": {"name": "default__resolve_model_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.default__resolve_model_name", "macro_sql": "\n\n{%- macro default__resolve_model_name(input_model_name) -%}\n {{ input_model_name | string | replace('\"', '\\\"') }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.658139, "supported_languages": null}, "macro.dbt.build_ref_function": {"name": "build_ref_function", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.build_ref_function", "macro_sql": "{% macro build_ref_function(model) %}\n\n {%- set ref_dict = {} -%}\n {%- for _ref in model.refs -%}\n {% set _ref_args = [_ref.get('package'), _ref['name']] if _ref.get('package') else [_ref['name'],] %}\n {%- set resolved = ref(*_ref_args, v=_ref.get('version')) -%}\n {%- if _ref.get('version') -%}\n {% do _ref_args.extend([\"v\" ~ _ref['version']]) %}\n {%- endif -%}\n {%- do ref_dict.update({_ref_args | join('.'): resolve_model_name(resolved)}) -%}\n {%- endfor -%}\n\ndef ref(*args, **kwargs):\n refs = {{ ref_dict | tojson }}\n key = '.'.join(args)\n version = kwargs.get(\"v\") or kwargs.get(\"version\")\n if version:\n key += f\".v{version}\"\n dbt_load_df_function = kwargs.get(\"dbt_load_df_function\")\n return dbt_load_df_function(refs[key])\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.661082, "supported_languages": null}, "macro.dbt.build_source_function": {"name": "build_source_function", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.build_source_function", "macro_sql": "{% macro build_source_function(model) %}\n\n {%- set source_dict = {} -%}\n {%- for _source in model.sources -%}\n {%- set resolved = source(*_source) -%}\n {%- do source_dict.update({_source | join('.'): resolve_model_name(resolved)}) -%}\n {%- endfor -%}\n\ndef source(*args, dbt_load_df_function):\n sources = {{ source_dict | tojson }}\n key = '.'.join(args)\n return dbt_load_df_function(sources[key])\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.662658, "supported_languages": null}, "macro.dbt.build_config_dict": {"name": "build_config_dict", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.build_config_dict", "macro_sql": "{% macro build_config_dict(model) %}\n {%- set config_dict = {} -%}\n {% set config_dbt_used = zip(model.config.config_keys_used, model.config.config_keys_defaults) | list %}\n {%- for key, default in config_dbt_used -%}\n {# weird type testing with enum, would be much easier to write this logic in Python! #}\n {%- if key == \"language\" -%}\n {%- set value = \"python\" -%}\n {%- endif -%}\n {%- set value = model.config.get(key, default) -%}\n {%- do config_dict.update({key: value}) -%}\n {%- endfor -%}\nconfig_dict = {{ config_dict }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.665552, "supported_languages": null}, "macro.dbt.py_script_postfix": {"name": "py_script_postfix", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.py_script_postfix", "macro_sql": "{% macro py_script_postfix(model) %}\n# This part is user provided model code\n# you will need to copy the next section to run the code\n# COMMAND ----------\n# this part is dbt logic for get ref work, do not modify\n\n{{ build_ref_function(model ) }}\n{{ build_source_function(model ) }}\n{{ build_config_dict(model) }}\n\nclass config:\n def __init__(self, *args, **kwargs):\n pass\n\n @staticmethod\n def get(key, default=None):\n return config_dict.get(key, default)\n\nclass this:\n \"\"\"dbt.this() or dbt.this.identifier\"\"\"\n database = \"{{ this.database }}\"\n schema = \"{{ this.schema }}\"\n identifier = \"{{ this.identifier }}\"\n {% set this_relation_name = resolve_model_name(this) %}\n def __repr__(self):\n return '{{ this_relation_name }}'\n\n\nclass dbtObj:\n def __init__(self, load_df_function) -> None:\n self.source = lambda *args: source(*args, dbt_load_df_function=load_df_function)\n self.ref = lambda *args, **kwargs: ref(*args, **kwargs, dbt_load_df_function=load_df_function)\n self.config = config\n self.this = this()\n self.is_incremental = {{ is_incremental() }}\n\n# COMMAND ----------\n{{py_script_comment()}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.build_ref_function", "macro.dbt.build_source_function", "macro.dbt.build_config_dict", "macro.dbt.resolve_model_name", "macro.dbt.is_incremental", "macro.dbt.py_script_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.667629, "supported_languages": null}, "macro.dbt.py_script_comment": {"name": "py_script_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.py_script_comment", "macro_sql": "{%macro py_script_comment()%}\n{%endmacro%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6680708, "supported_languages": null}, "macro.dbt.test_unique": {"name": "test_unique", "resource_type": "macro", "package_name": "dbt", "path": "tests/generic/builtin.sql", "original_file_path": "tests/generic/builtin.sql", "unique_id": "macro.dbt.test_unique", "macro_sql": "{% test unique(model, column_name) %}\n {% set macro = adapter.dispatch('test_unique', 'dbt') %}\n {{ macro(model, column_name) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_unique"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6705642, "supported_languages": null}, "macro.dbt.test_not_null": {"name": "test_not_null", "resource_type": "macro", "package_name": "dbt", "path": "tests/generic/builtin.sql", "original_file_path": "tests/generic/builtin.sql", "unique_id": "macro.dbt.test_not_null", "macro_sql": "{% test not_null(model, column_name) %}\n {% set macro = adapter.dispatch('test_not_null', 'dbt') %}\n {{ macro(model, column_name) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_not_null"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.671791, "supported_languages": null}, "macro.dbt.test_accepted_values": {"name": "test_accepted_values", "resource_type": "macro", "package_name": "dbt", "path": "tests/generic/builtin.sql", "original_file_path": "tests/generic/builtin.sql", "unique_id": "macro.dbt.test_accepted_values", "macro_sql": "{% test accepted_values(model, column_name, values, quote=True) %}\n {% set macro = adapter.dispatch('test_accepted_values', 'dbt') %}\n {{ macro(model, column_name, values, quote) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_accepted_values"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.6731951, "supported_languages": null}, "macro.dbt.test_relationships": {"name": "test_relationships", "resource_type": "macro", "package_name": "dbt", "path": "tests/generic/builtin.sql", "original_file_path": "tests/generic/builtin.sql", "unique_id": "macro.dbt.test_relationships", "macro_sql": "{% test relationships(model, column_name, to, field) %}\n {% set macro = adapter.dispatch('test_relationships', 'dbt') %}\n {{ macro(model, column_name, to, field) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_relationships"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1681765285.67468, "supported_languages": null}}, "docs": {"doc.test.somedoc": {"name": "somedoc", "resource_type": "doc", "package_name": "test", "path": "somedoc.md", "original_file_path": "models/somedoc.md", "unique_id": "doc.test.somedoc", "block_contents": "Testing, testing"}, "doc.dbt.__overview__": {"name": "__overview__", "resource_type": "doc", "package_name": "dbt", "path": "overview.md", "original_file_path": "docs/overview.md", "unique_id": "doc.dbt.__overview__", "block_contents": "### Welcome!\n\nWelcome to the auto-generated documentation for your dbt project!\n\n### Navigation\n\nYou can use the `Project` and `Database` navigation tabs on the left side of the window to explore the models\nin your project.\n\n#### Project Tab\nThe `Project` tab mirrors the directory structure of your dbt project. In this tab, you can see all of the\nmodels defined in your dbt project, as well as models imported from dbt packages.\n\n#### Database Tab\nThe `Database` tab also exposes your models, but in a format that looks more like a database explorer. This view\nshows relations (tables and views) grouped into database schemas. Note that ephemeral models are _not_ shown\nin this interface, as they do not exist in the database.\n\n### Graph Exploration\nYou can click the blue icon on the bottom-right corner of the page to view the lineage graph of your models.\n\nOn model pages, you'll see the immediate parents and children of the model you're exploring. By clicking the `Expand`\nbutton at the top-right of this lineage pane, you'll be able to see all of the models that are used to build,\nor are built from, the model you're exploring.\n\nOnce expanded, you'll be able to use the `--select` and `--exclude` model selection syntax to filter the\nmodels in the graph. For more information on model selection, check out the [dbt docs](https://docs.getdbt.com/docs/model-selection-syntax).\n\nNote that you can also right-click on models to interactively filter and explore the graph.\n\n---\n\n### More information\n\n- [What is dbt](https://docs.getdbt.com/docs/introduction)?\n- Read the [dbt viewpoint](https://docs.getdbt.com/docs/viewpoint)\n- [Installation](https://docs.getdbt.com/docs/installation)\n- Join the [dbt Community](https://www.getdbt.com/community/) for questions and discussion"}}, "exposures": {"exposure.test.simple_exposure": {"name": "simple_exposure", "resource_type": "exposure", "package_name": "test", "path": "schema.yml", "original_file_path": "models/schema.yml", "unique_id": "exposure.test.simple_exposure", "fqn": ["test", "simple_exposure"], "type": "dashboard", "owner": {"email": "something@example.com", "name": null}, "description": "", "label": null, "maturity": null, "meta": {}, "tags": [], "config": {"enabled": true}, "unrendered_config": {}, "url": null, "depends_on": {"macros": [], "nodes": ["source.test.my_source.my_table", "model.test.my_model"]}, "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [["my_source", "my_table"]], "metrics": [], "created_at": 1681765286.509548}}, "metrics": {"metric.test.my_metric": {"name": "my_metric", "resource_type": "metric", "package_name": "test", "path": "schema.yml", "original_file_path": "models/schema.yml", "unique_id": "metric.test.my_metric", "fqn": ["test", "my_metric"], "description": "", "label": "Count records", "calculation_method": "count", "expression": "*", "filters": [], "time_grains": ["day"], "dimensions": [], "timestamp": "updated_at", "window": null, "model": "ref('my_model')", "model_unique_id": null, "meta": {}, "tags": [], "config": {"enabled": true, "group": null}, "unrendered_config": {}, "sources": [], "depends_on": {"macros": [], "nodes": ["model.test.my_model"]}, "refs": [{"name": "my_model", "package": null, "version": null}], "metrics": [], "created_at": 1681765286.751749, "group": null}}, "groups": {}, "selectors": {}, "disabled": {"model.test.disabled_model": [{"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state", "name": "disabled_model", "resource_type": "model", "package_name": "test", "path": "disabled_model.sql", "original_file_path": "models/disabled_model.sql", "unique_id": "model.test.disabled_model", "fqn": ["test", "disabled_model"], "alias": "disabled_model", "checksum": {"name": "sha256", "checksum": "597106d23ce34e3cd2430588e5c1cf474ebdd138fc47e09b925a4ab258a27acc"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "view", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1681765286.129226, "config_call_dict": {"enabled": false}, "relation_name": "\"dbt\".\"test16817652848506647403_test_previous_version_state\".\"disabled_model\"", "raw_code": "{{ config(enabled=False) }}\nselect 2 as id", "language": "sql", "refs": [], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null}], "snapshot.test.disabled_snapshot_seed": [{"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state", "name": "disabled_snapshot_seed", "resource_type": "snapshot", "package_name": "test", "path": "disabled_snapshot_seed.sql", "original_file_path": "snapshots/disabled_snapshot_seed.sql", "unique_id": "snapshot.test.disabled_snapshot_seed", "fqn": ["test", "disabled_snapshot_seed", "disabled_snapshot_seed"], "alias": "disabled_snapshot_seed", "checksum": {"name": "sha256", "checksum": "fe76c9dd437341c9e82a0f2a8baf3148f961b768eaa0a4410cd27d3c071bd617"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "snapshot", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": "id", "on_schema_change": "ignore", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "strategy": "check", "target_schema": "test16817652848506647403_test_previous_version_state", "target_database": null, "updated_at": null, "check_cols": "all", "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"unique_key": "id", "strategy": "check", "check_cols": "all", "target_schema": "test16817652848506647403_test_previous_version_state", "enabled": false}, "created_at": 1681765286.152009, "config_call_dict": {"unique_key": "id", "strategy": "check", "check_cols": "all", "target_schema": "test16817652848506647403_test_previous_version_state", "enabled": false}, "relation_name": "\"dbt\".\"test16817652848506647403_test_previous_version_state\".\"disabled_snapshot_seed\"", "raw_code": "\n{{\n config(\n unique_key='id',\n strategy='check',\n check_cols='all',\n target_schema=schema,\n enabled=False,\n )\n}}\nselect * from {{ ref('my_seed') }}\n", "language": "sql", "refs": [{"name": "my_seed", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}], "analysis.test.disabled_al": [{"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state", "name": "disabled_al", "resource_type": "analysis", "package_name": "test", "path": "analysis/disabled_al.sql", "original_file_path": "analyses/disabled_al.sql", "unique_id": "analysis.test.disabled_al", "fqn": ["test", "analysis", "disabled_al"], "alias": "disabled_al", "checksum": {"name": "sha256", "checksum": "32d36ad6cff0786eb562440ba60ef6c9b9a7f4c282dfb7a52eaf19d36370f0e1"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "view", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1681765286.2765188, "config_call_dict": {"enabled": false}, "relation_name": null, "raw_code": "{{ config(enabled=False) }}\nselect 9 as id", "language": "sql", "refs": [], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}], "test.test.disabled_just_my": [{"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state_dbt_test__audit", "name": "disabled_just_my", "resource_type": "test", "package_name": "test", "path": "disabled_just_my.sql", "original_file_path": "tests/disabled_just_my.sql", "unique_id": "test.test.disabled_just_my", "fqn": ["test", "disabled_just_my"], "alias": "disabled_just_my", "checksum": {"name": "sha256", "checksum": "4f2268fd89a3b4ef899264ada6d7aa33603671cbc5d5acead7dc2eadf1add985"}, "config": {"enabled": false, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1681765286.411446, "config_call_dict": {"enabled": false}, "relation_name": null, "raw_code": "{{ config(enabled=False) }}\n\nselect * from {{ ref('my_model') }}\nwhere false", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}], "test.test.disabled_check_nothing_my_model_.f2c6a72d37": [{"test_metadata": {"name": "disabled_check_nothing", "kwargs": {"model": "{{ get_where_subquery(ref('my_model')) }}"}, "namespace": null}, "database": "dbt", "schema": "test16817652848506647403_test_previous_version_state_dbt_test__audit", "name": "disabled_check_nothing_my_model_", "resource_type": "test", "package_name": "test", "path": "disabled_check_nothing_my_model_.sql", "original_file_path": "models/schema.yml", "unique_id": "test.test.disabled_check_nothing_my_model_.f2c6a72d37", "fqn": ["test", "disabled_check_nothing_my_model_"], "alias": "disabled_check_nothing_my_model_", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": false, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1681765286.4888241, "config_call_dict": {"enabled": false}, "relation_name": null, "raw_code": "{{ test_disabled_check_nothing(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.test.test_disabled_check_nothing", "macro.dbt.get_where_subquery"], "nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "column_name": null, "file_key_name": "models.my_model", "attached_node": "model.test.my_model"}], "exposure.test.disabled_exposure": [{"name": "disabled_exposure", "resource_type": "exposure", "package_name": "test", "path": "schema.yml", "original_file_path": "models/schema.yml", "unique_id": "exposure.test.disabled_exposure", "fqn": ["test", "disabled_exposure"], "type": "dashboard", "owner": {"email": "something@example.com", "name": null}, "description": "", "label": null, "maturity": null, "meta": {}, "tags": [], "config": {"enabled": false}, "unrendered_config": {"enabled": false}, "url": null, "depends_on": {"macros": [], "nodes": []}, "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "created_at": 1681765286.514165}], "metric.test.disabled_metric": [{"name": "disabled_metric", "resource_type": "metric", "package_name": "test", "path": "schema.yml", "original_file_path": "models/schema.yml", "unique_id": "metric.test.disabled_metric", "fqn": ["test", "disabled_metric"], "description": "", "label": "Count records", "calculation_method": "count", "expression": "*", "filters": [], "time_grains": ["day"], "dimensions": [], "timestamp": "updated_at", "window": null, "model": "ref('my_model')", "model_unique_id": null, "meta": {}, "tags": [], "config": {"enabled": false, "group": null}, "unrendered_config": {"enabled": false}, "sources": [], "depends_on": {"macros": [], "nodes": []}, "refs": [{"name": "my_model", "package": null, "version": null}], "metrics": [], "created_at": 1681765286.759514, "group": null}], "seed.test.disabled_seed": [{"database": "dbt", "schema": "test16817652848506647403_test_previous_version_state", "name": "disabled_seed", "resource_type": "seed", "package_name": "test", "path": "disabled_seed.csv", "original_file_path": "seeds/disabled_seed.csv", "unique_id": "seed.test.disabled_seed", "fqn": ["test", "disabled_seed"], "alias": "disabled_seed", "checksum": {"name": "sha256", "checksum": "31fddd8ec40c6aba6a3a8e7d83fedea2fd0a56c47b64ea3df1847ec1b018e2d1"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "seed", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "quote_columns": null, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "test://models/schema.yml", "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1681765286.501188, "config_call_dict": {}, "relation_name": "\"dbt\".\"test16817652848506647403_test_previous_version_state\".\"disabled_seed\"", "raw_code": "", "root_path": "/private/var/folders/qt/vw8wqdgx4w381wh14b9y25m40000gn/T/pytest-of-gerda/pytest-600/project6", "depends_on": {"macros": []}}], "source.test.my_source.disabled_table": [{"database": "dbt", "schema": "my_source", "name": "disabled_table", "resource_type": "source", "package_name": "test", "path": "models/schema.yml", "original_file_path": "models/schema.yml", "unique_id": "source.test.my_source.disabled_table", "fqn": ["test", "my_source", "disabled_table"], "source_name": "my_source", "source_description": "My source", "loader": "a_loader", "identifier": "disabled_table", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "Disabled table", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": false}, "patch_path": null, "unrendered_config": {"enabled": false}, "relation_name": "\"dbt\".\"my_source\".\"disabled_table\"", "created_at": 1681765286.765145}]}, "parent_map": {"model.test.my_model": [], "snapshot.test.snapshot_seed": ["seed.test.my_seed"], "analysis.test.a": [], "test.test.just_my": ["model.test.my_model"], "seed.test.my_seed": [], "test.test.not_null_my_model_id.43e0e9183a": ["model.test.my_model"], "test.test.check_nothing_my_model_.d5a5e66110": ["model.test.my_model"], "source.test.my_source.my_table": [], "exposure.test.simple_exposure": ["model.test.my_model", "source.test.my_source.my_table"], "metric.test.my_metric": ["model.test.my_model"]}, "child_map": {"model.test.my_model": ["exposure.test.simple_exposure", "metric.test.my_metric", "test.test.check_nothing_my_model_.d5a5e66110", "test.test.just_my", "test.test.not_null_my_model_id.43e0e9183a"], "snapshot.test.snapshot_seed": [], "analysis.test.a": [], "test.test.just_my": [], "seed.test.my_seed": ["snapshot.test.snapshot_seed"], "test.test.not_null_my_model_id.43e0e9183a": [], "test.test.check_nothing_my_model_.d5a5e66110": [], "source.test.my_source.my_table": ["exposure.test.simple_exposure"], "exposure.test.simple_exposure": [], "metric.test.my_metric": []}, "group_map": {}, "public_nodes": {}} +{"metadata": {"dbt_schema_version": "https://schemas.getdbt.com/dbt/manifest/v10.json", "dbt_version": "1.6.0b2", "generated_at": "2023-06-08T14:21:55.831755Z", "invocation_id": "a44bae38-8ae9-4380-8e42-4d727ab81858", "env": {}, "project_name": "test", "project_id": "098f6bcd4621d373cade4e832627b4f6", "user_id": null, "send_anonymous_usage_stats": false, "adapter_type": "postgres"}, "nodes": {"model.test.my_model": {"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state", "name": "my_model", "resource_type": "model", "package_name": "test", "path": "my_model.sql", "original_file_path": "models/my_model.sql", "unique_id": "model.test.my_model", "fqn": ["test", "my_model"], "alias": "my_model", "checksum": {"name": "sha256", "checksum": "3ea0f972fa1b56aa2dc2f56ee784b6a5796312f9a813d59ae70fd8855f10d16d"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "view", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "post-hook": [], "pre-hook": []}, "tags": [], "description": "Example model", "columns": {"id": {"name": "id", "description": "", "meta": {}, "data_type": null, "constraints": [], "quote": null, "tags": []}}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "test://models/schema.yml", "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1686234115.427139, "relation_name": "\"dbt\".\"test16862341144970300705_test_previous_version_state\".\"my_model\"", "raw_code": "select 1 as id", "language": "sql", "refs": [], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null}, "snapshot.test.snapshot_seed": {"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state", "name": "snapshot_seed", "resource_type": "snapshot", "package_name": "test", "path": "snapshot_seed.sql", "original_file_path": "snapshots/snapshot_seed.sql", "unique_id": "snapshot.test.snapshot_seed", "fqn": ["test", "snapshot_seed", "snapshot_seed"], "alias": "snapshot_seed", "checksum": {"name": "sha256", "checksum": "5fc998f39655f8fe52443a919e749b6e23883ef90202b040412baac13c6bfe18"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "snapshot", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": "id", "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "strategy": "check", "target_schema": "test16862341144970300705_test_previous_version_state", "target_database": null, "updated_at": null, "check_cols": "all", "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"unique_key": "id", "strategy": "check", "check_cols": "all", "target_schema": "test16862341144970300705_test_previous_version_state"}, "created_at": 1686234115.309002, "relation_name": "\"dbt\".\"test16862341144970300705_test_previous_version_state\".\"snapshot_seed\"", "raw_code": "\n{{\n config(\n unique_key='id',\n strategy='check',\n check_cols='all',\n target_schema=schema,\n )\n}}\nselect * from {{ ref('my_seed') }}\n", "language": "sql", "refs": [{"name": "my_seed", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["seed.test.my_seed"], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}, "analysis.test.a": {"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state", "name": "a", "resource_type": "analysis", "package_name": "test", "path": "analysis/a.sql", "original_file_path": "analyses/a.sql", "unique_id": "analysis.test.a", "fqn": ["test", "analysis", "a"], "alias": "a", "checksum": {"name": "sha256", "checksum": "a389c282f569f0bbdc2a8a4f174dea746c28582fdaf2048d31d9226af9feab23"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "view", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1686234115.329563, "relation_name": null, "raw_code": "select 4 as id", "language": "sql", "refs": [], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}, "test.test.just_my": {"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state_dbt_test__audit", "name": "just_my", "resource_type": "test", "package_name": "test", "path": "just_my.sql", "original_file_path": "tests/just_my.sql", "unique_id": "test.test.just_my", "fqn": ["test", "just_my"], "alias": "just_my", "checksum": {"name": "sha256", "checksum": "744889a2e2d9ce380619265e1217d7ccf6e6ca896c048d42ebe0f9cfb74d7156"}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": ["data_test_tag"], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": ["data_test_tag"], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"tags": ["data_test_tag"]}, "created_at": 1686234115.384008, "relation_name": null, "raw_code": "{{ config(tags = ['data_test_tag']) }}\n\nselect * from {{ ref('my_model') }}\nwhere false", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": ["model.test.my_model"], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}, "seed.test.my_seed": {"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state", "name": "my_seed", "resource_type": "seed", "package_name": "test", "path": "my_seed.csv", "original_file_path": "seeds/my_seed.csv", "unique_id": "seed.test.my_seed", "fqn": ["test", "my_seed"], "alias": "my_seed", "checksum": {"name": "sha256", "checksum": "f7ede83f36165ac6b7a047aa2c3f212dff385bfa9f35f395108cd06fc8e96943"}, "config": {"enabled": true, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "seed", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "quote_columns": null, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1686234115.396647, "relation_name": "\"dbt\".\"test16862341144970300705_test_previous_version_state\".\"my_seed\"", "raw_code": "", "root_path": "/private/var/folders/79/5290gpvn3lx5jdryk4844rm80000gn/T/pytest-of-quigleymalcolm/pytest-52/popen-gw0/project8", "depends_on": {"macros": []}}, "test.test.not_null_my_model_id.43e0e9183a": {"test_metadata": {"name": "not_null", "kwargs": {"column_name": "id", "model": "{{ get_where_subquery(ref('my_model')) }}"}, "namespace": null}, "database": "dbt", "schema": "test16862341144970300705_test_previous_version_state_dbt_test__audit", "name": "not_null_my_model_id", "resource_type": "test", "package_name": "test", "path": "not_null_my_model_id.sql", "original_file_path": "models/schema.yml", "unique_id": "test.test.not_null_my_model_id.43e0e9183a", "fqn": ["test", "not_null_my_model_id"], "alias": "not_null_my_model_id", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1686234115.4282088, "relation_name": null, "raw_code": "{{ test_not_null(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.dbt.test_not_null"], "nodes": ["model.test.my_model"], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "column_name": "id", "file_key_name": "models.my_model", "attached_node": "model.test.my_model"}, "test.test.check_nothing_my_model_.d5a5e66110": {"test_metadata": {"name": "check_nothing", "kwargs": {"model": "{{ get_where_subquery(ref('my_model')) }}"}, "namespace": null}, "database": "dbt", "schema": "test16862341144970300705_test_previous_version_state_dbt_test__audit", "name": "check_nothing_my_model_", "resource_type": "test", "package_name": "test", "path": "check_nothing_my_model_.sql", "original_file_path": "models/schema.yml", "unique_id": "test.test.check_nothing_my_model_.d5a5e66110", "fqn": ["test", "check_nothing_my_model_"], "alias": "check_nothing_my_model_", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": true, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {}, "created_at": 1686234115.429824, "relation_name": null, "raw_code": "{{ test_check_nothing(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.test.test_check_nothing", "macro.dbt.get_where_subquery"], "nodes": ["model.test.my_model"], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "column_name": null, "file_key_name": "models.my_model", "attached_node": "model.test.my_model"}}, "sources": {"source.test.my_source.my_table": {"database": "dbt", "schema": "my_source", "name": "my_table", "resource_type": "source", "package_name": "test", "path": "models/schema.yml", "original_file_path": "models/schema.yml", "unique_id": "source.test.my_source.my_table", "fqn": ["test", "my_source", "my_table"], "source_name": "my_source", "source_description": "My source", "loader": "a_loader", "identifier": "my_seed", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "My table", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": true}, "patch_path": null, "unrendered_config": {}, "relation_name": "\"dbt\".\"my_source\".\"my_seed\"", "created_at": 1686234115.485457}}, "macros": {"macro.test.test_check_nothing": {"name": "test_check_nothing", "resource_type": "macro", "package_name": "test", "path": "macros/dummy_test.sql", "original_file_path": "macros/dummy_test.sql", "unique_id": "macro.test.test_check_nothing", "macro_sql": "{% test check_nothing(model) %}\n-- a silly test to make sure that table-level tests show up in the manifest\n-- without a column_name field\n\nselect 0\n\n{% endtest %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.678244, "supported_languages": null}, "macro.test.test_disabled_check_nothing": {"name": "test_disabled_check_nothing", "resource_type": "macro", "package_name": "test", "path": "macros/disabled_dummy_test.sql", "original_file_path": "macros/disabled_dummy_test.sql", "unique_id": "macro.test.test_disabled_check_nothing", "macro_sql": "{% test disabled_check_nothing(model) %}\n-- a silly test to make sure that table-level tests show up in the manifest\n-- without a column_name field\n\n{{ config(enabled=False) }}\nselect 0\n\n{% endtest %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.6786308, "supported_languages": null}, "macro.test.do_nothing": {"name": "do_nothing", "resource_type": "macro", "package_name": "test", "path": "macros/do_nothing.sql", "original_file_path": "macros/do_nothing.sql", "unique_id": "macro.test.do_nothing", "macro_sql": "{% macro do_nothing(foo2, bar2) %}\n select\n '{{ foo2 }}' as foo2,\n '{{ bar2 }}' as bar2\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.678988, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp": {"name": "postgres__current_timestamp", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp", "macro_sql": "{% macro postgres__current_timestamp() -%}\n now()\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.679455, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_string_as_time": {"name": "postgres__snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_string_as_time", "macro_sql": "{% macro postgres__snapshot_string_as_time(timestamp) -%}\n {%- set result = \"'\" ~ timestamp ~ \"'::timestamp without time zone\" -%}\n {{ return(result) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.679841, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_get_time": {"name": "postgres__snapshot_get_time", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_get_time", "macro_sql": "{% macro postgres__snapshot_get_time() -%}\n {{ current_timestamp() }}::timestamp without time zone\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.6800508, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp_backcompat": {"name": "postgres__current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp_backcompat", "macro_sql": "{% macro postgres__current_timestamp_backcompat() %}\n current_timestamp::{{ type_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.6802602, "supported_languages": null}, "macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat": {"name": "postgres__current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/timestamps.sql", "original_file_path": "macros/timestamps.sql", "unique_id": "macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat", "macro_sql": "{% macro postgres__current_timestamp_in_utc_backcompat() %}\n (current_timestamp at time zone 'utc')::{{ type_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.680468, "supported_languages": null}, "macro.dbt_postgres.postgres__get_catalog": {"name": "postgres__get_catalog", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/catalog.sql", "original_file_path": "macros/catalog.sql", "unique_id": "macro.dbt_postgres.postgres__get_catalog", "macro_sql": "{% macro postgres__get_catalog(information_schema, schemas) -%}\n\n {%- call statement('catalog', fetch_result=True) -%}\n {#\n If the user has multiple databases set and the first one is wrong, this will fail.\n But we won't fail in the case where there are multiple quoting-difference-only dbs, which is better.\n #}\n {% set database = information_schema.database %}\n {{ adapter.verify_database(database) }}\n\n select\n '{{ database }}' as table_database,\n sch.nspname as table_schema,\n tbl.relname as table_name,\n case tbl.relkind\n when 'v' then 'VIEW'\n else 'BASE TABLE'\n end as table_type,\n tbl_desc.description as table_comment,\n col.attname as column_name,\n col.attnum as column_index,\n pg_catalog.format_type(col.atttypid, col.atttypmod) as column_type,\n col_desc.description as column_comment,\n pg_get_userbyid(tbl.relowner) as table_owner\n\n from pg_catalog.pg_namespace sch\n join pg_catalog.pg_class tbl on tbl.relnamespace = sch.oid\n join pg_catalog.pg_attribute col on col.attrelid = tbl.oid\n left outer join pg_catalog.pg_description tbl_desc on (tbl_desc.objoid = tbl.oid and tbl_desc.objsubid = 0)\n left outer join pg_catalog.pg_description col_desc on (col_desc.objoid = tbl.oid and col_desc.objsubid = col.attnum)\n\n where (\n {%- for schema in schemas -%}\n upper(sch.nspname) = upper('{{ schema }}'){%- if not loop.last %} or {% endif -%}\n {%- endfor -%}\n )\n and not pg_is_other_temp_schema(sch.oid) -- not a temporary schema belonging to another session\n and tbl.relpersistence in ('p', 'u') -- [p]ermanent table or [u]nlogged table. Exclude [t]emporary tables\n and tbl.relkind in ('r', 'v', 'f', 'p') -- o[r]dinary table, [v]iew, [f]oreign table, [p]artitioned table. Other values are [i]ndex, [S]equence, [c]omposite type, [t]OAST table, [m]aterialized view\n and col.attnum > 0 -- negative numbers are used for system columns such as oid\n and not col.attisdropped -- column as not been dropped\n\n order by\n sch.nspname,\n tbl.relname,\n col.attnum\n\n {%- endcall -%}\n\n {{ return(load_result('catalog').table) }}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.6822, "supported_languages": null}, "macro.dbt_postgres.postgres_get_relations": {"name": "postgres_get_relations", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/relations.sql", "original_file_path": "macros/relations.sql", "unique_id": "macro.dbt_postgres.postgres_get_relations", "macro_sql": "{% macro postgres_get_relations () -%}\n\n {#\n -- in pg_depend, objid is the dependent, refobjid is the referenced object\n -- > a pg_depend entry indicates that the referenced object cannot be\n -- > dropped without also dropping the dependent object.\n #}\n\n {%- call statement('relations', fetch_result=True) -%}\n with relation as (\n select\n pg_rewrite.ev_class as class,\n pg_rewrite.oid as id\n from pg_rewrite\n ),\n class as (\n select\n oid as id,\n relname as name,\n relnamespace as schema,\n relkind as kind\n from pg_class\n ),\n dependency as (\n select distinct\n pg_depend.objid as id,\n pg_depend.refobjid as ref\n from pg_depend\n ),\n schema as (\n select\n pg_namespace.oid as id,\n pg_namespace.nspname as name\n from pg_namespace\n where nspname != 'information_schema' and nspname not like 'pg\\_%'\n ),\n referenced as (\n select\n relation.id AS id,\n referenced_class.name ,\n referenced_class.schema ,\n referenced_class.kind\n from relation\n join class as referenced_class on relation.class=referenced_class.id\n where referenced_class.kind in ('r', 'v', 'm')\n ),\n relationships as (\n select\n referenced.name as referenced_name,\n referenced.schema as referenced_schema_id,\n dependent_class.name as dependent_name,\n dependent_class.schema as dependent_schema_id,\n referenced.kind as kind\n from referenced\n join dependency on referenced.id=dependency.id\n join class as dependent_class on dependency.ref=dependent_class.id\n where\n (referenced.name != dependent_class.name or\n referenced.schema != dependent_class.schema)\n )\n\n select\n referenced_schema.name as referenced_schema,\n relationships.referenced_name as referenced_name,\n dependent_schema.name as dependent_schema,\n relationships.dependent_name as dependent_name\n from relationships\n join schema as dependent_schema on relationships.dependent_schema_id=dependent_schema.id\n join schema as referenced_schema on relationships.referenced_schema_id=referenced_schema.id\n group by referenced_schema, referenced_name, dependent_schema, dependent_name\n order by referenced_schema, referenced_name, dependent_schema, dependent_name;\n\n {%- endcall -%}\n\n {{ return(load_result('relations').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.68318, "supported_languages": null}, "macro.dbt_postgres.postgres__create_table_as": {"name": "postgres__create_table_as", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__create_table_as", "macro_sql": "{% macro postgres__create_table_as(temporary, relation, sql) -%}\n {%- set unlogged = config.get('unlogged', default=false) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n\n create {% if temporary -%}\n temporary\n {%- elif unlogged -%}\n unlogged\n {%- endif %} table {{ relation }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {{ get_table_columns_and_constraints() }} ;\n insert into {{ relation }} {{ get_column_names() }}\n {%- set sql = get_select_subquery(sql) %}\n {% else %}\n as\n {% endif %}\n (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_table_columns_and_constraints", "macro.dbt_postgres.get_column_names", "macro.dbt.get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.698383, "supported_languages": null}, "macro.dbt_postgres.postgres__get_create_index_sql": {"name": "postgres__get_create_index_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_create_index_sql", "macro_sql": "{% macro postgres__get_create_index_sql(relation, index_dict) -%}\n {%- set index_config = adapter.parse_index(index_dict) -%}\n {%- set comma_separated_columns = \", \".join(index_config.columns) -%}\n {%- set index_name = index_config.render(relation) -%}\n\n create {% if index_config.unique -%}\n unique\n {%- endif %} index if not exists\n \"{{ index_name }}\"\n on {{ relation }} {% if index_config.type -%}\n using {{ index_config.type }}\n {%- endif %}\n ({{ comma_separated_columns }});\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.699415, "supported_languages": null}, "macro.dbt_postgres.postgres__create_schema": {"name": "postgres__create_schema", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__create_schema", "macro_sql": "{% macro postgres__create_schema(relation) -%}\n {% if relation.database -%}\n {{ adapter.verify_database(relation.database) }}\n {%- endif -%}\n {%- call statement('create_schema') -%}\n create schema if not exists {{ relation.without_identifier().include(database=False) }}\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.700053, "supported_languages": null}, "macro.dbt_postgres.postgres__drop_schema": {"name": "postgres__drop_schema", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__drop_schema", "macro_sql": "{% macro postgres__drop_schema(relation) -%}\n {% if relation.database -%}\n {{ adapter.verify_database(relation.database) }}\n {%- endif -%}\n {%- call statement('drop_schema') -%}\n drop schema if exists {{ relation.without_identifier().include(database=False) }} cascade\n {%- endcall -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.70069, "supported_languages": null}, "macro.dbt_postgres.postgres__get_columns_in_relation": {"name": "postgres__get_columns_in_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_columns_in_relation", "macro_sql": "{% macro postgres__get_columns_in_relation(relation) -%}\n {% call statement('get_columns_in_relation', fetch_result=True) %}\n select\n column_name,\n data_type,\n character_maximum_length,\n numeric_precision,\n numeric_scale\n\n from {{ relation.information_schema('columns') }}\n where table_name = '{{ relation.identifier }}'\n {% if relation.schema %}\n and table_schema = '{{ relation.schema }}'\n {% endif %}\n order by ordinal_position\n\n {% endcall %}\n {% set table = load_result('get_columns_in_relation').table %}\n {{ return(sql_convert_columns_in_relation(table)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.sql_convert_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7016268, "supported_languages": null}, "macro.dbt_postgres.postgres__list_relations_without_caching": {"name": "postgres__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__list_relations_without_caching", "macro_sql": "{% macro postgres__list_relations_without_caching(schema_relation) %}\n {% call statement('list_relations_without_caching', fetch_result=True) -%}\n select\n '{{ schema_relation.database }}' as database,\n tablename as name,\n schemaname as schema,\n 'table' as type\n from pg_tables\n where schemaname ilike '{{ schema_relation.schema }}'\n union all\n select\n '{{ schema_relation.database }}' as database,\n viewname as name,\n schemaname as schema,\n 'view' as type\n from pg_views\n where schemaname ilike '{{ schema_relation.schema }}'\n union all\n select\n '{{ schema_relation.database }}' as database,\n matviewname as name,\n schemaname as schema,\n 'materialized_view' as type\n from pg_matviews\n where schemaname ilike '{{ schema_relation.schema }}'\n {% endcall %}\n {{ return(load_result('list_relations_without_caching').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7024808, "supported_languages": null}, "macro.dbt_postgres.postgres__information_schema_name": {"name": "postgres__information_schema_name", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__information_schema_name", "macro_sql": "{% macro postgres__information_schema_name(database) -%}\n {% if database_name -%}\n {{ adapter.verify_database(database_name) }}\n {%- endif -%}\n information_schema\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.702821, "supported_languages": null}, "macro.dbt_postgres.postgres__list_schemas": {"name": "postgres__list_schemas", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__list_schemas", "macro_sql": "{% macro postgres__list_schemas(database) %}\n {% if database -%}\n {{ adapter.verify_database(database) }}\n {%- endif -%}\n {% call statement('list_schemas', fetch_result=True, auto_begin=False) %}\n select distinct nspname from pg_namespace\n {% endcall %}\n {{ return(load_result('list_schemas').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.703511, "supported_languages": null}, "macro.dbt_postgres.postgres__check_schema_exists": {"name": "postgres__check_schema_exists", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__check_schema_exists", "macro_sql": "{% macro postgres__check_schema_exists(information_schema, schema) -%}\n {% if information_schema.database -%}\n {{ adapter.verify_database(information_schema.database) }}\n {%- endif -%}\n {% call statement('check_schema_exists', fetch_result=True, auto_begin=False) %}\n select count(*) from pg_namespace where nspname = '{{ schema }}'\n {% endcall %}\n {{ return(load_result('check_schema_exists').table) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.704291, "supported_languages": null}, "macro.dbt_postgres.postgres__make_relation_with_suffix": {"name": "postgres__make_relation_with_suffix", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_relation_with_suffix", "macro_sql": "{% macro postgres__make_relation_with_suffix(base_relation, suffix, dstring) %}\n {% if dstring %}\n {% set dt = modules.datetime.datetime.now() %}\n {% set dtstring = dt.strftime(\"%H%M%S%f\") %}\n {% set suffix = suffix ~ dtstring %}\n {% endif %}\n {% set suffix_length = suffix|length %}\n {% set relation_max_name_length = base_relation.relation_max_name_length() %}\n {% if suffix_length > relation_max_name_length %}\n {% do exceptions.raise_compiler_error('Relation suffix is too long (' ~ suffix_length ~ ' characters). Maximum length is ' ~ relation_max_name_length ~ ' characters.') %}\n {% endif %}\n {% set identifier = base_relation.identifier[:relation_max_name_length - suffix_length] ~ suffix %}\n\n {{ return(base_relation.incorporate(path={\"identifier\": identifier })) }}\n\n {% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.706007, "supported_languages": null}, "macro.dbt_postgres.postgres__make_intermediate_relation": {"name": "postgres__make_intermediate_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_intermediate_relation", "macro_sql": "{% macro postgres__make_intermediate_relation(base_relation, suffix) %}\n {{ return(postgres__make_relation_with_suffix(base_relation, suffix, dstring=False)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7063942, "supported_languages": null}, "macro.dbt_postgres.postgres__make_temp_relation": {"name": "postgres__make_temp_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_temp_relation", "macro_sql": "{% macro postgres__make_temp_relation(base_relation, suffix) %}\n {% set temp_relation = postgres__make_relation_with_suffix(base_relation, suffix, dstring=True) %}\n {{ return(temp_relation.incorporate(path={\"schema\": none,\n \"database\": none})) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.707036, "supported_languages": null}, "macro.dbt_postgres.postgres__make_backup_relation": {"name": "postgres__make_backup_relation", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__make_backup_relation", "macro_sql": "{% macro postgres__make_backup_relation(base_relation, backup_relation_type, suffix) %}\n {% set backup_relation = postgres__make_relation_with_suffix(base_relation, suffix, dstring=False) %}\n {{ return(backup_relation.incorporate(type=backup_relation_type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_relation_with_suffix"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.707585, "supported_languages": null}, "macro.dbt_postgres.postgres_escape_comment": {"name": "postgres_escape_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres_escape_comment", "macro_sql": "{% macro postgres_escape_comment(comment) -%}\n {% if comment is not string %}\n {% do exceptions.raise_compiler_error('cannot escape a non-string: ' ~ comment) %}\n {% endif %}\n {%- set magic = '$dbt_comment_literal_block$' -%}\n {%- if magic in comment -%}\n {%- do exceptions.raise_compiler_error('The string ' ~ magic ~ ' is not allowed in comments.') -%}\n {%- endif -%}\n {{ magic }}{{ comment }}{{ magic }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.708461, "supported_languages": null}, "macro.dbt_postgres.postgres__alter_relation_comment": {"name": "postgres__alter_relation_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__alter_relation_comment", "macro_sql": "{% macro postgres__alter_relation_comment(relation, comment) %}\n {% set escaped_comment = postgres_escape_comment(comment) %}\n comment on {{ relation.type }} {{ relation }} is {{ escaped_comment }};\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres_escape_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.70891, "supported_languages": null}, "macro.dbt_postgres.postgres__alter_column_comment": {"name": "postgres__alter_column_comment", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__alter_column_comment", "macro_sql": "{% macro postgres__alter_column_comment(relation, column_dict) %}\n {% set existing_columns = adapter.get_columns_in_relation(relation) | map(attribute=\"name\") | list %}\n {% for column_name in column_dict if (column_name in existing_columns) %}\n {% set comment = column_dict[column_name]['description'] %}\n {% set escaped_comment = postgres_escape_comment(comment) %}\n comment on column {{ relation }}.{{ adapter.quote(column_name) if column_dict[column_name]['quote'] else column_name }} is {{ escaped_comment }};\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres_escape_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7101288, "supported_languages": null}, "macro.dbt_postgres.postgres__get_show_grant_sql": {"name": "postgres__get_show_grant_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_show_grant_sql", "macro_sql": "\n\n{%- macro postgres__get_show_grant_sql(relation) -%}\n select grantee, privilege_type\n from {{ relation.information_schema('role_table_grants') }}\n where grantor = current_role\n and grantee != current_role\n and table_schema = '{{ relation.schema }}'\n and table_name = '{{ relation.identifier }}'\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.710531, "supported_languages": null}, "macro.dbt_postgres.postgres__copy_grants": {"name": "postgres__copy_grants", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__copy_grants", "macro_sql": "{% macro postgres__copy_grants() %}\n {{ return(False) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.710756, "supported_languages": null}, "macro.dbt_postgres.postgres__get_show_indexes_sql": {"name": "postgres__get_show_indexes_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_show_indexes_sql", "macro_sql": "{% macro postgres__get_show_indexes_sql(relation) %}\n select\n i.relname as name,\n m.amname as method,\n ix.indisunique as \"unique\",\n array_to_string(array_agg(a.attname), ',') as column_names\n from pg_index ix\n join pg_class i\n on i.oid = ix.indexrelid\n join pg_am m\n on m.oid=i.relam\n join pg_class t\n on t.oid = ix.indrelid\n join pg_namespace n\n on n.oid = t.relnamespace\n join pg_attribute a\n on a.attrelid = t.oid\n and a.attnum = ANY(ix.indkey)\n where t.relname = '{{ relation.identifier }}'\n and n.nspname = '{{ relation.schema }}'\n and t.relkind in ('r', 'm')\n group by 1, 2, 3\n order by 1, 2, 3\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.711075, "supported_languages": null}, "macro.dbt_postgres.postgres__get_drop_index_sql": {"name": "postgres__get_drop_index_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/adapters.sql", "original_file_path": "macros/adapters.sql", "unique_id": "macro.dbt_postgres.postgres__get_drop_index_sql", "macro_sql": "\n\n\n{%- macro postgres__get_drop_index_sql(relation, index_name) -%}\n drop index if exists \"{{ index_name }}\"\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.711297, "supported_languages": null}, "macro.dbt_postgres.postgres__get_alter_materialized_view_as_sql": {"name": "postgres__get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/materialized_view.sql", "original_file_path": "macros/materializations/materialized_view.sql", "unique_id": "macro.dbt_postgres.postgres__get_alter_materialized_view_as_sql", "macro_sql": "{% macro postgres__get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n\n -- apply a full refresh immediately if needed\n {% if configuration_changes.requires_full_refresh %}\n\n {{ get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) }}\n\n -- otherwise apply individual changes as needed\n {% else %}\n\n {{ postgres__update_indexes_on_materialized_view(relation, configuration_changes.indexes) }}\n\n {%- endif -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_replace_materialized_view_as_sql", "macro.dbt_postgres.postgres__update_indexes_on_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.714145, "supported_languages": null}, "macro.dbt_postgres.postgres__get_create_materialized_view_as_sql": {"name": "postgres__get_create_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/materialized_view.sql", "original_file_path": "macros/materializations/materialized_view.sql", "unique_id": "macro.dbt_postgres.postgres__get_create_materialized_view_as_sql", "macro_sql": "{% macro postgres__get_create_materialized_view_as_sql(relation, sql) %}\n create materialized view if not exists {{ relation }} as {{ sql }};\n\n {% for _index_dict in config.get('indexes', []) -%}\n {{- get_create_index_sql(relation, _index_dict) -}}\n {%- endfor -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.714738, "supported_languages": null}, "macro.dbt_postgres.postgres__get_replace_materialized_view_as_sql": {"name": "postgres__get_replace_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/materialized_view.sql", "original_file_path": "macros/materializations/materialized_view.sql", "unique_id": "macro.dbt_postgres.postgres__get_replace_materialized_view_as_sql", "macro_sql": "{% macro postgres__get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) %}\n {{- get_create_materialized_view_as_sql(intermediate_relation, sql) -}}\n\n {% if existing_relation is not none %}\n alter materialized view {{ existing_relation }} rename to {{ backup_relation.include(database=False, schema=False) }};\n {% endif %}\n\n alter materialized view {{ intermediate_relation }} rename to {{ relation.include(database=False, schema=False) }};\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_create_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7156138, "supported_languages": null}, "macro.dbt_postgres.postgres__get_materialized_view_configuration_changes": {"name": "postgres__get_materialized_view_configuration_changes", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/materialized_view.sql", "original_file_path": "macros/materializations/materialized_view.sql", "unique_id": "macro.dbt_postgres.postgres__get_materialized_view_configuration_changes", "macro_sql": "{% macro postgres__get_materialized_view_configuration_changes(existing_relation, new_config) %}\n {% set _existing_materialized_view = postgres__describe_materialized_view(existing_relation) %}\n {% set _configuration_changes = existing_relation.get_materialized_view_config_change_collection(_existing_materialized_view, new_config) %}\n {% do return(_configuration_changes) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__describe_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.716193, "supported_languages": null}, "macro.dbt_postgres.postgres__refresh_materialized_view": {"name": "postgres__refresh_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/materialized_view.sql", "original_file_path": "macros/materializations/materialized_view.sql", "unique_id": "macro.dbt_postgres.postgres__refresh_materialized_view", "macro_sql": "{% macro postgres__refresh_materialized_view(relation) %}\n refresh materialized view {{ relation }};\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.716397, "supported_languages": null}, "macro.dbt_postgres.postgres__update_indexes_on_materialized_view": {"name": "postgres__update_indexes_on_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/materialized_view.sql", "original_file_path": "macros/materializations/materialized_view.sql", "unique_id": "macro.dbt_postgres.postgres__update_indexes_on_materialized_view", "macro_sql": "\n\n\n{%- macro postgres__update_indexes_on_materialized_view(relation, index_changes) -%}\n {{- log(\"Applying UPDATE INDEXES to: \" ~ relation) -}}\n\n {%- for _index_change in index_changes -%}\n {%- set _index = _index_change.context -%}\n\n {%- if _index_change.action == \"drop\" -%}\n\n {{ postgres__get_drop_index_sql(relation, _index.name) }};\n\n {%- elif _index_change.action == \"create\" -%}\n\n {{ postgres__get_create_index_sql(relation, _index.as_node_config) }}\n\n {%- endif -%}\n\n {%- endfor -%}\n\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_drop_index_sql", "macro.dbt_postgres.postgres__get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.717461, "supported_languages": null}, "macro.dbt_postgres.postgres__describe_materialized_view": {"name": "postgres__describe_materialized_view", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/materialized_view.sql", "original_file_path": "macros/materializations/materialized_view.sql", "unique_id": "macro.dbt_postgres.postgres__describe_materialized_view", "macro_sql": "{% macro postgres__describe_materialized_view(relation) %}\n -- for now just get the indexes, we don't need the name or the query yet\n {% set _indexes = run_query(get_show_indexes_sql(relation)) %}\n {% do return({'indexes': _indexes}) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.get_show_indexes_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.717948, "supported_languages": null}, "macro.dbt_postgres.postgres__get_incremental_default_sql": {"name": "postgres__get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/incremental_strategies.sql", "original_file_path": "macros/materializations/incremental_strategies.sql", "unique_id": "macro.dbt_postgres.postgres__get_incremental_default_sql", "macro_sql": "{% macro postgres__get_incremental_default_sql(arg_dict) %}\n\n {% if arg_dict[\"unique_key\"] %}\n {% do return(get_incremental_delete_insert_sql(arg_dict)) %}\n {% else %}\n {% do return(get_incremental_append_sql(arg_dict)) %}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_incremental_delete_insert_sql", "macro.dbt.get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.718699, "supported_languages": null}, "macro.dbt_postgres.postgres__snapshot_merge_sql": {"name": "postgres__snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/materializations/snapshot_merge.sql", "original_file_path": "macros/materializations/snapshot_merge.sql", "unique_id": "macro.dbt_postgres.postgres__snapshot_merge_sql", "macro_sql": "{% macro postgres__snapshot_merge_sql(target, source, insert_cols) -%}\n {%- set insert_cols_csv = insert_cols | join(', ') -%}\n\n update {{ target }}\n set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to\n from {{ source }} as DBT_INTERNAL_SOURCE\n where DBT_INTERNAL_SOURCE.dbt_scd_id::text = {{ target }}.dbt_scd_id::text\n and DBT_INTERNAL_SOURCE.dbt_change_type::text in ('update'::text, 'delete'::text)\n and {{ target }}.dbt_valid_to is null;\n\n insert into {{ target }} ({{ insert_cols_csv }})\n select {% for column in insert_cols -%}\n DBT_INTERNAL_SOURCE.{{ column }} {%- if not loop.last %}, {%- endif %}\n {%- endfor %}\n from {{ source }} as DBT_INTERNAL_SOURCE\n where DBT_INTERNAL_SOURCE.dbt_change_type::text = 'insert'::text;\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.719965, "supported_languages": null}, "macro.dbt_postgres.get_column_names": {"name": "get_column_names", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/columns_spec_ddl.sql", "original_file_path": "macros/utils/columns_spec_ddl.sql", "unique_id": "macro.dbt_postgres.get_column_names", "macro_sql": "{% macro get_column_names() %}\n {# loop through user_provided_columns to get column names #}\n {%- set user_provided_columns = model['columns'] -%}\n (\n {% for i in user_provided_columns %}\n {% set col = user_provided_columns[i] %}\n {{ col['name'] }} {{ \",\" if not loop.last }}\n {% endfor %}\n )\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7208362, "supported_languages": null}, "macro.dbt_postgres.postgres__dateadd": {"name": "postgres__dateadd", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/dateadd.sql", "original_file_path": "macros/utils/dateadd.sql", "unique_id": "macro.dbt_postgres.postgres__dateadd", "macro_sql": "{% macro postgres__dateadd(datepart, interval, from_date_or_timestamp) %}\n\n {{ from_date_or_timestamp }} + ((interval '1 {{ datepart }}') * ({{ interval }}))\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.721243, "supported_languages": null}, "macro.dbt_postgres.postgres__listagg": {"name": "postgres__listagg", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/listagg.sql", "original_file_path": "macros/utils/listagg.sql", "unique_id": "macro.dbt_postgres.postgres__listagg", "macro_sql": "{% macro postgres__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}\n\n {% if limit_num -%}\n array_to_string(\n (array_agg(\n {{ measure }}\n {% if order_by_clause -%}\n {{ order_by_clause }}\n {%- endif %}\n ))[1:{{ limit_num }}],\n {{ delimiter_text }}\n )\n {%- else %}\n string_agg(\n {{ measure }},\n {{ delimiter_text }}\n {% if order_by_clause -%}\n {{ order_by_clause }}\n {%- endif %}\n )\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7223659, "supported_languages": null}, "macro.dbt_postgres.postgres__datediff": {"name": "postgres__datediff", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/datediff.sql", "original_file_path": "macros/utils/datediff.sql", "unique_id": "macro.dbt_postgres.postgres__datediff", "macro_sql": "{% macro postgres__datediff(first_date, second_date, datepart) -%}\n\n {% if datepart == 'year' %}\n (date_part('year', ({{second_date}})::date) - date_part('year', ({{first_date}})::date))\n {% elif datepart == 'quarter' %}\n ({{ datediff(first_date, second_date, 'year') }} * 4 + date_part('quarter', ({{second_date}})::date) - date_part('quarter', ({{first_date}})::date))\n {% elif datepart == 'month' %}\n ({{ datediff(first_date, second_date, 'year') }} * 12 + date_part('month', ({{second_date}})::date) - date_part('month', ({{first_date}})::date))\n {% elif datepart == 'day' %}\n (({{second_date}})::date - ({{first_date}})::date)\n {% elif datepart == 'week' %}\n ({{ datediff(first_date, second_date, 'day') }} / 7 + case\n when date_part('dow', ({{first_date}})::timestamp) <= date_part('dow', ({{second_date}})::timestamp) then\n case when {{first_date}} <= {{second_date}} then 0 else -1 end\n else\n case when {{first_date}} <= {{second_date}} then 1 else 0 end\n end)\n {% elif datepart == 'hour' %}\n ({{ datediff(first_date, second_date, 'day') }} * 24 + date_part('hour', ({{second_date}})::timestamp) - date_part('hour', ({{first_date}})::timestamp))\n {% elif datepart == 'minute' %}\n ({{ datediff(first_date, second_date, 'hour') }} * 60 + date_part('minute', ({{second_date}})::timestamp) - date_part('minute', ({{first_date}})::timestamp))\n {% elif datepart == 'second' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60 + floor(date_part('second', ({{second_date}})::timestamp)) - floor(date_part('second', ({{first_date}})::timestamp)))\n {% elif datepart == 'millisecond' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60000 + floor(date_part('millisecond', ({{second_date}})::timestamp)) - floor(date_part('millisecond', ({{first_date}})::timestamp)))\n {% elif datepart == 'microsecond' %}\n ({{ datediff(first_date, second_date, 'minute') }} * 60000000 + floor(date_part('microsecond', ({{second_date}})::timestamp)) - floor(date_part('microsecond', ({{first_date}})::timestamp)))\n {% else %}\n {{ exceptions.raise_compiler_error(\"Unsupported datepart for macro datediff in postgres: {!r}\".format(datepart)) }}\n {% endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.727613, "supported_languages": null}, "macro.dbt_postgres.postgres__any_value": {"name": "postgres__any_value", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/any_value.sql", "original_file_path": "macros/utils/any_value.sql", "unique_id": "macro.dbt_postgres.postgres__any_value", "macro_sql": "{% macro postgres__any_value(expression) -%}\n\n min({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7278981, "supported_languages": null}, "macro.dbt_postgres.postgres__last_day": {"name": "postgres__last_day", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt_postgres.postgres__last_day", "macro_sql": "{% macro postgres__last_day(date, datepart) -%}\n\n {%- if datepart == 'quarter' -%}\n -- postgres dateadd does not support quarter interval.\n cast(\n {{dbt.dateadd('day', '-1',\n dbt.dateadd('month', '3', dbt.date_trunc(datepart, date))\n )}}\n as date)\n {%- else -%}\n {{dbt.default_last_day(date, datepart)}}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.date_trunc", "macro.dbt.default_last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.728843, "supported_languages": null}, "macro.dbt_postgres.postgres__split_part": {"name": "postgres__split_part", "resource_type": "macro", "package_name": "dbt_postgres", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt_postgres.postgres__split_part", "macro_sql": "{% macro postgres__split_part(string_text, delimiter_text, part_number) %}\n\n {% if part_number >= 0 %}\n {{ dbt.default__split_part(string_text, delimiter_text, part_number) }}\n {% else %}\n {{ dbt._split_part_negative(string_text, delimiter_text, part_number) }}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__split_part", "macro.dbt._split_part_negative"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.729632, "supported_languages": null}, "macro.dbt.run_hooks": {"name": "run_hooks", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.run_hooks", "macro_sql": "{% macro run_hooks(hooks, inside_transaction=True) %}\n {% for hook in hooks | selectattr('transaction', 'equalto', inside_transaction) %}\n {% if not inside_transaction and loop.first %}\n {% call statement(auto_begin=inside_transaction) %}\n commit;\n {% endcall %}\n {% endif %}\n {% set rendered = render(hook.get('sql')) | trim %}\n {% if (rendered | length) > 0 %}\n {% call statement(auto_begin=inside_transaction) %}\n {{ rendered }}\n {% endcall %}\n {% endif %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.731586, "supported_languages": null}, "macro.dbt.make_hook_config": {"name": "make_hook_config", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.make_hook_config", "macro_sql": "{% macro make_hook_config(sql, inside_transaction) %}\n {{ tojson({\"sql\": sql, \"transaction\": inside_transaction}) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.73197, "supported_languages": null}, "macro.dbt.before_begin": {"name": "before_begin", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.before_begin", "macro_sql": "{% macro before_begin(sql) %}\n {{ make_hook_config(sql, inside_transaction=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7322502, "supported_languages": null}, "macro.dbt.in_transaction": {"name": "in_transaction", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.in_transaction", "macro_sql": "{% macro in_transaction(sql) %}\n {{ make_hook_config(sql, inside_transaction=True) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7325282, "supported_languages": null}, "macro.dbt.after_commit": {"name": "after_commit", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/hooks.sql", "original_file_path": "macros/materializations/hooks.sql", "unique_id": "macro.dbt.after_commit", "macro_sql": "{% macro after_commit(sql) %}\n {{ make_hook_config(sql, inside_transaction=False) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_hook_config"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.732811, "supported_languages": null}, "macro.dbt.set_sql_header": {"name": "set_sql_header", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/configs.sql", "original_file_path": "macros/materializations/configs.sql", "unique_id": "macro.dbt.set_sql_header", "macro_sql": "{% macro set_sql_header(config) -%}\n {{ config.set('sql_header', caller()) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.733446, "supported_languages": null}, "macro.dbt.should_full_refresh": {"name": "should_full_refresh", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/configs.sql", "original_file_path": "macros/materializations/configs.sql", "unique_id": "macro.dbt.should_full_refresh", "macro_sql": "{% macro should_full_refresh() %}\n {% set config_full_refresh = config.get('full_refresh') %}\n {% if config_full_refresh is none %}\n {% set config_full_refresh = flags.FULL_REFRESH %}\n {% endif %}\n {% do return(config_full_refresh) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.735588, "supported_languages": null}, "macro.dbt.should_store_failures": {"name": "should_store_failures", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/configs.sql", "original_file_path": "macros/materializations/configs.sql", "unique_id": "macro.dbt.should_store_failures", "macro_sql": "{% macro should_store_failures() %}\n {% set config_store_failures = config.get('store_failures') %}\n {% if config_store_failures is none %}\n {% set config_store_failures = flags.STORE_FAILURES %}\n {% endif %}\n {% do return(config_store_failures) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7363148, "supported_languages": null}, "macro.dbt.snapshot_merge_sql": {"name": "snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/snapshot_merge.sql", "original_file_path": "macros/materializations/snapshots/snapshot_merge.sql", "unique_id": "macro.dbt.snapshot_merge_sql", "macro_sql": "{% macro snapshot_merge_sql(target, source, insert_cols) -%}\n {{ adapter.dispatch('snapshot_merge_sql', 'dbt')(target, source, insert_cols) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__snapshot_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.737066, "supported_languages": null}, "macro.dbt.default__snapshot_merge_sql": {"name": "default__snapshot_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/snapshot_merge.sql", "original_file_path": "macros/materializations/snapshots/snapshot_merge.sql", "unique_id": "macro.dbt.default__snapshot_merge_sql", "macro_sql": "{% macro default__snapshot_merge_sql(target, source, insert_cols) -%}\n {%- set insert_cols_csv = insert_cols | join(', ') -%}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on DBT_INTERNAL_SOURCE.dbt_scd_id = DBT_INTERNAL_DEST.dbt_scd_id\n\n when matched\n and DBT_INTERNAL_DEST.dbt_valid_to is null\n and DBT_INTERNAL_SOURCE.dbt_change_type in ('update', 'delete')\n then update\n set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to\n\n when not matched\n and DBT_INTERNAL_SOURCE.dbt_change_type = 'insert'\n then insert ({{ insert_cols_csv }})\n values ({{ insert_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7376041, "supported_languages": null}, "macro.dbt.strategy_dispatch": {"name": "strategy_dispatch", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.strategy_dispatch", "macro_sql": "{% macro strategy_dispatch(name) -%}\n{% set original_name = name %}\n {% if '.' in name %}\n {% set package_name, name = name.split(\".\", 1) %}\n {% else %}\n {% set package_name = none %}\n {% endif %}\n\n {% if package_name is none %}\n {% set package_context = context %}\n {% elif package_name in context %}\n {% set package_context = context[package_name] %}\n {% else %}\n {% set error_msg %}\n Could not find package '{{package_name}}', called with '{{original_name}}'\n {% endset %}\n {{ exceptions.raise_compiler_error(error_msg | trim) }}\n {% endif %}\n\n {%- set search_name = 'snapshot_' ~ name ~ '_strategy' -%}\n\n {% if search_name not in package_context %}\n {% set error_msg %}\n The specified strategy macro '{{name}}' was not found in package '{{ package_name }}'\n {% endset %}\n {{ exceptions.raise_compiler_error(error_msg | trim) }}\n {% endif %}\n {{ return(package_context[search_name]) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.743237, "supported_languages": null}, "macro.dbt.snapshot_hash_arguments": {"name": "snapshot_hash_arguments", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_hash_arguments", "macro_sql": "{% macro snapshot_hash_arguments(args) -%}\n {{ adapter.dispatch('snapshot_hash_arguments', 'dbt')(args) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.743576, "supported_languages": null}, "macro.dbt.default__snapshot_hash_arguments": {"name": "default__snapshot_hash_arguments", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.default__snapshot_hash_arguments", "macro_sql": "{% macro default__snapshot_hash_arguments(args) -%}\n md5({%- for arg in args -%}\n coalesce(cast({{ arg }} as varchar ), '')\n {% if not loop.last %} || '|' || {% endif %}\n {%- endfor -%})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.744032, "supported_languages": null}, "macro.dbt.snapshot_timestamp_strategy": {"name": "snapshot_timestamp_strategy", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_timestamp_strategy", "macro_sql": "{% macro snapshot_timestamp_strategy(node, snapshotted_rel, current_rel, config, target_exists) %}\n {% set primary_key = config['unique_key'] %}\n {% set updated_at = config['updated_at'] %}\n {% set invalidate_hard_deletes = config.get('invalidate_hard_deletes', false) %}\n\n {#/*\n The snapshot relation might not have an {{ updated_at }} value if the\n snapshot strategy is changed from `check` to `timestamp`. We\n should use a dbt-created column for the comparison in the snapshot\n table instead of assuming that the user-supplied {{ updated_at }}\n will be present in the historical data.\n\n See https://github.com/dbt-labs/dbt-core/issues/2350\n */ #}\n {% set row_changed_expr -%}\n ({{ snapshotted_rel }}.dbt_valid_from < {{ current_rel }}.{{ updated_at }})\n {%- endset %}\n\n {% set scd_id_expr = snapshot_hash_arguments([primary_key, updated_at]) %}\n\n {% do return({\n \"unique_key\": primary_key,\n \"updated_at\": updated_at,\n \"row_changed\": row_changed_expr,\n \"scd_id\": scd_id_expr,\n \"invalidate_hard_deletes\": invalidate_hard_deletes\n }) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7469041, "supported_languages": null}, "macro.dbt.snapshot_string_as_time": {"name": "snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_string_as_time", "macro_sql": "{% macro snapshot_string_as_time(timestamp) -%}\n {{ adapter.dispatch('snapshot_string_as_time', 'dbt')(timestamp) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__snapshot_string_as_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.747272, "supported_languages": null}, "macro.dbt.default__snapshot_string_as_time": {"name": "default__snapshot_string_as_time", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.default__snapshot_string_as_time", "macro_sql": "{% macro default__snapshot_string_as_time(timestamp) %}\n {% do exceptions.raise_not_implemented(\n 'snapshot_string_as_time macro not implemented for adapter '+adapter.type()\n ) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.747626, "supported_languages": null}, "macro.dbt.snapshot_check_all_get_existing_columns": {"name": "snapshot_check_all_get_existing_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_check_all_get_existing_columns", "macro_sql": "{% macro snapshot_check_all_get_existing_columns(node, target_exists, check_cols_config) -%}\n {%- if not target_exists -%}\n {#-- no table yet -> return whatever the query does --#}\n {{ return((false, query_columns)) }}\n {%- endif -%}\n\n {#-- handle any schema changes --#}\n {%- set target_relation = adapter.get_relation(database=node.database, schema=node.schema, identifier=node.alias) -%}\n\n {% if check_cols_config == 'all' %}\n {%- set query_columns = get_columns_in_query(node['compiled_code']) -%}\n\n {% elif check_cols_config is iterable and (check_cols_config | length) > 0 %}\n {#-- query for proper casing/quoting, to support comparison below --#}\n {%- set select_check_cols_from_target -%}\n {#-- N.B. The whitespace below is necessary to avoid edge case issue with comments --#}\n {#-- See: https://github.com/dbt-labs/dbt-core/issues/6781 --#}\n select {{ check_cols_config | join(', ') }} from (\n {{ node['compiled_code'] }}\n ) subq\n {%- endset -%}\n {% set query_columns = get_columns_in_query(select_check_cols_from_target) %}\n\n {% else %}\n {% do exceptions.raise_compiler_error(\"Invalid value for 'check_cols': \" ~ check_cols_config) %}\n {% endif %}\n\n {%- set existing_cols = adapter.get_columns_in_relation(target_relation) | map(attribute = 'name') | list -%}\n {%- set ns = namespace() -%} {#-- handle for-loop scoping with a namespace --#}\n {%- set ns.column_added = false -%}\n\n {%- set intersection = [] -%}\n {%- for col in query_columns -%}\n {%- if col in existing_cols -%}\n {%- do intersection.append(adapter.quote(col)) -%}\n {%- else -%}\n {% set ns.column_added = true %}\n {%- endif -%}\n {%- endfor -%}\n {{ return((ns.column_added, intersection)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_columns_in_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.750551, "supported_languages": null}, "macro.dbt.snapshot_check_strategy": {"name": "snapshot_check_strategy", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/strategies.sql", "original_file_path": "macros/materializations/snapshots/strategies.sql", "unique_id": "macro.dbt.snapshot_check_strategy", "macro_sql": "{% macro snapshot_check_strategy(node, snapshotted_rel, current_rel, config, target_exists) %}\n {% set check_cols_config = config['check_cols'] %}\n {% set primary_key = config['unique_key'] %}\n {% set invalidate_hard_deletes = config.get('invalidate_hard_deletes', false) %}\n {% set updated_at = config.get('updated_at', snapshot_get_time()) %}\n\n {% set column_added = false %}\n\n {% set column_added, check_cols = snapshot_check_all_get_existing_columns(node, target_exists, check_cols_config) %}\n\n {%- set row_changed_expr -%}\n (\n {%- if column_added -%}\n {{ get_true_sql() }}\n {%- else -%}\n {%- for col in check_cols -%}\n {{ snapshotted_rel }}.{{ col }} != {{ current_rel }}.{{ col }}\n or\n (\n (({{ snapshotted_rel }}.{{ col }} is null) and not ({{ current_rel }}.{{ col }} is null))\n or\n ((not {{ snapshotted_rel }}.{{ col }} is null) and ({{ current_rel }}.{{ col }} is null))\n )\n {%- if not loop.last %} or {% endif -%}\n {%- endfor -%}\n {%- endif -%}\n )\n {%- endset %}\n\n {% set scd_id_expr = snapshot_hash_arguments([primary_key, updated_at]) %}\n\n {% do return({\n \"unique_key\": primary_key,\n \"updated_at\": updated_at,\n \"row_changed\": row_changed_expr,\n \"scd_id\": scd_id_expr,\n \"invalidate_hard_deletes\": invalidate_hard_deletes\n }) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_get_time", "macro.dbt.snapshot_check_all_get_existing_columns", "macro.dbt.get_true_sql", "macro.dbt.snapshot_hash_arguments"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.753237, "supported_languages": null}, "macro.dbt.create_columns": {"name": "create_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.create_columns", "macro_sql": "{% macro create_columns(relation, columns) %}\n {{ adapter.dispatch('create_columns', 'dbt')(relation, columns) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.758305, "supported_languages": null}, "macro.dbt.default__create_columns": {"name": "default__create_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__create_columns", "macro_sql": "{% macro default__create_columns(relation, columns) %}\n {% for column in columns %}\n {% call statement() %}\n alter table {{ relation }} add column \"{{ column.name }}\" {{ column.data_type }};\n {% endcall %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.758891, "supported_languages": null}, "macro.dbt.post_snapshot": {"name": "post_snapshot", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.post_snapshot", "macro_sql": "{% macro post_snapshot(staging_relation) %}\n {{ adapter.dispatch('post_snapshot', 'dbt')(staging_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.759221, "supported_languages": null}, "macro.dbt.default__post_snapshot": {"name": "default__post_snapshot", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__post_snapshot", "macro_sql": "{% macro default__post_snapshot(staging_relation) %}\n {# no-op #}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.759394, "supported_languages": null}, "macro.dbt.get_true_sql": {"name": "get_true_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.get_true_sql", "macro_sql": "{% macro get_true_sql() %}\n {{ adapter.dispatch('get_true_sql', 'dbt')() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_true_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.759678, "supported_languages": null}, "macro.dbt.default__get_true_sql": {"name": "default__get_true_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__get_true_sql", "macro_sql": "{% macro default__get_true_sql() %}\n {{ return('TRUE') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.759904, "supported_languages": null}, "macro.dbt.snapshot_staging_table": {"name": "snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.snapshot_staging_table", "macro_sql": "{% macro snapshot_staging_table(strategy, source_sql, target_relation) -%}\n {{ adapter.dispatch('snapshot_staging_table', 'dbt')(strategy, source_sql, target_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__snapshot_staging_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7603142, "supported_languages": null}, "macro.dbt.default__snapshot_staging_table": {"name": "default__snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__snapshot_staging_table", "macro_sql": "{% macro default__snapshot_staging_table(strategy, source_sql, target_relation) -%}\n\n with snapshot_query as (\n\n {{ source_sql }}\n\n ),\n\n snapshotted_data as (\n\n select *,\n {{ strategy.unique_key }} as dbt_unique_key\n\n from {{ target_relation }}\n where dbt_valid_to is null\n\n ),\n\n insertions_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_unique_key,\n {{ strategy.updated_at }} as dbt_updated_at,\n {{ strategy.updated_at }} as dbt_valid_from,\n nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}) as dbt_valid_to,\n {{ strategy.scd_id }} as dbt_scd_id\n\n from snapshot_query\n ),\n\n updates_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_unique_key,\n {{ strategy.updated_at }} as dbt_updated_at,\n {{ strategy.updated_at }} as dbt_valid_from,\n {{ strategy.updated_at }} as dbt_valid_to\n\n from snapshot_query\n ),\n\n {%- if strategy.invalidate_hard_deletes %}\n\n deletes_source_data as (\n\n select\n *,\n {{ strategy.unique_key }} as dbt_unique_key\n from snapshot_query\n ),\n {% endif %}\n\n insertions as (\n\n select\n 'insert' as dbt_change_type,\n source_data.*\n\n from insertions_source_data as source_data\n left outer join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where snapshotted_data.dbt_unique_key is null\n or (\n snapshotted_data.dbt_unique_key is not null\n and (\n {{ strategy.row_changed }}\n )\n )\n\n ),\n\n updates as (\n\n select\n 'update' as dbt_change_type,\n source_data.*,\n snapshotted_data.dbt_scd_id\n\n from updates_source_data as source_data\n join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where (\n {{ strategy.row_changed }}\n )\n )\n\n {%- if strategy.invalidate_hard_deletes -%}\n ,\n\n deletes as (\n\n select\n 'delete' as dbt_change_type,\n source_data.*,\n {{ snapshot_get_time() }} as dbt_valid_from,\n {{ snapshot_get_time() }} as dbt_updated_at,\n {{ snapshot_get_time() }} as dbt_valid_to,\n snapshotted_data.dbt_scd_id\n\n from snapshotted_data\n left join deletes_source_data as source_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key\n where source_data.dbt_unique_key is null\n )\n {%- endif %}\n\n select * from insertions\n union all\n select * from updates\n {%- if strategy.invalidate_hard_deletes %}\n union all\n select * from deletes\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.762027, "supported_languages": null}, "macro.dbt.build_snapshot_table": {"name": "build_snapshot_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.build_snapshot_table", "macro_sql": "{% macro build_snapshot_table(strategy, sql) -%}\n {{ adapter.dispatch('build_snapshot_table', 'dbt')(strategy, sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__build_snapshot_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.762398, "supported_languages": null}, "macro.dbt.default__build_snapshot_table": {"name": "default__build_snapshot_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.default__build_snapshot_table", "macro_sql": "{% macro default__build_snapshot_table(strategy, sql) %}\n\n select *,\n {{ strategy.scd_id }} as dbt_scd_id,\n {{ strategy.updated_at }} as dbt_updated_at,\n {{ strategy.updated_at }} as dbt_valid_from,\n nullif({{ strategy.updated_at }}, {{ strategy.updated_at }}) as dbt_valid_to\n from (\n {{ sql }}\n ) sbq\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7629051, "supported_languages": null}, "macro.dbt.build_snapshot_staging_table": {"name": "build_snapshot_staging_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/helpers.sql", "original_file_path": "macros/materializations/snapshots/helpers.sql", "unique_id": "macro.dbt.build_snapshot_staging_table", "macro_sql": "{% macro build_snapshot_staging_table(strategy, sql, target_relation) %}\n {% set temp_relation = make_temp_relation(target_relation) %}\n\n {% set select = snapshot_staging_table(strategy, sql, target_relation) %}\n\n {% call statement('build_snapshot_staging_relation') %}\n {{ create_table_as(True, temp_relation, select) }}\n {% endcall %}\n\n {% do return(temp_relation) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.make_temp_relation", "macro.dbt.snapshot_staging_table", "macro.dbt.statement", "macro.dbt.create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.76377, "supported_languages": null}, "macro.dbt.materialization_snapshot_default": {"name": "materialization_snapshot_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/snapshots/snapshot.sql", "original_file_path": "macros/materializations/snapshots/snapshot.sql", "unique_id": "macro.dbt.materialization_snapshot_default", "macro_sql": "{% materialization snapshot, default %}\n {%- set config = model['config'] -%}\n\n {%- set target_table = model.get('alias', model.get('name')) -%}\n\n {%- set strategy_name = config.get('strategy') -%}\n {%- set unique_key = config.get('unique_key') %}\n -- grab current tables grants config for comparision later on\n {%- set grant_config = config.get('grants') -%}\n\n {% set target_relation_exists, target_relation = get_or_create_relation(\n database=model.database,\n schema=model.schema,\n identifier=target_table,\n type='table') -%}\n\n {%- if not target_relation.is_table -%}\n {% do exceptions.relation_wrong_type(target_relation, 'table') %}\n {%- endif -%}\n\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set strategy_macro = strategy_dispatch(strategy_name) %}\n {% set strategy = strategy_macro(model, \"snapshotted_data\", \"source_data\", config, target_relation_exists) %}\n\n {% if not target_relation_exists %}\n\n {% set build_sql = build_snapshot_table(strategy, model['compiled_code']) %}\n {% set final_sql = create_table_as(False, target_relation, build_sql) %}\n\n {% else %}\n\n {{ adapter.valid_snapshot_target(target_relation) }}\n\n {% set staging_table = build_snapshot_staging_table(strategy, sql, target_relation) %}\n\n -- this may no-op if the database does not require column expansion\n {% do adapter.expand_target_column_types(from_relation=staging_table,\n to_relation=target_relation) %}\n\n {% set missing_columns = adapter.get_missing_columns(staging_table, target_relation)\n | rejectattr('name', 'equalto', 'dbt_change_type')\n | rejectattr('name', 'equalto', 'DBT_CHANGE_TYPE')\n | rejectattr('name', 'equalto', 'dbt_unique_key')\n | rejectattr('name', 'equalto', 'DBT_UNIQUE_KEY')\n | list %}\n\n {% do create_columns(target_relation, missing_columns) %}\n\n {% set source_columns = adapter.get_columns_in_relation(staging_table)\n | rejectattr('name', 'equalto', 'dbt_change_type')\n | rejectattr('name', 'equalto', 'DBT_CHANGE_TYPE')\n | rejectattr('name', 'equalto', 'dbt_unique_key')\n | rejectattr('name', 'equalto', 'DBT_UNIQUE_KEY')\n | list %}\n\n {% set quoted_source_columns = [] %}\n {% for column in source_columns %}\n {% do quoted_source_columns.append(adapter.quote(column.name)) %}\n {% endfor %}\n\n {% set final_sql = snapshot_merge_sql(\n target = target_relation,\n source = staging_table,\n insert_cols = quoted_source_columns\n )\n %}\n\n {% endif %}\n\n {% call statement('main') %}\n {{ final_sql }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(target_relation_exists, full_refresh_mode=False) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if not target_relation_exists %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n {% if staging_table is defined %}\n {% do post_snapshot(staging_table) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.get_or_create_relation", "macro.dbt.run_hooks", "macro.dbt.strategy_dispatch", "macro.dbt.build_snapshot_table", "macro.dbt.create_table_as", "macro.dbt.build_snapshot_staging_table", "macro.dbt.create_columns", "macro.dbt.snapshot_merge_sql", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes", "macro.dbt.post_snapshot"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.77386, "supported_languages": ["sql"]}, "macro.dbt.materialization_test_default": {"name": "materialization_test_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/test.sql", "original_file_path": "macros/materializations/tests/test.sql", "unique_id": "macro.dbt.materialization_test_default", "macro_sql": "{%- materialization test, default -%}\n\n {% set relations = [] %}\n\n {% if should_store_failures() %}\n\n {% set identifier = model['alias'] %}\n {% set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) %}\n {% set target_relation = api.Relation.create(\n identifier=identifier, schema=schema, database=database, type='table') -%} %}\n\n {% if old_relation %}\n {% do adapter.drop_relation(old_relation) %}\n {% endif %}\n\n {% call statement(auto_begin=True) %}\n {{ create_table_as(False, target_relation, sql) }}\n {% endcall %}\n\n {% do relations.append(target_relation) %}\n\n {% set main_sql %}\n select *\n from {{ target_relation }}\n {% endset %}\n\n {{ adapter.commit() }}\n\n {% else %}\n\n {% set main_sql = sql %}\n\n {% endif %}\n\n {% set limit = config.get('limit') %}\n {% set fail_calc = config.get('fail_calc') %}\n {% set warn_if = config.get('warn_if') %}\n {% set error_if = config.get('error_if') %}\n\n {% call statement('main', fetch_result=True) -%}\n\n {{ get_test_sql(main_sql, fail_calc, warn_if, error_if, limit)}}\n\n {%- endcall %}\n\n {{ return({'relations': relations}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.should_store_failures", "macro.dbt.statement", "macro.dbt.create_table_as", "macro.dbt.get_test_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.77777, "supported_languages": ["sql"]}, "macro.dbt.get_test_sql": {"name": "get_test_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/helpers.sql", "original_file_path": "macros/materializations/tests/helpers.sql", "unique_id": "macro.dbt.get_test_sql", "macro_sql": "{% macro get_test_sql(main_sql, fail_calc, warn_if, error_if, limit) -%}\n {{ adapter.dispatch('get_test_sql', 'dbt')(main_sql, fail_calc, warn_if, error_if, limit) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_test_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.778649, "supported_languages": null}, "macro.dbt.default__get_test_sql": {"name": "default__get_test_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/helpers.sql", "original_file_path": "macros/materializations/tests/helpers.sql", "unique_id": "macro.dbt.default__get_test_sql", "macro_sql": "{% macro default__get_test_sql(main_sql, fail_calc, warn_if, error_if, limit) -%}\n select\n {{ fail_calc }} as failures,\n {{ fail_calc }} {{ warn_if }} as should_warn,\n {{ fail_calc }} {{ error_if }} as should_error\n from (\n {{ main_sql }}\n {{ \"limit \" ~ limit if limit != none }}\n ) dbt_internal_test\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.779289, "supported_languages": null}, "macro.dbt.get_where_subquery": {"name": "get_where_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/where_subquery.sql", "original_file_path": "macros/materializations/tests/where_subquery.sql", "unique_id": "macro.dbt.get_where_subquery", "macro_sql": "{% macro get_where_subquery(relation) -%}\n {% do return(adapter.dispatch('get_where_subquery', 'dbt')(relation)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_where_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7799602, "supported_languages": null}, "macro.dbt.default__get_where_subquery": {"name": "default__get_where_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/tests/where_subquery.sql", "original_file_path": "macros/materializations/tests/where_subquery.sql", "unique_id": "macro.dbt.default__get_where_subquery", "macro_sql": "{% macro default__get_where_subquery(relation) -%}\n {% set where = config.get('where', '') %}\n {% if where %}\n {%- set filtered -%}\n (select * from {{ relation }} where {{ where }}) dbt_subquery\n {%- endset -%}\n {% do return(filtered) %}\n {%- else -%}\n {% do return(relation) %}\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.780743, "supported_languages": null}, "macro.dbt.get_quoted_csv": {"name": "get_quoted_csv", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.get_quoted_csv", "macro_sql": "{% macro get_quoted_csv(column_names) %}\n\n {% set quoted = [] %}\n {% for col in column_names -%}\n {%- do quoted.append(adapter.quote(col)) -%}\n {%- endfor %}\n\n {%- set dest_cols_csv = quoted | join(', ') -%}\n {{ return(dest_cols_csv) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7831419, "supported_languages": null}, "macro.dbt.diff_columns": {"name": "diff_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.diff_columns", "macro_sql": "{% macro diff_columns(source_columns, target_columns) %}\n\n {% set result = [] %}\n {% set source_names = source_columns | map(attribute = 'column') | list %}\n {% set target_names = target_columns | map(attribute = 'column') | list %}\n\n {# --check whether the name attribute exists in the target - this does not perform a data type check #}\n {% for sc in source_columns %}\n {% if sc.name not in target_names %}\n {{ result.append(sc) }}\n {% endif %}\n {% endfor %}\n\n {{ return(result) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.78427, "supported_languages": null}, "macro.dbt.diff_column_data_types": {"name": "diff_column_data_types", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.diff_column_data_types", "macro_sql": "{% macro diff_column_data_types(source_columns, target_columns) %}\n\n {% set result = [] %}\n {% for sc in source_columns %}\n {% set tc = target_columns | selectattr(\"name\", \"equalto\", sc.name) | list | first %}\n {% if tc %}\n {% if sc.data_type != tc.data_type and not sc.can_expand_to(other_column=tc) %}\n {{ result.append( { 'column_name': tc.name, 'new_type': sc.data_type } ) }}\n {% endif %}\n {% endif %}\n {% endfor %}\n\n {{ return(result) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.7856371, "supported_languages": null}, "macro.dbt.get_merge_update_columns": {"name": "get_merge_update_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.get_merge_update_columns", "macro_sql": "{% macro get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) %}\n {{ return(adapter.dispatch('get_merge_update_columns', 'dbt')(merge_update_columns, merge_exclude_columns, dest_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_merge_update_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.786102, "supported_languages": null}, "macro.dbt.default__get_merge_update_columns": {"name": "default__get_merge_update_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/column_helpers.sql", "original_file_path": "macros/materializations/models/incremental/column_helpers.sql", "unique_id": "macro.dbt.default__get_merge_update_columns", "macro_sql": "{% macro default__get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) %}\n {%- set default_cols = dest_columns | map(attribute=\"quoted\") | list -%}\n\n {%- if merge_update_columns and merge_exclude_columns -%}\n {{ exceptions.raise_compiler_error(\n 'Model cannot specify merge_update_columns and merge_exclude_columns. Please update model to use only one config'\n )}}\n {%- elif merge_update_columns -%}\n {%- set update_columns = merge_update_columns -%}\n {%- elif merge_exclude_columns -%}\n {%- set update_columns = [] -%}\n {%- for column in dest_columns -%}\n {% if column.column | lower not in merge_exclude_columns | map(\"lower\") | list %}\n {%- do update_columns.append(column.quoted) -%}\n {% endif %}\n {%- endfor -%}\n {%- else -%}\n {%- set update_columns = default_cols -%}\n {%- endif -%}\n\n {{ return(update_columns) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.787589, "supported_languages": null}, "macro.dbt.get_merge_sql": {"name": "get_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.get_merge_sql", "macro_sql": "{% macro get_merge_sql(target, source, unique_key, dest_columns, incremental_predicates=none) -%}\n -- back compat for old kwarg name\n {% set incremental_predicates = kwargs.get('predicates', incremental_predicates) %}\n {{ adapter.dispatch('get_merge_sql', 'dbt')(target, source, unique_key, dest_columns, incremental_predicates) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.795661, "supported_languages": null}, "macro.dbt.default__get_merge_sql": {"name": "default__get_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.default__get_merge_sql", "macro_sql": "{% macro default__get_merge_sql(target, source, unique_key, dest_columns, incremental_predicates=none) -%}\n {%- set predicates = [] if incremental_predicates is none else [] + incremental_predicates -%}\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n {%- set merge_update_columns = config.get('merge_update_columns') -%}\n {%- set merge_exclude_columns = config.get('merge_exclude_columns') -%}\n {%- set update_columns = get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {% if unique_key %}\n {% if unique_key is sequence and unique_key is not mapping and unique_key is not string %}\n {% for key in unique_key %}\n {% set this_key_match %}\n DBT_INTERNAL_SOURCE.{{ key }} = DBT_INTERNAL_DEST.{{ key }}\n {% endset %}\n {% do predicates.append(this_key_match) %}\n {% endfor %}\n {% else %}\n {% set unique_key_match %}\n DBT_INTERNAL_SOURCE.{{ unique_key }} = DBT_INTERNAL_DEST.{{ unique_key }}\n {% endset %}\n {% do predicates.append(unique_key_match) %}\n {% endif %}\n {% else %}\n {% do predicates.append('FALSE') %}\n {% endif %}\n\n {{ sql_header if sql_header is not none }}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on {{\"(\" ~ predicates | join(\") and (\") ~ \")\"}}\n\n {% if unique_key %}\n when matched then update set\n {% for column_name in update_columns -%}\n {{ column_name }} = DBT_INTERNAL_SOURCE.{{ column_name }}\n {%- if not loop.last %}, {%- endif %}\n {%- endfor %}\n {% endif %}\n\n when not matched then insert\n ({{ dest_cols_csv }})\n values\n ({{ dest_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv", "macro.dbt.get_merge_update_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.799057, "supported_languages": null}, "macro.dbt.get_delete_insert_merge_sql": {"name": "get_delete_insert_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.get_delete_insert_merge_sql", "macro_sql": "{% macro get_delete_insert_merge_sql(target, source, unique_key, dest_columns, incremental_predicates) -%}\n {{ adapter.dispatch('get_delete_insert_merge_sql', 'dbt')(target, source, unique_key, dest_columns, incremental_predicates) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_delete_insert_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.799583, "supported_languages": null}, "macro.dbt.default__get_delete_insert_merge_sql": {"name": "default__get_delete_insert_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.default__get_delete_insert_merge_sql", "macro_sql": "{% macro default__get_delete_insert_merge_sql(target, source, unique_key, dest_columns, incremental_predicates) -%}\n\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n\n {% if unique_key %}\n {% if unique_key is sequence and unique_key is not string %}\n delete from {{target }}\n using {{ source }}\n where (\n {% for key in unique_key %}\n {{ source }}.{{ key }} = {{ target }}.{{ key }}\n {{ \"and \" if not loop.last}}\n {% endfor %}\n {% if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {% endif %}\n );\n {% else %}\n delete from {{ target }}\n where (\n {{ unique_key }}) in (\n select ({{ unique_key }})\n from {{ source }}\n )\n {%- if incremental_predicates %}\n {% for predicate in incremental_predicates %}\n and {{ predicate }}\n {% endfor %}\n {%- endif -%};\n\n {% endif %}\n {% endif %}\n\n insert into {{ target }} ({{ dest_cols_csv }})\n (\n select {{ dest_cols_csv }}\n from {{ source }}\n )\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.801672, "supported_languages": null}, "macro.dbt.get_insert_overwrite_merge_sql": {"name": "get_insert_overwrite_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.get_insert_overwrite_merge_sql", "macro_sql": "{% macro get_insert_overwrite_merge_sql(target, source, dest_columns, predicates, include_sql_header=false) -%}\n {{ adapter.dispatch('get_insert_overwrite_merge_sql', 'dbt')(target, source, dest_columns, predicates, include_sql_header) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_insert_overwrite_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.802207, "supported_languages": null}, "macro.dbt.default__get_insert_overwrite_merge_sql": {"name": "default__get_insert_overwrite_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/merge.sql", "original_file_path": "macros/materializations/models/incremental/merge.sql", "unique_id": "macro.dbt.default__get_insert_overwrite_merge_sql", "macro_sql": "{% macro default__get_insert_overwrite_merge_sql(target, source, dest_columns, predicates, include_sql_header) -%}\n {#-- The only time include_sql_header is True: --#}\n {#-- BigQuery + insert_overwrite strategy + \"static\" partitions config --#}\n {#-- We should consider including the sql header at the materialization level instead --#}\n\n {%- set predicates = [] if predicates is none else [] + predicates -%}\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none and include_sql_header }}\n\n merge into {{ target }} as DBT_INTERNAL_DEST\n using {{ source }} as DBT_INTERNAL_SOURCE\n on FALSE\n\n when not matched by source\n {% if predicates %} and {{ predicates | join(' and ') }} {% endif %}\n then delete\n\n when not matched then insert\n ({{ dest_cols_csv }})\n values\n ({{ dest_cols_csv }})\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8035252, "supported_languages": null}, "macro.dbt.is_incremental": {"name": "is_incremental", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/is_incremental.sql", "original_file_path": "macros/materializations/models/incremental/is_incremental.sql", "unique_id": "macro.dbt.is_incremental", "macro_sql": "{% macro is_incremental() %}\n {#-- do not run introspective queries in parsing #}\n {% if not execute %}\n {{ return(False) }}\n {% else %}\n {% set relation = adapter.get_relation(this.database, this.schema, this.table) %}\n {{ return(relation is not none\n and relation.type == 'table'\n and model.config.materialized == 'incremental'\n and not should_full_refresh()) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.804725, "supported_languages": null}, "macro.dbt.get_incremental_append_sql": {"name": "get_incremental_append_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_append_sql", "macro_sql": "{% macro get_incremental_append_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_append_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.806099, "supported_languages": null}, "macro.dbt.default__get_incremental_append_sql": {"name": "default__get_incremental_append_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_append_sql", "macro_sql": "{% macro default__get_incremental_append_sql(arg_dict) %}\n\n {% do return(get_insert_into_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"dest_columns\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_insert_into_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.806565, "supported_languages": null}, "macro.dbt.get_incremental_delete_insert_sql": {"name": "get_incremental_delete_insert_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_delete_insert_sql", "macro_sql": "{% macro get_incremental_delete_insert_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_delete_insert_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_delete_insert_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8069298, "supported_languages": null}, "macro.dbt.default__get_incremental_delete_insert_sql": {"name": "default__get_incremental_delete_insert_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_delete_insert_sql", "macro_sql": "{% macro default__get_incremental_delete_insert_sql(arg_dict) %}\n\n {% do return(get_delete_insert_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"unique_key\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_delete_insert_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8075142, "supported_languages": null}, "macro.dbt.get_incremental_merge_sql": {"name": "get_incremental_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_merge_sql", "macro_sql": "{% macro get_incremental_merge_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_merge_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8078752, "supported_languages": null}, "macro.dbt.default__get_incremental_merge_sql": {"name": "default__get_incremental_merge_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_merge_sql", "macro_sql": "{% macro default__get_incremental_merge_sql(arg_dict) %}\n\n {% do return(get_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"unique_key\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.808459, "supported_languages": null}, "macro.dbt.get_incremental_insert_overwrite_sql": {"name": "get_incremental_insert_overwrite_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_insert_overwrite_sql", "macro_sql": "{% macro get_incremental_insert_overwrite_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_insert_overwrite_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_incremental_insert_overwrite_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.80882, "supported_languages": null}, "macro.dbt.default__get_incremental_insert_overwrite_sql": {"name": "default__get_incremental_insert_overwrite_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_insert_overwrite_sql", "macro_sql": "{% macro default__get_incremental_insert_overwrite_sql(arg_dict) %}\n\n {% do return(get_insert_overwrite_merge_sql(arg_dict[\"target_relation\"], arg_dict[\"temp_relation\"], arg_dict[\"dest_columns\"], arg_dict[\"incremental_predicates\"])) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_insert_overwrite_merge_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8093429, "supported_languages": null}, "macro.dbt.get_incremental_default_sql": {"name": "get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_incremental_default_sql", "macro_sql": "{% macro get_incremental_default_sql(arg_dict) %}\n\n {{ return(adapter.dispatch('get_incremental_default_sql', 'dbt')(arg_dict)) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_incremental_default_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8097, "supported_languages": null}, "macro.dbt.default__get_incremental_default_sql": {"name": "default__get_incremental_default_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.default__get_incremental_default_sql", "macro_sql": "{% macro default__get_incremental_default_sql(arg_dict) %}\n\n {% do return(get_incremental_append_sql(arg_dict)) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_incremental_append_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.809994, "supported_languages": null}, "macro.dbt.get_insert_into_sql": {"name": "get_insert_into_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/strategies.sql", "original_file_path": "macros/materializations/models/incremental/strategies.sql", "unique_id": "macro.dbt.get_insert_into_sql", "macro_sql": "{% macro get_insert_into_sql(target_relation, temp_relation, dest_columns) %}\n\n {%- set dest_cols_csv = get_quoted_csv(dest_columns | map(attribute=\"name\")) -%}\n\n insert into {{ target_relation }} ({{ dest_cols_csv }})\n (\n select {{ dest_cols_csv }}\n from {{ temp_relation }}\n )\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_quoted_csv"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.810556, "supported_languages": null}, "macro.dbt.materialization_incremental_default": {"name": "materialization_incremental_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/incremental.sql", "original_file_path": "macros/materializations/models/incremental/incremental.sql", "unique_id": "macro.dbt.materialization_incremental_default", "macro_sql": "{% materialization incremental, default -%}\n\n -- relations\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='table') -%}\n {%- set temp_relation = make_temp_relation(target_relation)-%}\n {%- set intermediate_relation = make_intermediate_relation(target_relation)-%}\n {%- set backup_relation_type = 'table' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n\n -- configs\n {%- set unique_key = config.get('unique_key') -%}\n {%- set full_refresh_mode = (should_full_refresh() or existing_relation.is_view) -%}\n {%- set on_schema_change = incremental_validate_on_schema_change(config.get('on_schema_change'), default='ignore') -%}\n\n -- the temp_ and backup_ relations should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation. This has to happen before\n -- BEGIN, in a separate transaction\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation)-%}\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set to_drop = [] %}\n\n {% if existing_relation is none %}\n {% set build_sql = get_create_table_as_sql(False, target_relation, sql) %}\n {% elif full_refresh_mode %}\n {% set build_sql = get_create_table_as_sql(False, intermediate_relation, sql) %}\n {% set need_swap = true %}\n {% else %}\n {% do run_query(get_create_table_as_sql(True, temp_relation, sql)) %}\n {% do adapter.expand_target_column_types(\n from_relation=temp_relation,\n to_relation=target_relation) %}\n {#-- Process schema changes. Returns dict of changes if successful. Use source columns for upserting/merging --#}\n {% set dest_columns = process_schema_changes(on_schema_change, temp_relation, existing_relation) %}\n {% if not dest_columns %}\n {% set dest_columns = adapter.get_columns_in_relation(existing_relation) %}\n {% endif %}\n\n {#-- Get the incremental_strategy, the macro to use for the strategy, and build the sql --#}\n {% set incremental_strategy = config.get('incremental_strategy') or 'default' %}\n {% set incremental_predicates = config.get('predicates', none) or config.get('incremental_predicates', none) %}\n {% set strategy_sql_macro_func = adapter.get_incremental_strategy_macro(context, incremental_strategy) %}\n {% set strategy_arg_dict = ({'target_relation': target_relation, 'temp_relation': temp_relation, 'unique_key': unique_key, 'dest_columns': dest_columns, 'incremental_predicates': incremental_predicates }) %}\n {% set build_sql = strategy_sql_macro_func(strategy_arg_dict) %}\n\n {% endif %}\n\n {% call statement(\"main\") %}\n {{ build_sql }}\n {% endcall %}\n\n {% if need_swap %}\n {% do adapter.rename_relation(target_relation, backup_relation) %}\n {% do adapter.rename_relation(intermediate_relation, target_relation) %}\n {% do to_drop.append(backup_relation) %}\n {% endif %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if existing_relation is none or existing_relation.is_view or should_full_refresh() %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n -- `COMMIT` happens here\n {% do adapter.commit() %}\n\n {% for rel in to_drop %}\n {% do adapter.drop_relation(rel) %}\n {% endfor %}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_temp_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.should_full_refresh", "macro.dbt.incremental_validate_on_schema_change", "macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks", "macro.dbt.get_create_table_as_sql", "macro.dbt.run_query", "macro.dbt.process_schema_changes", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.820919, "supported_languages": ["sql"]}, "macro.dbt.incremental_validate_on_schema_change": {"name": "incremental_validate_on_schema_change", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/on_schema_change.sql", "original_file_path": "macros/materializations/models/incremental/on_schema_change.sql", "unique_id": "macro.dbt.incremental_validate_on_schema_change", "macro_sql": "{% macro incremental_validate_on_schema_change(on_schema_change, default='ignore') %}\n\n {% if on_schema_change not in ['sync_all_columns', 'append_new_columns', 'fail', 'ignore'] %}\n\n {% set log_message = 'Invalid value for on_schema_change (%s) specified. Setting default value of %s.' % (on_schema_change, default) %}\n {% do log(log_message) %}\n\n {{ return(default) }}\n\n {% else %}\n\n {{ return(on_schema_change) }}\n\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.828073, "supported_languages": null}, "macro.dbt.check_for_schema_changes": {"name": "check_for_schema_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/on_schema_change.sql", "original_file_path": "macros/materializations/models/incremental/on_schema_change.sql", "unique_id": "macro.dbt.check_for_schema_changes", "macro_sql": "{% macro check_for_schema_changes(source_relation, target_relation) %}\n\n {% set schema_changed = False %}\n\n {%- set source_columns = adapter.get_columns_in_relation(source_relation) -%}\n {%- set target_columns = adapter.get_columns_in_relation(target_relation) -%}\n {%- set source_not_in_target = diff_columns(source_columns, target_columns) -%}\n {%- set target_not_in_source = diff_columns(target_columns, source_columns) -%}\n\n {% set new_target_types = diff_column_data_types(source_columns, target_columns) %}\n\n {% if source_not_in_target != [] %}\n {% set schema_changed = True %}\n {% elif target_not_in_source != [] or new_target_types != [] %}\n {% set schema_changed = True %}\n {% elif new_target_types != [] %}\n {% set schema_changed = True %}\n {% endif %}\n\n {% set changes_dict = {\n 'schema_changed': schema_changed,\n 'source_not_in_target': source_not_in_target,\n 'target_not_in_source': target_not_in_source,\n 'source_columns': source_columns,\n 'target_columns': target_columns,\n 'new_target_types': new_target_types\n } %}\n\n {% set msg %}\n In {{ target_relation }}:\n Schema changed: {{ schema_changed }}\n Source columns not in target: {{ source_not_in_target }}\n Target columns not in source: {{ target_not_in_source }}\n New column types: {{ new_target_types }}\n {% endset %}\n\n {% do log(msg) %}\n\n {{ return(changes_dict) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.diff_columns", "macro.dbt.diff_column_data_types"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8305972, "supported_languages": null}, "macro.dbt.sync_column_schemas": {"name": "sync_column_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/on_schema_change.sql", "original_file_path": "macros/materializations/models/incremental/on_schema_change.sql", "unique_id": "macro.dbt.sync_column_schemas", "macro_sql": "{% macro sync_column_schemas(on_schema_change, target_relation, schema_changes_dict) %}\n\n {%- set add_to_target_arr = schema_changes_dict['source_not_in_target'] -%}\n\n {%- if on_schema_change == 'append_new_columns'-%}\n {%- if add_to_target_arr | length > 0 -%}\n {%- do alter_relation_add_remove_columns(target_relation, add_to_target_arr, none) -%}\n {%- endif -%}\n\n {% elif on_schema_change == 'sync_all_columns' %}\n {%- set remove_from_target_arr = schema_changes_dict['target_not_in_source'] -%}\n {%- set new_target_types = schema_changes_dict['new_target_types'] -%}\n\n {% if add_to_target_arr | length > 0 or remove_from_target_arr | length > 0 %}\n {%- do alter_relation_add_remove_columns(target_relation, add_to_target_arr, remove_from_target_arr) -%}\n {% endif %}\n\n {% if new_target_types != [] %}\n {% for ntt in new_target_types %}\n {% set column_name = ntt['column_name'] %}\n {% set new_type = ntt['new_type'] %}\n {% do alter_column_type(target_relation, column_name, new_type) %}\n {% endfor %}\n {% endif %}\n\n {% endif %}\n\n {% set schema_change_message %}\n In {{ target_relation }}:\n Schema change approach: {{ on_schema_change }}\n Columns added: {{ add_to_target_arr }}\n Columns removed: {{ remove_from_target_arr }}\n Data types changed: {{ new_target_types }}\n {% endset %}\n\n {% do log(schema_change_message) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.alter_relation_add_remove_columns", "macro.dbt.alter_column_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8330681, "supported_languages": null}, "macro.dbt.process_schema_changes": {"name": "process_schema_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/incremental/on_schema_change.sql", "original_file_path": "macros/materializations/models/incremental/on_schema_change.sql", "unique_id": "macro.dbt.process_schema_changes", "macro_sql": "{% macro process_schema_changes(on_schema_change, source_relation, target_relation) %}\n\n {% if on_schema_change == 'ignore' %}\n\n {{ return({}) }}\n\n {% else %}\n\n {% set schema_changes_dict = check_for_schema_changes(source_relation, target_relation) %}\n\n {% if schema_changes_dict['schema_changed'] %}\n\n {% if on_schema_change == 'fail' %}\n\n {% set fail_msg %}\n The source and target schemas on this incremental model are out of sync!\n They can be reconciled in several ways:\n - set the `on_schema_change` config to either append_new_columns or sync_all_columns, depending on your situation.\n - Re-run the incremental model with `full_refresh: True` to update the target schema.\n - update the schema manually and re-run the process.\n\n Additional troubleshooting context:\n Source columns not in target: {{ schema_changes_dict['source_not_in_target'] }}\n Target columns not in source: {{ schema_changes_dict['target_not_in_source'] }}\n New column types: {{ schema_changes_dict['new_target_types'] }}\n {% endset %}\n\n {% do exceptions.raise_compiler_error(fail_msg) %}\n\n {# -- unless we ignore, run the sync operation per the config #}\n {% else %}\n\n {% do sync_column_schemas(on_schema_change, target_relation, schema_changes_dict) %}\n\n {% endif %}\n\n {% endif %}\n\n {{ return(schema_changes_dict['source_columns']) }}\n\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.check_for_schema_changes", "macro.dbt.sync_column_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.834759, "supported_languages": null}, "macro.dbt.materialization_materialized_view_default": {"name": "materialization_materialized_view_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/materialized_view.sql", "unique_id": "macro.dbt.materialization_materialized_view_default", "macro_sql": "{% materialization materialized_view, default %}\n {% set existing_relation = load_cached_relation(this) %}\n {% set target_relation = this.incorporate(type=this.MaterializedView) %}\n {% set intermediate_relation = make_intermediate_relation(target_relation) %}\n {% set backup_relation_type = target_relation.MaterializedView if existing_relation is none else existing_relation.type %}\n {% set backup_relation = make_backup_relation(target_relation, backup_relation_type) %}\n\n {{ materialized_view_setup(backup_relation, intermediate_relation, pre_hooks) }}\n\n {% set build_sql = materialized_view_get_build_sql(existing_relation, target_relation, backup_relation, intermediate_relation) %}\n\n {% if build_sql == '' %}\n {{ materialized_view_execute_no_op(target_relation) }}\n {% else %}\n {{ materialized_view_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) }}\n {% endif %}\n\n {{ materialized_view_teardown(backup_relation, intermediate_relation, post_hooks) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.materialized_view_setup", "macro.dbt.materialized_view_get_build_sql", "macro.dbt.materialized_view_execute_no_op", "macro.dbt.materialized_view_execute_build_sql", "macro.dbt.materialized_view_teardown"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.841548, "supported_languages": ["sql"]}, "macro.dbt.materialized_view_setup": {"name": "materialized_view_setup", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/materialized_view.sql", "unique_id": "macro.dbt.materialized_view_setup", "macro_sql": "{% macro materialized_view_setup(backup_relation, intermediate_relation, pre_hooks) %}\n\n -- backup_relation and intermediate_relation should not already exist in the database\n -- it's possible these exist because of a previous run that exited unexpectedly\n {% set preexisting_backup_relation = load_cached_relation(backup_relation) %}\n {% set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) %}\n\n -- drop the temp relations if they exist already in the database\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.842311, "supported_languages": null}, "macro.dbt.materialized_view_teardown": {"name": "materialized_view_teardown", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/materialized_view.sql", "unique_id": "macro.dbt.materialized_view_teardown", "macro_sql": "{% macro materialized_view_teardown(backup_relation, intermediate_relation, post_hooks) %}\n\n -- drop the temp relations if they exist to leave the database clean for the next run\n {{ drop_relation_if_exists(backup_relation) }}\n {{ drop_relation_if_exists(intermediate_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8428018, "supported_languages": null}, "macro.dbt.materialized_view_get_build_sql": {"name": "materialized_view_get_build_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/materialized_view.sql", "unique_id": "macro.dbt.materialized_view_get_build_sql", "macro_sql": "{% macro materialized_view_get_build_sql(existing_relation, target_relation, backup_relation, intermediate_relation) %}\n\n {% set full_refresh_mode = should_full_refresh() %}\n\n -- determine the scenario we're in: create, full_refresh, alter, refresh data\n {% if existing_relation is none %}\n {% set build_sql = get_create_materialized_view_as_sql(target_relation, sql) %}\n {% elif full_refresh_mode or not existing_relation.is_materialized_view %}\n {% set build_sql = get_replace_materialized_view_as_sql(target_relation, sql, existing_relation, backup_relation, intermediate_relation) %}\n {% else %}\n\n -- get config options\n {% set on_configuration_change = config.get('on_configuration_change') %}\n {% set configuration_changes = get_materialized_view_configuration_changes(existing_relation, config) %}\n\n {% if configuration_changes is none %}\n {% set build_sql = refresh_materialized_view(target_relation) %}\n\n {% elif on_configuration_change == 'apply' %}\n {% set build_sql = get_alter_materialized_view_as_sql(target_relation, configuration_changes, sql, existing_relation, backup_relation, intermediate_relation) %}\n {% elif on_configuration_change == 'continue' %}\n {% set build_sql = '' %}\n {{ exceptions.warn(\"Configuration changes were identified and `on_configuration_change` was set to `continue` for `\" ~ target_relation ~ \"`\") }}\n {% elif on_configuration_change == 'fail' %}\n {{ exceptions.raise_fail_fast_error(\"Configuration changes were identified and `on_configuration_change` was set to `fail` for `\" ~ target_relation ~ \"`\") }}\n\n {% else %}\n -- this only happens if the user provides a value other than `apply`, 'skip', 'fail'\n {{ exceptions.raise_compiler_error(\"Unexpected configuration scenario\") }}\n\n {% endif %}\n\n {% endif %}\n\n {% do return(build_sql) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt.get_create_materialized_view_as_sql", "macro.dbt.get_replace_materialized_view_as_sql", "macro.dbt.get_materialized_view_configuration_changes", "macro.dbt.refresh_materialized_view", "macro.dbt.get_alter_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8454762, "supported_languages": null}, "macro.dbt.materialized_view_execute_no_op": {"name": "materialized_view_execute_no_op", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/materialized_view.sql", "unique_id": "macro.dbt.materialized_view_execute_no_op", "macro_sql": "{% macro materialized_view_execute_no_op(target_relation) %}\n {% do store_raw_result(\n name=\"main\",\n message=\"skip \" ~ target_relation,\n code=\"skip\",\n rows_affected=\"-1\"\n ) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.845921, "supported_languages": null}, "macro.dbt.materialized_view_execute_build_sql": {"name": "materialized_view_execute_build_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/materialized_view.sql", "unique_id": "macro.dbt.materialized_view_execute_build_sql", "macro_sql": "{% macro materialized_view_execute_build_sql(build_sql, existing_relation, target_relation, post_hooks) %}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n {% set grant_config = config.get('grants') %}\n\n {% call statement(name=\"main\") %}\n {{ build_sql }}\n {% endcall %}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks", "macro.dbt.statement", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.847245, "supported_languages": null}, "macro.dbt.get_materialized_view_configuration_changes": {"name": "get_materialized_view_configuration_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql", "original_file_path": "macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql", "unique_id": "macro.dbt.get_materialized_view_configuration_changes", "macro_sql": "{% macro get_materialized_view_configuration_changes(existing_relation, new_config) %}\n /* {#\n It's recommended that configuration changes be formatted as follows:\n {\"\": [{\"action\": \"\", \"context\": ...}]}\n\n For example:\n {\n \"indexes\": [\n {\"action\": \"drop\", \"context\": \"index_abc\"},\n {\"action\": \"create\", \"context\": {\"columns\": [\"column_1\", \"column_2\"], \"type\": \"hash\", \"unique\": True}},\n ],\n }\n\n Either way, `get_materialized_view_configuration_changes` needs to align with `get_alter_materialized_view_as_sql`.\n #} */\n {{- log('Determining configuration changes on: ' ~ existing_relation) -}}\n {%- do return(adapter.dispatch('get_materialized_view_configuration_changes', 'dbt')(existing_relation, new_config)) -%}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_materialized_view_configuration_changes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.848, "supported_languages": null}, "macro.dbt.default__get_materialized_view_configuration_changes": {"name": "default__get_materialized_view_configuration_changes", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql", "original_file_path": "macros/materializations/models/materialized_view/get_materialized_view_configuration_changes.sql", "unique_id": "macro.dbt.default__get_materialized_view_configuration_changes", "macro_sql": "{% macro default__get_materialized_view_configuration_changes(existing_relation, new_config) %}\n {{ exceptions.raise_compiler_error(\"Materialized views have not been implemented for this adapter.\") }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.848286, "supported_languages": null}, "macro.dbt.get_alter_materialized_view_as_sql": {"name": "get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/alter_materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/alter_materialized_view.sql", "unique_id": "macro.dbt.get_alter_materialized_view_as_sql", "macro_sql": "{% macro get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n {{- log('Applying ALTER to: ' ~ relation) -}}\n {{- adapter.dispatch('get_alter_materialized_view_as_sql', 'dbt')(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n ) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_alter_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.849153, "supported_languages": null}, "macro.dbt.default__get_alter_materialized_view_as_sql": {"name": "default__get_alter_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/alter_materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/alter_materialized_view.sql", "unique_id": "macro.dbt.default__get_alter_materialized_view_as_sql", "macro_sql": "{% macro default__get_alter_materialized_view_as_sql(\n relation,\n configuration_changes,\n sql,\n existing_relation,\n backup_relation,\n intermediate_relation\n) %}\n {{ exceptions.raise_compiler_error(\"Materialized views have not been implemented for this adapter.\") }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.849521, "supported_languages": null}, "macro.dbt.refresh_materialized_view": {"name": "refresh_materialized_view", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/refresh_materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/refresh_materialized_view.sql", "unique_id": "macro.dbt.refresh_materialized_view", "macro_sql": "{% macro refresh_materialized_view(relation) %}\n {{- log('Applying REFRESH to: ' ~ relation) -}}\n {{- adapter.dispatch('refresh_materialized_view', 'dbt')(relation) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__refresh_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.85008, "supported_languages": null}, "macro.dbt.default__refresh_materialized_view": {"name": "default__refresh_materialized_view", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/refresh_materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/refresh_materialized_view.sql", "unique_id": "macro.dbt.default__refresh_materialized_view", "macro_sql": "{% macro default__refresh_materialized_view(relation) %}\n {{ exceptions.raise_compiler_error(\"Materialized views have not been implemented for this adapter.\") }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.850337, "supported_languages": null}, "macro.dbt.get_replace_materialized_view_as_sql": {"name": "get_replace_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/replace_materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/replace_materialized_view.sql", "unique_id": "macro.dbt.get_replace_materialized_view_as_sql", "macro_sql": "{% macro get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) %}\n {{- log('Applying REPLACE to: ' ~ relation) -}}\n {{- adapter.dispatch('get_replace_materialized_view_as_sql', 'dbt')(relation, sql, existing_relation, backup_relation, intermediate_relation) -}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_replace_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.851104, "supported_languages": null}, "macro.dbt.default__get_replace_materialized_view_as_sql": {"name": "default__get_replace_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/replace_materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/replace_materialized_view.sql", "unique_id": "macro.dbt.default__get_replace_materialized_view_as_sql", "macro_sql": "{% macro default__get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) %}\n {{ exceptions.raise_compiler_error(\"Materialized views have not been implemented for this adapter.\") }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.851441, "supported_languages": null}, "macro.dbt.get_create_materialized_view_as_sql": {"name": "get_create_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/create_materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/create_materialized_view.sql", "unique_id": "macro.dbt.get_create_materialized_view_as_sql", "macro_sql": "{% macro get_create_materialized_view_as_sql(relation, sql) -%}\n {{- log('Applying CREATE to: ' ~ relation) -}}\n {{- adapter.dispatch('get_create_materialized_view_as_sql', 'dbt')(relation, sql) -}}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_create_materialized_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.852051, "supported_languages": null}, "macro.dbt.default__get_create_materialized_view_as_sql": {"name": "default__get_create_materialized_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/materialized_view/create_materialized_view.sql", "original_file_path": "macros/materializations/models/materialized_view/create_materialized_view.sql", "unique_id": "macro.dbt.default__get_create_materialized_view_as_sql", "macro_sql": "{% macro default__get_create_materialized_view_as_sql(relation, sql) -%}\n {{ exceptions.raise_compiler_error(\"Materialized views have not been implemented for this adapter.\") }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.852321, "supported_languages": null}, "macro.dbt.get_table_columns_and_constraints": {"name": "get_table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.get_table_columns_and_constraints", "macro_sql": "{%- macro get_table_columns_and_constraints() -%}\n {{ adapter.dispatch('get_table_columns_and_constraints', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__get_table_columns_and_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8538508, "supported_languages": null}, "macro.dbt.default__get_table_columns_and_constraints": {"name": "default__get_table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.default__get_table_columns_and_constraints", "macro_sql": "{% macro default__get_table_columns_and_constraints() -%}\n {{ return(table_columns_and_constraints()) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.table_columns_and_constraints"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.854157, "supported_languages": null}, "macro.dbt.table_columns_and_constraints": {"name": "table_columns_and_constraints", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.table_columns_and_constraints", "macro_sql": "{% macro table_columns_and_constraints() %}\n {# loop through user_provided_columns to create DDL with data types and constraints #}\n {%- set raw_column_constraints = adapter.render_raw_columns_constraints(raw_columns=model['columns']) -%}\n {%- set raw_model_constraints = adapter.render_raw_model_constraints(raw_constraints=model['constraints']) -%}\n (\n {% for c in raw_column_constraints -%}\n {{ c }}{{ \",\" if not loop.last or raw_model_constraints }}\n {% endfor %}\n {% for c in raw_model_constraints -%}\n {{ c }}{{ \",\" if not loop.last }}\n {% endfor -%}\n )\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.855243, "supported_languages": null}, "macro.dbt.get_assert_columns_equivalent": {"name": "get_assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.get_assert_columns_equivalent", "macro_sql": "\n\n{%- macro get_assert_columns_equivalent(sql) -%}\n {{ adapter.dispatch('get_assert_columns_equivalent', 'dbt')(sql) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.855556, "supported_languages": null}, "macro.dbt.default__get_assert_columns_equivalent": {"name": "default__get_assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.default__get_assert_columns_equivalent", "macro_sql": "{% macro default__get_assert_columns_equivalent(sql) -%}\n {{ return(assert_columns_equivalent(sql)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.855818, "supported_languages": null}, "macro.dbt.assert_columns_equivalent": {"name": "assert_columns_equivalent", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.assert_columns_equivalent", "macro_sql": "{% macro assert_columns_equivalent(sql) %}\n {#-- Obtain the column schema provided by sql file. #}\n {%- set sql_file_provided_columns = get_column_schema_from_query(sql, config.get('sql_header', none)) -%}\n {#--Obtain the column schema provided by the schema file by generating an 'empty schema' query from the model's columns. #}\n {%- set schema_file_provided_columns = get_column_schema_from_query(get_empty_schema_sql(model['columns'])) -%}\n\n {#-- create dictionaries with name and formatted data type and strings for exception #}\n {%- set sql_columns = format_columns(sql_file_provided_columns) -%}\n {%- set yaml_columns = format_columns(schema_file_provided_columns) -%}\n\n {%- if sql_columns|length != yaml_columns|length -%}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n\n {%- for sql_col in sql_columns -%}\n {%- set yaml_col = [] -%}\n {%- for this_col in yaml_columns -%}\n {%- if this_col['name'] == sql_col['name'] -%}\n {%- do yaml_col.append(this_col) -%}\n {%- break -%}\n {%- endif -%}\n {%- endfor -%}\n {%- if not yaml_col -%}\n {#-- Column with name not found in yaml #}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n {%- if sql_col['formatted'] != yaml_col[0]['formatted'] -%}\n {#-- Column data types don't match #}\n {%- do exceptions.raise_contract_error(yaml_columns, sql_columns) -%}\n {%- endif -%}\n {%- endfor -%}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_column_schema_from_query", "macro.dbt.get_empty_schema_sql", "macro.dbt.format_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.858479, "supported_languages": null}, "macro.dbt.format_columns": {"name": "format_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.format_columns", "macro_sql": "{% macro format_columns(columns) %}\n {% set formatted_columns = [] %}\n {% for column in columns %}\n {%- set formatted_column = adapter.dispatch('format_column', 'dbt')(column) -%}\n {%- do formatted_columns.append(formatted_column) -%}\n {% endfor %}\n {{ return(formatted_columns) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__format_column"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.85924, "supported_languages": null}, "macro.dbt.default__format_column": {"name": "default__format_column", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/columns_spec_ddl.sql", "original_file_path": "macros/materializations/models/table/columns_spec_ddl.sql", "unique_id": "macro.dbt.default__format_column", "macro_sql": "{% macro default__format_column(column) -%}\n {% set data_type = column.dtype %}\n {% set formatted = column.column.lower() ~ \" \" ~ data_type %}\n {{ return({'name': column.name, 'data_type': data_type, 'formatted': formatted}) }}\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.859933, "supported_languages": null}, "macro.dbt.materialization_table_default": {"name": "materialization_table_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/table.sql", "original_file_path": "macros/materializations/models/table/table.sql", "unique_id": "macro.dbt.materialization_table_default", "macro_sql": "{% materialization table, default %}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='table') %}\n {%- set intermediate_relation = make_intermediate_relation(target_relation) -%}\n -- the intermediate_relation should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}\n /*\n See ../view/view.sql for more information about this relation.\n */\n {%- set backup_relation_type = 'table' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n -- as above, the backup_relation should not already exist\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n\n -- drop the temp relations if they exist already in the database\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_table_as_sql(False, intermediate_relation, sql) }}\n {%- endcall %}\n\n -- cleanup\n {% if existing_relation is not none %}\n {{ adapter.rename_relation(existing_relation, backup_relation) }}\n {% endif %}\n\n {{ adapter.rename_relation(intermediate_relation, target_relation) }}\n\n {% do create_indexes(target_relation) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n -- `COMMIT` happens here\n {{ adapter.commit() }}\n\n -- finally, drop the existing/backup relation after the commit\n {{ drop_relation_if_exists(backup_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.drop_relation_if_exists", "macro.dbt.run_hooks", "macro.dbt.statement", "macro.dbt.get_create_table_as_sql", "macro.dbt.create_indexes", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.864483, "supported_languages": ["sql"]}, "macro.dbt.get_create_table_as_sql": {"name": "get_create_table_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.get_create_table_as_sql", "macro_sql": "{% macro get_create_table_as_sql(temporary, relation, sql) -%}\n {{ adapter.dispatch('get_create_table_as_sql', 'dbt')(temporary, relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_create_table_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.865838, "supported_languages": null}, "macro.dbt.default__get_create_table_as_sql": {"name": "default__get_create_table_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.default__get_create_table_as_sql", "macro_sql": "{% macro default__get_create_table_as_sql(temporary, relation, sql) -%}\n {{ return(create_table_as(temporary, relation, sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8662112, "supported_languages": null}, "macro.dbt.create_table_as": {"name": "create_table_as", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.create_table_as", "macro_sql": "{% macro create_table_as(temporary, relation, compiled_code, language='sql') -%}\n {# backward compatibility for create_table_as that does not support language #}\n {% if language == \"sql\" %}\n {{ adapter.dispatch('create_table_as', 'dbt')(temporary, relation, compiled_code)}}\n {% else %}\n {{ adapter.dispatch('create_table_as', 'dbt')(temporary, relation, compiled_code, language) }}\n {% endif %}\n\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__create_table_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.86708, "supported_languages": null}, "macro.dbt.default__create_table_as": {"name": "default__create_table_as", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.default__create_table_as", "macro_sql": "{% macro default__create_table_as(temporary, relation, sql) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n\n create {% if temporary: -%}temporary{%- endif %} table\n {{ relation.include(database=(not temporary), schema=(not temporary)) }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {{ get_table_columns_and_constraints() }}\n {%- set sql = get_select_subquery(sql) %}\n {% endif %}\n as (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent", "macro.dbt.get_table_columns_and_constraints", "macro.dbt.get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8684192, "supported_languages": null}, "macro.dbt.get_select_subquery": {"name": "get_select_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.get_select_subquery", "macro_sql": "{% macro get_select_subquery(sql) %}\n {{ return(adapter.dispatch('get_select_subquery', 'dbt')(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_select_subquery"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.868785, "supported_languages": null}, "macro.dbt.default__get_select_subquery": {"name": "default__get_select_subquery", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/table/create_table_as.sql", "original_file_path": "macros/materializations/models/table/create_table_as.sql", "unique_id": "macro.dbt.default__get_select_subquery", "macro_sql": "{% macro default__get_select_subquery(sql) %}\n select\n {% for column in model['columns'] %}\n {{ column }}{{ \", \" if not loop.last }}\n {% endfor %}\n from (\n {{ sql }}\n ) as model_subq\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8692842, "supported_languages": null}, "macro.dbt.materialization_view_default": {"name": "materialization_view_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/view.sql", "original_file_path": "macros/materializations/models/view/view.sql", "unique_id": "macro.dbt.materialization_view_default", "macro_sql": "{%- materialization view, default -%}\n\n {%- set existing_relation = load_cached_relation(this) -%}\n {%- set target_relation = this.incorporate(type='view') -%}\n {%- set intermediate_relation = make_intermediate_relation(target_relation) -%}\n\n -- the intermediate_relation should not already exist in the database; get_relation\n -- will return None in that case. Otherwise, we get a relation that we can drop\n -- later, before we try to use this name for the current operation\n {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}\n /*\n This relation (probably) doesn't exist yet. If it does exist, it's a leftover from\n a previous run, and we're going to try to drop it immediately. At the end of this\n materialization, we're going to rename the \"existing_relation\" to this identifier,\n and then we're going to drop it. In order to make sure we run the correct one of:\n - drop view ...\n - drop table ...\n\n We need to set the type of this relation to be the type of the existing_relation, if it exists,\n or else \"view\" as a sane default if it does not. Note that if the existing_relation does not\n exist, then there is nothing to move out of the way and subsequentally drop. In that case,\n this relation will be effectively unused.\n */\n {%- set backup_relation_type = 'view' if existing_relation is none else existing_relation.type -%}\n {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}\n -- as above, the backup_relation should not already exist\n {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}\n -- grab current tables grants config for comparision later on\n {% set grant_config = config.get('grants') %}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- drop the temp relations if they exist already in the database\n {{ drop_relation_if_exists(preexisting_intermediate_relation) }}\n {{ drop_relation_if_exists(preexisting_backup_relation) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_view_as_sql(intermediate_relation, sql) }}\n {%- endcall %}\n\n -- cleanup\n -- move the existing view out of the way\n {% if existing_relation is not none %}\n {{ adapter.rename_relation(existing_relation, backup_relation) }}\n {% endif %}\n {{ adapter.rename_relation(intermediate_relation, target_relation) }}\n\n {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n {{ adapter.commit() }}\n\n {{ drop_relation_if_exists(backup_relation) }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{%- endmaterialization -%}", "depends_on": {"macros": ["macro.dbt.load_cached_relation", "macro.dbt.make_intermediate_relation", "macro.dbt.make_backup_relation", "macro.dbt.run_hooks", "macro.dbt.drop_relation_if_exists", "macro.dbt.statement", "macro.dbt.get_create_view_as_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.873813, "supported_languages": ["sql"]}, "macro.dbt.handle_existing_table": {"name": "handle_existing_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/helpers.sql", "original_file_path": "macros/materializations/models/view/helpers.sql", "unique_id": "macro.dbt.handle_existing_table", "macro_sql": "{% macro handle_existing_table(full_refresh, old_relation) %}\n {{ adapter.dispatch('handle_existing_table', 'dbt')(full_refresh, old_relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__handle_existing_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.874357, "supported_languages": null}, "macro.dbt.default__handle_existing_table": {"name": "default__handle_existing_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/helpers.sql", "original_file_path": "macros/materializations/models/view/helpers.sql", "unique_id": "macro.dbt.default__handle_existing_table", "macro_sql": "{% macro default__handle_existing_table(full_refresh, old_relation) %}\n {{ log(\"Dropping relation \" ~ old_relation ~ \" because it is of type \" ~ old_relation.type) }}\n {{ adapter.drop_relation(old_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.874798, "supported_languages": null}, "macro.dbt.create_or_replace_view": {"name": "create_or_replace_view", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_or_replace_view.sql", "original_file_path": "macros/materializations/models/view/create_or_replace_view.sql", "unique_id": "macro.dbt.create_or_replace_view", "macro_sql": "{% macro create_or_replace_view() %}\n {%- set identifier = model['alias'] -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) -%}\n {%- set exists_as_view = (old_relation is not none and old_relation.is_view) -%}\n\n {%- set target_relation = api.Relation.create(\n identifier=identifier, schema=schema, database=database,\n type='view') -%}\n {% set grant_config = config.get('grants') %}\n\n {{ run_hooks(pre_hooks) }}\n\n -- If there's a table with the same name and we weren't told to full refresh,\n -- that's an error. If we were told to full refresh, drop it. This behavior differs\n -- for Snowflake and BigQuery, so multiple dispatch is used.\n {%- if old_relation is not none and old_relation.is_table -%}\n {{ handle_existing_table(should_full_refresh(), old_relation) }}\n {%- endif -%}\n\n -- build model\n {% call statement('main') -%}\n {{ get_create_view_as_sql(target_relation, sql) }}\n {%- endcall %}\n\n {% set should_revoke = should_revoke(exists_as_view, full_refresh_mode=True) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {{ run_hooks(post_hooks) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_hooks", "macro.dbt.handle_existing_table", "macro.dbt.should_full_refresh", "macro.dbt.statement", "macro.dbt.get_create_view_as_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.877583, "supported_languages": null}, "macro.dbt.get_create_view_as_sql": {"name": "get_create_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_view_as.sql", "original_file_path": "macros/materializations/models/view/create_view_as.sql", "unique_id": "macro.dbt.get_create_view_as_sql", "macro_sql": "{% macro get_create_view_as_sql(relation, sql) -%}\n {{ adapter.dispatch('get_create_view_as_sql', 'dbt')(relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_create_view_as_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.878305, "supported_languages": null}, "macro.dbt.default__get_create_view_as_sql": {"name": "default__get_create_view_as_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_view_as.sql", "original_file_path": "macros/materializations/models/view/create_view_as.sql", "unique_id": "macro.dbt.default__get_create_view_as_sql", "macro_sql": "{% macro default__get_create_view_as_sql(relation, sql) -%}\n {{ return(create_view_as(relation, sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.878624, "supported_languages": null}, "macro.dbt.create_view_as": {"name": "create_view_as", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_view_as.sql", "original_file_path": "macros/materializations/models/view/create_view_as.sql", "unique_id": "macro.dbt.create_view_as", "macro_sql": "{% macro create_view_as(relation, sql) -%}\n {{ adapter.dispatch('create_view_as', 'dbt')(relation, sql) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_view_as"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.878978, "supported_languages": null}, "macro.dbt.default__create_view_as": {"name": "default__create_view_as", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/models/view/create_view_as.sql", "original_file_path": "macros/materializations/models/view/create_view_as.sql", "unique_id": "macro.dbt.default__create_view_as", "macro_sql": "{% macro default__create_view_as(relation, sql) -%}\n {%- set sql_header = config.get('sql_header', none) -%}\n\n {{ sql_header if sql_header is not none }}\n create view {{ relation }}\n {% set contract_config = config.get('contract') %}\n {% if contract_config.enforced %}\n {{ get_assert_columns_equivalent(sql) }}\n {%- endif %}\n as (\n {{ sql }}\n );\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.get_assert_columns_equivalent"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8798301, "supported_languages": null}, "macro.dbt.materialization_seed_default": {"name": "materialization_seed_default", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/seed.sql", "original_file_path": "macros/materializations/seeds/seed.sql", "unique_id": "macro.dbt.materialization_seed_default", "macro_sql": "{% materialization seed, default %}\n\n {%- set identifier = model['alias'] -%}\n {%- set full_refresh_mode = (should_full_refresh()) -%}\n\n {%- set old_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) -%}\n\n {%- set exists_as_table = (old_relation is not none and old_relation.is_table) -%}\n {%- set exists_as_view = (old_relation is not none and old_relation.is_view) -%}\n\n {%- set grant_config = config.get('grants') -%}\n {%- set agate_table = load_agate_table() -%}\n -- grab current tables grants config for comparison later on\n\n {%- do store_result('agate_table', response='OK', agate_table=agate_table) -%}\n\n {{ run_hooks(pre_hooks, inside_transaction=False) }}\n\n -- `BEGIN` happens here:\n {{ run_hooks(pre_hooks, inside_transaction=True) }}\n\n -- build model\n {% set create_table_sql = \"\" %}\n {% if exists_as_view %}\n {{ exceptions.raise_compiler_error(\"Cannot seed to '{}', it is a view\".format(old_relation)) }}\n {% elif exists_as_table %}\n {% set create_table_sql = reset_csv_table(model, full_refresh_mode, old_relation, agate_table) %}\n {% else %}\n {% set create_table_sql = create_csv_table(model, agate_table) %}\n {% endif %}\n\n {% set code = 'CREATE' if full_refresh_mode else 'INSERT' %}\n {% set rows_affected = (agate_table.rows | length) %}\n {% set sql = load_csv_rows(model, agate_table) %}\n\n {% call noop_statement('main', code ~ ' ' ~ rows_affected, code, rows_affected) %}\n {{ get_csv_sql(create_table_sql, sql) }};\n {% endcall %}\n\n {% set target_relation = this.incorporate(type='table') %}\n\n {% set should_revoke = should_revoke(old_relation, full_refresh_mode) %}\n {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}\n\n {% do persist_docs(target_relation, model) %}\n\n {% if full_refresh_mode or not exists_as_table %}\n {% do create_indexes(target_relation) %}\n {% endif %}\n\n {{ run_hooks(post_hooks, inside_transaction=True) }}\n\n -- `COMMIT` happens here\n {{ adapter.commit() }}\n\n {{ run_hooks(post_hooks, inside_transaction=False) }}\n\n {{ return({'relations': [target_relation]}) }}\n\n{% endmaterialization %}", "depends_on": {"macros": ["macro.dbt.should_full_refresh", "macro.dbt.run_hooks", "macro.dbt.reset_csv_table", "macro.dbt.create_csv_table", "macro.dbt.load_csv_rows", "macro.dbt.noop_statement", "macro.dbt.get_csv_sql", "macro.dbt.should_revoke", "macro.dbt.apply_grants", "macro.dbt.persist_docs", "macro.dbt.create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.885725, "supported_languages": ["sql"]}, "macro.dbt.create_csv_table": {"name": "create_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.create_csv_table", "macro_sql": "{% macro create_csv_table(model, agate_table) -%}\n {{ adapter.dispatch('create_csv_table', 'dbt')(model, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.892179, "supported_languages": null}, "macro.dbt.default__create_csv_table": {"name": "default__create_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__create_csv_table", "macro_sql": "{% macro default__create_csv_table(model, agate_table) %}\n {%- set column_override = model['config'].get('column_types', {}) -%}\n {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}\n\n {% set sql %}\n create table {{ this.render() }} (\n {%- for col_name in agate_table.column_names -%}\n {%- set inferred_type = adapter.convert_type(agate_table, loop.index0) -%}\n {%- set type = column_override.get(col_name, inferred_type) -%}\n {%- set column_name = (col_name | string) -%}\n {{ adapter.quote_seed_column(column_name, quote_seed_column) }} {{ type }} {%- if not loop.last -%}, {%- endif -%}\n {%- endfor -%}\n )\n {% endset %}\n\n {% call statement('_') -%}\n {{ sql }}\n {%- endcall %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.894034, "supported_languages": null}, "macro.dbt.reset_csv_table": {"name": "reset_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.reset_csv_table", "macro_sql": "{% macro reset_csv_table(model, full_refresh, old_relation, agate_table) -%}\n {{ adapter.dispatch('reset_csv_table', 'dbt')(model, full_refresh, old_relation, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__reset_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8945038, "supported_languages": null}, "macro.dbt.default__reset_csv_table": {"name": "default__reset_csv_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__reset_csv_table", "macro_sql": "{% macro default__reset_csv_table(model, full_refresh, old_relation, agate_table) %}\n {% set sql = \"\" %}\n {% if full_refresh %}\n {{ adapter.drop_relation(old_relation) }}\n {% set sql = create_csv_table(model, agate_table) %}\n {% else %}\n {{ adapter.truncate_relation(old_relation) }}\n {% set sql = \"truncate table \" ~ old_relation %}\n {% endif %}\n\n {{ return(sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.create_csv_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.895484, "supported_languages": null}, "macro.dbt.get_csv_sql": {"name": "get_csv_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.get_csv_sql", "macro_sql": "{% macro get_csv_sql(create_or_truncate_sql, insert_sql) %}\n {{ adapter.dispatch('get_csv_sql', 'dbt')(create_or_truncate_sql, insert_sql) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_csv_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8958569, "supported_languages": null}, "macro.dbt.default__get_csv_sql": {"name": "default__get_csv_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__get_csv_sql", "macro_sql": "{% macro default__get_csv_sql(create_or_truncate_sql, insert_sql) %}\n {{ create_or_truncate_sql }};\n -- dbt seed --\n {{ insert_sql }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8961222, "supported_languages": null}, "macro.dbt.get_binding_char": {"name": "get_binding_char", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.get_binding_char", "macro_sql": "{% macro get_binding_char() -%}\n {{ adapter.dispatch('get_binding_char', 'dbt')() }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.896397, "supported_languages": null}, "macro.dbt.default__get_binding_char": {"name": "default__get_binding_char", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__get_binding_char", "macro_sql": "{% macro default__get_binding_char() %}\n {{ return('%s') }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.896619, "supported_languages": null}, "macro.dbt.get_batch_size": {"name": "get_batch_size", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.get_batch_size", "macro_sql": "{% macro get_batch_size() -%}\n {{ return(adapter.dispatch('get_batch_size', 'dbt')()) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_batch_size"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8969312, "supported_languages": null}, "macro.dbt.default__get_batch_size": {"name": "default__get_batch_size", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__get_batch_size", "macro_sql": "{% macro default__get_batch_size() %}\n {{ return(10000) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.897155, "supported_languages": null}, "macro.dbt.get_seed_column_quoted_csv": {"name": "get_seed_column_quoted_csv", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.get_seed_column_quoted_csv", "macro_sql": "{% macro get_seed_column_quoted_csv(model, column_names) %}\n {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}\n {% set quoted = [] %}\n {% for col in column_names -%}\n {%- do quoted.append(adapter.quote_seed_column(col, quote_seed_column)) -%}\n {%- endfor %}\n\n {%- set dest_cols_csv = quoted | join(', ') -%}\n {{ return(dest_cols_csv) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.8981152, "supported_languages": null}, "macro.dbt.load_csv_rows": {"name": "load_csv_rows", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.load_csv_rows", "macro_sql": "{% macro load_csv_rows(model, agate_table) -%}\n {{ adapter.dispatch('load_csv_rows', 'dbt')(model, agate_table) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__load_csv_rows"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.898477, "supported_languages": null}, "macro.dbt.default__load_csv_rows": {"name": "default__load_csv_rows", "resource_type": "macro", "package_name": "dbt", "path": "macros/materializations/seeds/helpers.sql", "original_file_path": "macros/materializations/seeds/helpers.sql", "unique_id": "macro.dbt.default__load_csv_rows", "macro_sql": "{% macro default__load_csv_rows(model, agate_table) %}\n\n {% set batch_size = get_batch_size() %}\n\n {% set cols_sql = get_seed_column_quoted_csv(model, agate_table.column_names) %}\n {% set bindings = [] %}\n\n {% set statements = [] %}\n\n {% for chunk in agate_table.rows | batch(batch_size) %}\n {% set bindings = [] %}\n\n {% for row in chunk %}\n {% do bindings.extend(row) %}\n {% endfor %}\n\n {% set sql %}\n insert into {{ this.render() }} ({{ cols_sql }}) values\n {% for row in chunk -%}\n ({%- for column in agate_table.column_names -%}\n {{ get_binding_char() }}\n {%- if not loop.last%},{%- endif %}\n {%- endfor -%})\n {%- if not loop.last%},{%- endif %}\n {%- endfor %}\n {% endset %}\n\n {% do adapter.add_query(sql, bindings=bindings, abridge_sql_log=True) %}\n\n {% if loop.index0 == 0 %}\n {% do statements.append(sql) %}\n {% endif %}\n {% endfor %}\n\n {# Return SQL so we can render it out into the compiled files #}\n {{ return(statements[0]) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_batch_size", "macro.dbt.get_seed_column_quoted_csv", "macro.dbt.get_binding_char"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.901248, "supported_languages": null}, "macro.dbt.generate_alias_name": {"name": "generate_alias_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_alias.sql", "original_file_path": "macros/get_custom_name/get_custom_alias.sql", "unique_id": "macro.dbt.generate_alias_name", "macro_sql": "{% macro generate_alias_name(custom_alias_name=none, node=none) -%}\n {% do return(adapter.dispatch('generate_alias_name', 'dbt')(custom_alias_name, node)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_alias_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.902019, "supported_languages": null}, "macro.dbt.default__generate_alias_name": {"name": "default__generate_alias_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_alias.sql", "original_file_path": "macros/get_custom_name/get_custom_alias.sql", "unique_id": "macro.dbt.default__generate_alias_name", "macro_sql": "{% macro default__generate_alias_name(custom_alias_name=none, node=none) -%}\n\n {%- if custom_alias_name -%}\n\n {{ custom_alias_name | trim }}\n\n {%- elif node.version -%}\n\n {{ return(node.name ~ \"_v\" ~ (node.version | replace(\".\", \"_\"))) }}\n\n {%- else -%}\n\n {{ node.name }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9027982, "supported_languages": null}, "macro.dbt.generate_schema_name": {"name": "generate_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_schema.sql", "original_file_path": "macros/get_custom_name/get_custom_schema.sql", "unique_id": "macro.dbt.generate_schema_name", "macro_sql": "{% macro generate_schema_name(custom_schema_name=none, node=none) -%}\n {{ return(adapter.dispatch('generate_schema_name', 'dbt')(custom_schema_name, node)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_schema_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.903672, "supported_languages": null}, "macro.dbt.default__generate_schema_name": {"name": "default__generate_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_schema.sql", "original_file_path": "macros/get_custom_name/get_custom_schema.sql", "unique_id": "macro.dbt.default__generate_schema_name", "macro_sql": "{% macro default__generate_schema_name(custom_schema_name, node) -%}\n\n {%- set default_schema = target.schema -%}\n {%- if custom_schema_name is none -%}\n\n {{ default_schema }}\n\n {%- else -%}\n\n {{ default_schema }}_{{ custom_schema_name | trim }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9042099, "supported_languages": null}, "macro.dbt.generate_schema_name_for_env": {"name": "generate_schema_name_for_env", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_schema.sql", "original_file_path": "macros/get_custom_name/get_custom_schema.sql", "unique_id": "macro.dbt.generate_schema_name_for_env", "macro_sql": "{% macro generate_schema_name_for_env(custom_schema_name, node) -%}\n\n {%- set default_schema = target.schema -%}\n {%- if target.name == 'prod' and custom_schema_name is not none -%}\n\n {{ custom_schema_name | trim }}\n\n {%- else -%}\n\n {{ default_schema }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.904798, "supported_languages": null}, "macro.dbt.generate_database_name": {"name": "generate_database_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_database.sql", "original_file_path": "macros/get_custom_name/get_custom_database.sql", "unique_id": "macro.dbt.generate_database_name", "macro_sql": "{% macro generate_database_name(custom_database_name=none, node=none) -%}\n {% do return(adapter.dispatch('generate_database_name', 'dbt')(custom_database_name, node)) %}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__generate_database_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.905508, "supported_languages": null}, "macro.dbt.default__generate_database_name": {"name": "default__generate_database_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/get_custom_name/get_custom_database.sql", "original_file_path": "macros/get_custom_name/get_custom_database.sql", "unique_id": "macro.dbt.default__generate_database_name", "macro_sql": "{% macro default__generate_database_name(custom_database_name=none, node=none) -%}\n {%- set default_database = target.database -%}\n {%- if custom_database_name is none -%}\n\n {{ default_database }}\n\n {%- else -%}\n\n {{ custom_database_name }}\n\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.906024, "supported_languages": null}, "macro.dbt.default__test_relationships": {"name": "default__test_relationships", "resource_type": "macro", "package_name": "dbt", "path": "macros/generic_test_sql/relationships.sql", "original_file_path": "macros/generic_test_sql/relationships.sql", "unique_id": "macro.dbt.default__test_relationships", "macro_sql": "{% macro default__test_relationships(model, column_name, to, field) %}\n\nwith child as (\n select {{ column_name }} as from_field\n from {{ model }}\n where {{ column_name }} is not null\n),\n\nparent as (\n select {{ field }} as to_field\n from {{ to }}\n)\n\nselect\n from_field\n\nfrom child\nleft join parent\n on child.from_field = parent.to_field\n\nwhere parent.to_field is null\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9066381, "supported_languages": null}, "macro.dbt.default__test_not_null": {"name": "default__test_not_null", "resource_type": "macro", "package_name": "dbt", "path": "macros/generic_test_sql/not_null.sql", "original_file_path": "macros/generic_test_sql/not_null.sql", "unique_id": "macro.dbt.default__test_not_null", "macro_sql": "{% macro default__test_not_null(model, column_name) %}\n\n{% set column_list = '*' if should_store_failures() else column_name %}\n\nselect {{ column_list }}\nfrom {{ model }}\nwhere {{ column_name }} is null\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.should_store_failures"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9072099, "supported_languages": null}, "macro.dbt.default__test_unique": {"name": "default__test_unique", "resource_type": "macro", "package_name": "dbt", "path": "macros/generic_test_sql/unique.sql", "original_file_path": "macros/generic_test_sql/unique.sql", "unique_id": "macro.dbt.default__test_unique", "macro_sql": "{% macro default__test_unique(model, column_name) %}\n\nselect\n {{ column_name }} as unique_field,\n count(*) as n_records\n\nfrom {{ model }}\nwhere {{ column_name }} is not null\ngroup by {{ column_name }}\nhaving count(*) > 1\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.90766, "supported_languages": null}, "macro.dbt.default__test_accepted_values": {"name": "default__test_accepted_values", "resource_type": "macro", "package_name": "dbt", "path": "macros/generic_test_sql/accepted_values.sql", "original_file_path": "macros/generic_test_sql/accepted_values.sql", "unique_id": "macro.dbt.default__test_accepted_values", "macro_sql": "{% macro default__test_accepted_values(model, column_name, values, quote=True) %}\n\nwith all_values as (\n\n select\n {{ column_name }} as value_field,\n count(*) as n_records\n\n from {{ model }}\n group by {{ column_name }}\n\n)\n\nselect *\nfrom all_values\nwhere value_field not in (\n {% for value in values -%}\n {% if quote -%}\n '{{ value }}'\n {%- else -%}\n {{ value }}\n {%- endif -%}\n {%- if not loop.last -%},{%- endif %}\n {%- endfor %}\n)\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.908724, "supported_languages": null}, "macro.dbt.statement": {"name": "statement", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/statement.sql", "original_file_path": "macros/etc/statement.sql", "unique_id": "macro.dbt.statement", "macro_sql": "\n{%- macro statement(name=None, fetch_result=False, auto_begin=True, language='sql') -%}\n {%- if execute: -%}\n {%- set compiled_code = caller() -%}\n\n {%- if name == 'main' -%}\n {{ log('Writing runtime {} for node \"{}\"'.format(language, model['unique_id'])) }}\n {{ write(compiled_code) }}\n {%- endif -%}\n {%- if language == 'sql'-%}\n {%- set res, table = adapter.execute(compiled_code, auto_begin=auto_begin, fetch=fetch_result) -%}\n {%- elif language == 'python' -%}\n {%- set res = submit_python_job(model, compiled_code) -%}\n {#-- TODO: What should table be for python models? --#}\n {%- set table = None -%}\n {%- else -%}\n {% do exceptions.raise_compiler_error(\"statement macro didn't get supported language\") %}\n {%- endif -%}\n\n {%- if name is not none -%}\n {{ store_result(name, response=res, agate_table=table) }}\n {%- endif -%}\n\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.911506, "supported_languages": null}, "macro.dbt.noop_statement": {"name": "noop_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/statement.sql", "original_file_path": "macros/etc/statement.sql", "unique_id": "macro.dbt.noop_statement", "macro_sql": "{% macro noop_statement(name=None, message=None, code=None, rows_affected=None, res=None) -%}\n {%- set sql = caller() -%}\n\n {%- if name == 'main' -%}\n {{ log('Writing runtime SQL for node \"{}\"'.format(model['unique_id'])) }}\n {{ write(sql) }}\n {%- endif -%}\n\n {%- if name is not none -%}\n {{ store_raw_result(name, message=message, code=code, rows_affected=rows_affected, agate_table=res) }}\n {%- endif -%}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.912765, "supported_languages": null}, "macro.dbt.run_query": {"name": "run_query", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/statement.sql", "original_file_path": "macros/etc/statement.sql", "unique_id": "macro.dbt.run_query", "macro_sql": "{% macro run_query(sql) %}\n {% call statement(\"run_query_statement\", fetch_result=true, auto_begin=false) %}\n {{ sql }}\n {% endcall %}\n\n {% do return(load_result(\"run_query_statement\").table) %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.913389, "supported_languages": null}, "macro.dbt.convert_datetime": {"name": "convert_datetime", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/datetime.sql", "original_file_path": "macros/etc/datetime.sql", "unique_id": "macro.dbt.convert_datetime", "macro_sql": "{% macro convert_datetime(date_str, date_fmt) %}\n\n {% set error_msg -%}\n The provided partition date '{{ date_str }}' does not match the expected format '{{ date_fmt }}'\n {%- endset %}\n\n {% set res = try_or_compiler_error(error_msg, modules.datetime.datetime.strptime, date_str.strip(), date_fmt) %}\n {{ return(res) }}\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.916148, "supported_languages": null}, "macro.dbt.dates_in_range": {"name": "dates_in_range", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/datetime.sql", "original_file_path": "macros/etc/datetime.sql", "unique_id": "macro.dbt.dates_in_range", "macro_sql": "{% macro dates_in_range(start_date_str, end_date_str=none, in_fmt=\"%Y%m%d\", out_fmt=\"%Y%m%d\") %}\n {% set end_date_str = start_date_str if end_date_str is none else end_date_str %}\n\n {% set start_date = convert_datetime(start_date_str, in_fmt) %}\n {% set end_date = convert_datetime(end_date_str, in_fmt) %}\n\n {% set day_count = (end_date - start_date).days %}\n {% if day_count < 0 %}\n {% set msg -%}\n Partiton start date is after the end date ({{ start_date }}, {{ end_date }})\n {%- endset %}\n\n {{ exceptions.raise_compiler_error(msg, model) }}\n {% endif %}\n\n {% set date_list = [] %}\n {% for i in range(0, day_count + 1) %}\n {% set the_date = (modules.datetime.timedelta(days=i) + start_date) %}\n {% if not out_fmt %}\n {% set _ = date_list.append(the_date) %}\n {% else %}\n {% set _ = date_list.append(the_date.strftime(out_fmt)) %}\n {% endif %}\n {% endfor %}\n\n {{ return(date_list) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.convert_datetime"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.918782, "supported_languages": null}, "macro.dbt.partition_range": {"name": "partition_range", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/datetime.sql", "original_file_path": "macros/etc/datetime.sql", "unique_id": "macro.dbt.partition_range", "macro_sql": "{% macro partition_range(raw_partition_date, date_fmt='%Y%m%d') %}\n {% set partition_range = (raw_partition_date | string).split(\",\") %}\n\n {% if (partition_range | length) == 1 %}\n {% set start_date = partition_range[0] %}\n {% set end_date = none %}\n {% elif (partition_range | length) == 2 %}\n {% set start_date = partition_range[0] %}\n {% set end_date = partition_range[1] %}\n {% else %}\n {{ exceptions.raise_compiler_error(\"Invalid partition time. Expected format: {Start Date}[,{End Date}]. Got: \" ~ raw_partition_date) }}\n {% endif %}\n\n {{ return(dates_in_range(start_date, end_date, in_fmt=date_fmt)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.dates_in_range"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.920365, "supported_languages": null}, "macro.dbt.py_current_timestring": {"name": "py_current_timestring", "resource_type": "macro", "package_name": "dbt", "path": "macros/etc/datetime.sql", "original_file_path": "macros/etc/datetime.sql", "unique_id": "macro.dbt.py_current_timestring", "macro_sql": "{% macro py_current_timestring() %}\n {% set dt = modules.datetime.datetime.now() %}\n {% do return(dt.strftime(\"%Y%m%d%H%M%S%f\")) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9208598, "supported_languages": null}, "macro.dbt.except": {"name": "except", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/except.sql", "original_file_path": "macros/utils/except.sql", "unique_id": "macro.dbt.except", "macro_sql": "{% macro except() %}\n {{ return(adapter.dispatch('except', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__except"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.92133, "supported_languages": null}, "macro.dbt.default__except": {"name": "default__except", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/except.sql", "original_file_path": "macros/utils/except.sql", "unique_id": "macro.dbt.default__except", "macro_sql": "{% macro default__except() %}\n\n except\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.921483, "supported_languages": null}, "macro.dbt.replace": {"name": "replace", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/replace.sql", "original_file_path": "macros/utils/replace.sql", "unique_id": "macro.dbt.replace", "macro_sql": "{% macro replace(field, old_chars, new_chars) -%}\n {{ return(adapter.dispatch('replace', 'dbt') (field, old_chars, new_chars)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__replace"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.922515, "supported_languages": null}, "macro.dbt.default__replace": {"name": "default__replace", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/replace.sql", "original_file_path": "macros/utils/replace.sql", "unique_id": "macro.dbt.default__replace", "macro_sql": "{% macro default__replace(field, old_chars, new_chars) %}\n\n replace(\n {{ field }},\n {{ old_chars }},\n {{ new_chars }}\n )\n\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.926881, "supported_languages": null}, "macro.dbt.concat": {"name": "concat", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/concat.sql", "original_file_path": "macros/utils/concat.sql", "unique_id": "macro.dbt.concat", "macro_sql": "{% macro concat(fields) -%}\n {{ return(adapter.dispatch('concat', 'dbt')(fields)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.928879, "supported_languages": null}, "macro.dbt.default__concat": {"name": "default__concat", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/concat.sql", "original_file_path": "macros/utils/concat.sql", "unique_id": "macro.dbt.default__concat", "macro_sql": "{% macro default__concat(fields) -%}\n {{ fields|join(' || ') }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9325812, "supported_languages": null}, "macro.dbt.length": {"name": "length", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/length.sql", "original_file_path": "macros/utils/length.sql", "unique_id": "macro.dbt.length", "macro_sql": "{% macro length(expression) -%}\n {{ return(adapter.dispatch('length', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__length"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9345338, "supported_languages": null}, "macro.dbt.default__length": {"name": "default__length", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/length.sql", "original_file_path": "macros/utils/length.sql", "unique_id": "macro.dbt.default__length", "macro_sql": "{% macro default__length(expression) %}\n\n length(\n {{ expression }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.935252, "supported_languages": null}, "macro.dbt.dateadd": {"name": "dateadd", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/dateadd.sql", "original_file_path": "macros/utils/dateadd.sql", "unique_id": "macro.dbt.dateadd", "macro_sql": "{% macro dateadd(datepart, interval, from_date_or_timestamp) %}\n {{ return(adapter.dispatch('dateadd', 'dbt')(datepart, interval, from_date_or_timestamp)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__dateadd"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.937108, "supported_languages": null}, "macro.dbt.default__dateadd": {"name": "default__dateadd", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/dateadd.sql", "original_file_path": "macros/utils/dateadd.sql", "unique_id": "macro.dbt.default__dateadd", "macro_sql": "{% macro default__dateadd(datepart, interval, from_date_or_timestamp) %}\n\n dateadd(\n {{ datepart }},\n {{ interval }},\n {{ from_date_or_timestamp }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.938426, "supported_languages": null}, "macro.dbt.intersect": {"name": "intersect", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/intersect.sql", "original_file_path": "macros/utils/intersect.sql", "unique_id": "macro.dbt.intersect", "macro_sql": "{% macro intersect() %}\n {{ return(adapter.dispatch('intersect', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__intersect"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.939171, "supported_languages": null}, "macro.dbt.default__intersect": {"name": "default__intersect", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/intersect.sql", "original_file_path": "macros/utils/intersect.sql", "unique_id": "macro.dbt.default__intersect", "macro_sql": "{% macro default__intersect() %}\n\n intersect\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.939338, "supported_languages": null}, "macro.dbt.escape_single_quotes": {"name": "escape_single_quotes", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/escape_single_quotes.sql", "original_file_path": "macros/utils/escape_single_quotes.sql", "unique_id": "macro.dbt.escape_single_quotes", "macro_sql": "{% macro escape_single_quotes(expression) %}\n {{ return(adapter.dispatch('escape_single_quotes', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__escape_single_quotes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9398642, "supported_languages": null}, "macro.dbt.default__escape_single_quotes": {"name": "default__escape_single_quotes", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/escape_single_quotes.sql", "original_file_path": "macros/utils/escape_single_quotes.sql", "unique_id": "macro.dbt.default__escape_single_quotes", "macro_sql": "{% macro default__escape_single_quotes(expression) -%}\n{{ expression | replace(\"'\",\"''\") }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.940147, "supported_languages": null}, "macro.dbt.right": {"name": "right", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/right.sql", "original_file_path": "macros/utils/right.sql", "unique_id": "macro.dbt.right", "macro_sql": "{% macro right(string_text, length_expression) -%}\n {{ return(adapter.dispatch('right', 'dbt') (string_text, length_expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__right"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.940704, "supported_languages": null}, "macro.dbt.default__right": {"name": "default__right", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/right.sql", "original_file_path": "macros/utils/right.sql", "unique_id": "macro.dbt.default__right", "macro_sql": "{% macro default__right(string_text, length_expression) %}\n\n right(\n {{ string_text }},\n {{ length_expression }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9409761, "supported_languages": null}, "macro.dbt.listagg": {"name": "listagg", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/listagg.sql", "original_file_path": "macros/utils/listagg.sql", "unique_id": "macro.dbt.listagg", "macro_sql": "{% macro listagg(measure, delimiter_text=\"','\", order_by_clause=none, limit_num=none) -%}\n {{ return(adapter.dispatch('listagg', 'dbt') (measure, delimiter_text, order_by_clause, limit_num)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__listagg"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.942027, "supported_languages": null}, "macro.dbt.default__listagg": {"name": "default__listagg", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/listagg.sql", "original_file_path": "macros/utils/listagg.sql", "unique_id": "macro.dbt.default__listagg", "macro_sql": "{% macro default__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}\n\n {% if limit_num -%}\n array_to_string(\n array_slice(\n array_agg(\n {{ measure }}\n ){% if order_by_clause -%}\n within group ({{ order_by_clause }})\n {%- endif %}\n ,0\n ,{{ limit_num }}\n ),\n {{ delimiter_text }}\n )\n {%- else %}\n listagg(\n {{ measure }},\n {{ delimiter_text }}\n )\n {% if order_by_clause -%}\n within group ({{ order_by_clause }})\n {%- endif %}\n {%- endif %}\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.942858, "supported_languages": null}, "macro.dbt.datediff": {"name": "datediff", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/datediff.sql", "original_file_path": "macros/utils/datediff.sql", "unique_id": "macro.dbt.datediff", "macro_sql": "{% macro datediff(first_date, second_date, datepart) %}\n {{ return(adapter.dispatch('datediff', 'dbt')(first_date, second_date, datepart)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__datediff"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9434812, "supported_languages": null}, "macro.dbt.default__datediff": {"name": "default__datediff", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/datediff.sql", "original_file_path": "macros/utils/datediff.sql", "unique_id": "macro.dbt.default__datediff", "macro_sql": "{% macro default__datediff(first_date, second_date, datepart) -%}\n\n datediff(\n {{ datepart }},\n {{ first_date }},\n {{ second_date }}\n )\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.943808, "supported_languages": null}, "macro.dbt.safe_cast": {"name": "safe_cast", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/safe_cast.sql", "original_file_path": "macros/utils/safe_cast.sql", "unique_id": "macro.dbt.safe_cast", "macro_sql": "{% macro safe_cast(field, type) %}\n {{ return(adapter.dispatch('safe_cast', 'dbt') (field, type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__safe_cast"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9443479, "supported_languages": null}, "macro.dbt.default__safe_cast": {"name": "default__safe_cast", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/safe_cast.sql", "original_file_path": "macros/utils/safe_cast.sql", "unique_id": "macro.dbt.default__safe_cast", "macro_sql": "{% macro default__safe_cast(field, type) %}\n {# most databases don't support this function yet\n so we just need to use cast #}\n cast({{field}} as {{type}})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.944736, "supported_languages": null}, "macro.dbt.hash": {"name": "hash", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/hash.sql", "original_file_path": "macros/utils/hash.sql", "unique_id": "macro.dbt.hash", "macro_sql": "{% macro hash(field) -%}\n {{ return(adapter.dispatch('hash', 'dbt') (field)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__hash"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9452171, "supported_languages": null}, "macro.dbt.default__hash": {"name": "default__hash", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/hash.sql", "original_file_path": "macros/utils/hash.sql", "unique_id": "macro.dbt.default__hash", "macro_sql": "{% macro default__hash(field) -%}\n md5(cast({{ field }} as {{ api.Column.translate_type('string') }}))\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.945528, "supported_languages": null}, "macro.dbt.cast_bool_to_text": {"name": "cast_bool_to_text", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/cast_bool_to_text.sql", "original_file_path": "macros/utils/cast_bool_to_text.sql", "unique_id": "macro.dbt.cast_bool_to_text", "macro_sql": "{% macro cast_bool_to_text(field) %}\n {{ adapter.dispatch('cast_bool_to_text', 'dbt') (field) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__cast_bool_to_text"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9459789, "supported_languages": null}, "macro.dbt.default__cast_bool_to_text": {"name": "default__cast_bool_to_text", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/cast_bool_to_text.sql", "original_file_path": "macros/utils/cast_bool_to_text.sql", "unique_id": "macro.dbt.default__cast_bool_to_text", "macro_sql": "{% macro default__cast_bool_to_text(field) %}\n cast({{ field }} as {{ api.Column.translate_type('string') }})\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9462888, "supported_languages": null}, "macro.dbt.any_value": {"name": "any_value", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/any_value.sql", "original_file_path": "macros/utils/any_value.sql", "unique_id": "macro.dbt.any_value", "macro_sql": "{% macro any_value(expression) -%}\n {{ return(adapter.dispatch('any_value', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__any_value"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9467509, "supported_languages": null}, "macro.dbt.default__any_value": {"name": "default__any_value", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/any_value.sql", "original_file_path": "macros/utils/any_value.sql", "unique_id": "macro.dbt.default__any_value", "macro_sql": "{% macro default__any_value(expression) -%}\n\n any_value({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.94695, "supported_languages": null}, "macro.dbt.position": {"name": "position", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/position.sql", "original_file_path": "macros/utils/position.sql", "unique_id": "macro.dbt.position", "macro_sql": "{% macro position(substring_text, string_text) -%}\n {{ return(adapter.dispatch('position', 'dbt') (substring_text, string_text)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__position"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.947484, "supported_languages": null}, "macro.dbt.default__position": {"name": "default__position", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/position.sql", "original_file_path": "macros/utils/position.sql", "unique_id": "macro.dbt.default__position", "macro_sql": "{% macro default__position(substring_text, string_text) %}\n\n position(\n {{ substring_text }} in {{ string_text }}\n )\n\n{%- endmacro -%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.947744, "supported_languages": null}, "macro.dbt.string_literal": {"name": "string_literal", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/literal.sql", "original_file_path": "macros/utils/literal.sql", "unique_id": "macro.dbt.string_literal", "macro_sql": "{%- macro string_literal(value) -%}\n {{ return(adapter.dispatch('string_literal', 'dbt') (value)) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__string_literal"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9482, "supported_languages": null}, "macro.dbt.default__string_literal": {"name": "default__string_literal", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/literal.sql", "original_file_path": "macros/utils/literal.sql", "unique_id": "macro.dbt.default__string_literal", "macro_sql": "{% macro default__string_literal(value) -%}\n '{{ value }}'\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9483972, "supported_languages": null}, "macro.dbt.type_string": {"name": "type_string", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_string", "macro_sql": "\n\n{%- macro type_string() -%}\n {{ return(adapter.dispatch('type_string', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_string"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.949804, "supported_languages": null}, "macro.dbt.default__type_string": {"name": "default__type_string", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_string", "macro_sql": "{% macro default__type_string() %}\n {{ return(api.Column.translate_type(\"string\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9501061, "supported_languages": null}, "macro.dbt.type_timestamp": {"name": "type_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_timestamp", "macro_sql": "\n\n{%- macro type_timestamp() -%}\n {{ return(adapter.dispatch('type_timestamp', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.950428, "supported_languages": null}, "macro.dbt.default__type_timestamp": {"name": "default__type_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_timestamp", "macro_sql": "{% macro default__type_timestamp() %}\n {{ return(api.Column.translate_type(\"timestamp\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.950727, "supported_languages": null}, "macro.dbt.type_float": {"name": "type_float", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_float", "macro_sql": "\n\n{%- macro type_float() -%}\n {{ return(adapter.dispatch('type_float', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_float"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.951042, "supported_languages": null}, "macro.dbt.default__type_float": {"name": "default__type_float", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_float", "macro_sql": "{% macro default__type_float() %}\n {{ return(api.Column.translate_type(\"float\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.951336, "supported_languages": null}, "macro.dbt.type_numeric": {"name": "type_numeric", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_numeric", "macro_sql": "\n\n{%- macro type_numeric() -%}\n {{ return(adapter.dispatch('type_numeric', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_numeric"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.951649, "supported_languages": null}, "macro.dbt.default__type_numeric": {"name": "default__type_numeric", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_numeric", "macro_sql": "{% macro default__type_numeric() %}\n {{ return(api.Column.numeric_type(\"numeric\", 28, 6)) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.951998, "supported_languages": null}, "macro.dbt.type_bigint": {"name": "type_bigint", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_bigint", "macro_sql": "\n\n{%- macro type_bigint() -%}\n {{ return(adapter.dispatch('type_bigint', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_bigint"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9523149, "supported_languages": null}, "macro.dbt.default__type_bigint": {"name": "default__type_bigint", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_bigint", "macro_sql": "{% macro default__type_bigint() %}\n {{ return(api.Column.translate_type(\"bigint\")) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.952611, "supported_languages": null}, "macro.dbt.type_int": {"name": "type_int", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_int", "macro_sql": "\n\n{%- macro type_int() -%}\n {{ return(adapter.dispatch('type_int', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_int"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.953002, "supported_languages": null}, "macro.dbt.default__type_int": {"name": "default__type_int", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_int", "macro_sql": "{%- macro default__type_int() -%}\n {{ return(api.Column.translate_type(\"integer\")) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.953287, "supported_languages": null}, "macro.dbt.type_boolean": {"name": "type_boolean", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.type_boolean", "macro_sql": "\n\n{%- macro type_boolean() -%}\n {{ return(adapter.dispatch('type_boolean', 'dbt')()) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.default__type_boolean"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.953603, "supported_languages": null}, "macro.dbt.default__type_boolean": {"name": "default__type_boolean", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/data_types.sql", "original_file_path": "macros/utils/data_types.sql", "unique_id": "macro.dbt.default__type_boolean", "macro_sql": "{%- macro default__type_boolean() -%}\n {{ return(api.Column.translate_type(\"boolean\")) }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.953886, "supported_languages": null}, "macro.dbt.array_concat": {"name": "array_concat", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_concat.sql", "original_file_path": "macros/utils/array_concat.sql", "unique_id": "macro.dbt.array_concat", "macro_sql": "{% macro array_concat(array_1, array_2) -%}\n {{ return(adapter.dispatch('array_concat', 'dbt')(array_1, array_2)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__array_concat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.954411, "supported_languages": null}, "macro.dbt.default__array_concat": {"name": "default__array_concat", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_concat.sql", "original_file_path": "macros/utils/array_concat.sql", "unique_id": "macro.dbt.default__array_concat", "macro_sql": "{% macro default__array_concat(array_1, array_2) -%}\n array_cat({{ array_1 }}, {{ array_2 }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9546711, "supported_languages": null}, "macro.dbt.bool_or": {"name": "bool_or", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/bool_or.sql", "original_file_path": "macros/utils/bool_or.sql", "unique_id": "macro.dbt.bool_or", "macro_sql": "{% macro bool_or(expression) -%}\n {{ return(adapter.dispatch('bool_or', 'dbt') (expression)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__bool_or"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.955136, "supported_languages": null}, "macro.dbt.default__bool_or": {"name": "default__bool_or", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/bool_or.sql", "original_file_path": "macros/utils/bool_or.sql", "unique_id": "macro.dbt.default__bool_or", "macro_sql": "{% macro default__bool_or(expression) -%}\n\n bool_or({{ expression }})\n\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9553359, "supported_languages": null}, "macro.dbt.last_day": {"name": "last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt.last_day", "macro_sql": "{% macro last_day(date, datepart) %}\n {{ return(adapter.dispatch('last_day', 'dbt') (date, datepart)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.955947, "supported_languages": null}, "macro.dbt.default_last_day": {"name": "default_last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt.default_last_day", "macro_sql": "\n\n{%- macro default_last_day(date, datepart) -%}\n cast(\n {{dbt.dateadd('day', '-1',\n dbt.dateadd(datepart, '1', dbt.date_trunc(datepart, date))\n )}}\n as date)\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt.dateadd", "macro.dbt.date_trunc"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9564722, "supported_languages": null}, "macro.dbt.default__last_day": {"name": "default__last_day", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/last_day.sql", "original_file_path": "macros/utils/last_day.sql", "unique_id": "macro.dbt.default__last_day", "macro_sql": "{% macro default__last_day(date, datepart) -%}\n {{dbt.default_last_day(date, datepart)}}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default_last_day"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.956759, "supported_languages": null}, "macro.dbt.split_part": {"name": "split_part", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt.split_part", "macro_sql": "{% macro split_part(string_text, delimiter_text, part_number) %}\n {{ return(adapter.dispatch('split_part', 'dbt') (string_text, delimiter_text, part_number)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__split_part"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9576151, "supported_languages": null}, "macro.dbt.default__split_part": {"name": "default__split_part", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt.default__split_part", "macro_sql": "{% macro default__split_part(string_text, delimiter_text, part_number) %}\n\n split_part(\n {{ string_text }},\n {{ delimiter_text }},\n {{ part_number }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.957938, "supported_languages": null}, "macro.dbt._split_part_negative": {"name": "_split_part_negative", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/split_part.sql", "original_file_path": "macros/utils/split_part.sql", "unique_id": "macro.dbt._split_part_negative", "macro_sql": "{% macro _split_part_negative(string_text, delimiter_text, part_number) %}\n\n split_part(\n {{ string_text }},\n {{ delimiter_text }},\n length({{ string_text }})\n - length(\n replace({{ string_text }}, {{ delimiter_text }}, '')\n ) + 2 {{ part_number }}\n )\n\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.95838, "supported_languages": null}, "macro.dbt.date_trunc": {"name": "date_trunc", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/date_trunc.sql", "original_file_path": "macros/utils/date_trunc.sql", "unique_id": "macro.dbt.date_trunc", "macro_sql": "{% macro date_trunc(datepart, date) -%}\n {{ return(adapter.dispatch('date_trunc', 'dbt') (datepart, date)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__date_trunc"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.958901, "supported_languages": null}, "macro.dbt.default__date_trunc": {"name": "default__date_trunc", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/date_trunc.sql", "original_file_path": "macros/utils/date_trunc.sql", "unique_id": "macro.dbt.default__date_trunc", "macro_sql": "{% macro default__date_trunc(datepart, date) -%}\n date_trunc('{{datepart}}', {{date}})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.959154, "supported_languages": null}, "macro.dbt.array_construct": {"name": "array_construct", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_construct.sql", "original_file_path": "macros/utils/array_construct.sql", "unique_id": "macro.dbt.array_construct", "macro_sql": "{% macro array_construct(inputs=[], data_type=api.Column.translate_type('integer')) -%}\n {{ return(adapter.dispatch('array_construct', 'dbt')(inputs, data_type)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__array_construct"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.959855, "supported_languages": null}, "macro.dbt.default__array_construct": {"name": "default__array_construct", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_construct.sql", "original_file_path": "macros/utils/array_construct.sql", "unique_id": "macro.dbt.default__array_construct", "macro_sql": "{% macro default__array_construct(inputs, data_type) -%}\n {% if inputs|length > 0 %}\n array[ {{ inputs|join(' , ') }} ]\n {% else %}\n array[]::{{data_type}}[]\n {% endif %}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9603388, "supported_languages": null}, "macro.dbt.array_append": {"name": "array_append", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_append.sql", "original_file_path": "macros/utils/array_append.sql", "unique_id": "macro.dbt.array_append", "macro_sql": "{% macro array_append(array, new_element) -%}\n {{ return(adapter.dispatch('array_append', 'dbt')(array, new_element)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__array_append"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9608629, "supported_languages": null}, "macro.dbt.default__array_append": {"name": "default__array_append", "resource_type": "macro", "package_name": "dbt", "path": "macros/utils/array_append.sql", "original_file_path": "macros/utils/array_append.sql", "unique_id": "macro.dbt.default__array_append", "macro_sql": "{% macro default__array_append(array, new_element) -%}\n array_append({{ array }}, {{ new_element }})\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.961122, "supported_languages": null}, "macro.dbt.create_schema": {"name": "create_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/schema.sql", "original_file_path": "macros/adapters/schema.sql", "unique_id": "macro.dbt.create_schema", "macro_sql": "{% macro create_schema(relation) -%}\n {{ adapter.dispatch('create_schema', 'dbt')(relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__create_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9617522, "supported_languages": null}, "macro.dbt.default__create_schema": {"name": "default__create_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/schema.sql", "original_file_path": "macros/adapters/schema.sql", "unique_id": "macro.dbt.default__create_schema", "macro_sql": "{% macro default__create_schema(relation) -%}\n {%- call statement('create_schema') -%}\n create schema if not exists {{ relation.without_identifier() }}\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.962124, "supported_languages": null}, "macro.dbt.drop_schema": {"name": "drop_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/schema.sql", "original_file_path": "macros/adapters/schema.sql", "unique_id": "macro.dbt.drop_schema", "macro_sql": "{% macro drop_schema(relation) -%}\n {{ adapter.dispatch('drop_schema', 'dbt')(relation) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__drop_schema"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.96244, "supported_languages": null}, "macro.dbt.default__drop_schema": {"name": "default__drop_schema", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/schema.sql", "original_file_path": "macros/adapters/schema.sql", "unique_id": "macro.dbt.default__drop_schema", "macro_sql": "{% macro default__drop_schema(relation) -%}\n {%- call statement('drop_schema') -%}\n drop schema if exists {{ relation.without_identifier() }} cascade\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.962804, "supported_languages": null}, "macro.dbt.current_timestamp": {"name": "current_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.current_timestamp", "macro_sql": "{%- macro current_timestamp() -%}\n {{ adapter.dispatch('current_timestamp', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_postgres.postgres__current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.963669, "supported_languages": null}, "macro.dbt.default__current_timestamp": {"name": "default__current_timestamp", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp", "macro_sql": "{% macro default__current_timestamp() -%}\n {{ exceptions.raise_not_implemented(\n 'current_timestamp macro not implemented for adapter ' + adapter.type()) }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.963972, "supported_languages": null}, "macro.dbt.snapshot_get_time": {"name": "snapshot_get_time", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.snapshot_get_time", "macro_sql": "\n\n{%- macro snapshot_get_time() -%}\n {{ adapter.dispatch('snapshot_get_time', 'dbt')() }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": ["macro.dbt_postgres.postgres__snapshot_get_time"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.96425, "supported_languages": null}, "macro.dbt.default__snapshot_get_time": {"name": "default__snapshot_get_time", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.default__snapshot_get_time", "macro_sql": "{% macro default__snapshot_get_time() %}\n {{ current_timestamp() }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.964457, "supported_languages": null}, "macro.dbt.current_timestamp_backcompat": {"name": "current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.current_timestamp_backcompat", "macro_sql": "{% macro current_timestamp_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9647832, "supported_languages": null}, "macro.dbt.default__current_timestamp_backcompat": {"name": "default__current_timestamp_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp_backcompat", "macro_sql": "{% macro default__current_timestamp_backcompat() %}\n current_timestamp::timestamp\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9649239, "supported_languages": null}, "macro.dbt.current_timestamp_in_utc_backcompat": {"name": "current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.current_timestamp_in_utc_backcompat", "macro_sql": "{% macro current_timestamp_in_utc_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_in_utc_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__current_timestamp_in_utc_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.965248, "supported_languages": null}, "macro.dbt.default__current_timestamp_in_utc_backcompat": {"name": "default__current_timestamp_in_utc_backcompat", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/timestamps.sql", "original_file_path": "macros/adapters/timestamps.sql", "unique_id": "macro.dbt.default__current_timestamp_in_utc_backcompat", "macro_sql": "{% macro default__current_timestamp_in_utc_backcompat() %}\n {{ return(adapter.dispatch('current_timestamp_backcompat', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.current_timestamp_backcompat", "macro.dbt_postgres.postgres__current_timestamp_backcompat"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.965575, "supported_languages": null}, "macro.dbt.get_create_index_sql": {"name": "get_create_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.get_create_index_sql", "macro_sql": "{% macro get_create_index_sql(relation, index_dict) -%}\n {{ return(adapter.dispatch('get_create_index_sql', 'dbt')(relation, index_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_create_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.966851, "supported_languages": null}, "macro.dbt.default__get_create_index_sql": {"name": "default__get_create_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.default__get_create_index_sql", "macro_sql": "{% macro default__get_create_index_sql(relation, index_dict) -%}\n {% do return(None) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.967123, "supported_languages": null}, "macro.dbt.create_indexes": {"name": "create_indexes", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.create_indexes", "macro_sql": "{% macro create_indexes(relation) -%}\n {{ adapter.dispatch('create_indexes', 'dbt')(relation) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__create_indexes"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9674299, "supported_languages": null}, "macro.dbt.default__create_indexes": {"name": "default__create_indexes", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.default__create_indexes", "macro_sql": "{% macro default__create_indexes(relation) -%}\n {%- set _indexes = config.get('indexes', default=[]) -%}\n\n {% for _index_dict in _indexes %}\n {% set create_index_sql = get_create_index_sql(relation, _index_dict) %}\n {% if create_index_sql %}\n {% do run_query(create_index_sql) %}\n {% endif %}\n {% endfor %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_create_index_sql", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.968244, "supported_languages": null}, "macro.dbt.get_drop_index_sql": {"name": "get_drop_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.get_drop_index_sql", "macro_sql": "{% macro get_drop_index_sql(relation, index_name) -%}\n {{ adapter.dispatch('get_drop_index_sql', 'dbt')(relation, index_name) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_drop_index_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.968603, "supported_languages": null}, "macro.dbt.default__get_drop_index_sql": {"name": "default__get_drop_index_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.default__get_drop_index_sql", "macro_sql": "{% macro default__get_drop_index_sql(relation, index_name) -%}\n {{ exceptions.raise_compiler_error(\"`get_drop_index_sql has not been implemented for this adapter.\") }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.968868, "supported_languages": null}, "macro.dbt.get_show_indexes_sql": {"name": "get_show_indexes_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.get_show_indexes_sql", "macro_sql": "{% macro get_show_indexes_sql(relation) -%}\n {{ adapter.dispatch('get_show_indexes_sql', 'dbt')(relation) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_show_indexes_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.969174, "supported_languages": null}, "macro.dbt.default__get_show_indexes_sql": {"name": "default__get_show_indexes_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/indexes.sql", "original_file_path": "macros/adapters/indexes.sql", "unique_id": "macro.dbt.default__get_show_indexes_sql", "macro_sql": "{% macro default__get_show_indexes_sql(relation) -%}\n {{ exceptions.raise_compiler_error(\"`get_show_indexes_sql has not been implemented for this adapter.\") }}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9694169, "supported_languages": null}, "macro.dbt.make_intermediate_relation": {"name": "make_intermediate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.make_intermediate_relation", "macro_sql": "{% macro make_intermediate_relation(base_relation, suffix='__dbt_tmp') %}\n {{ return(adapter.dispatch('make_intermediate_relation', 'dbt')(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_intermediate_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.973003, "supported_languages": null}, "macro.dbt.default__make_intermediate_relation": {"name": "default__make_intermediate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__make_intermediate_relation", "macro_sql": "{% macro default__make_intermediate_relation(base_relation, suffix) %}\n {{ return(default__make_temp_relation(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.973333, "supported_languages": null}, "macro.dbt.make_temp_relation": {"name": "make_temp_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.make_temp_relation", "macro_sql": "{% macro make_temp_relation(base_relation, suffix='__dbt_tmp') %}\n {{ return(adapter.dispatch('make_temp_relation', 'dbt')(base_relation, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_temp_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.973761, "supported_languages": null}, "macro.dbt.default__make_temp_relation": {"name": "default__make_temp_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__make_temp_relation", "macro_sql": "{% macro default__make_temp_relation(base_relation, suffix) %}\n {%- set temp_identifier = base_relation.identifier ~ suffix -%}\n {%- set temp_relation = base_relation.incorporate(\n path={\"identifier\": temp_identifier}) -%}\n\n {{ return(temp_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.974347, "supported_languages": null}, "macro.dbt.make_backup_relation": {"name": "make_backup_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.make_backup_relation", "macro_sql": "{% macro make_backup_relation(base_relation, backup_relation_type, suffix='__dbt_backup') %}\n {{ return(adapter.dispatch('make_backup_relation', 'dbt')(base_relation, backup_relation_type, suffix)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__make_backup_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.974825, "supported_languages": null}, "macro.dbt.default__make_backup_relation": {"name": "default__make_backup_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__make_backup_relation", "macro_sql": "{% macro default__make_backup_relation(base_relation, backup_relation_type, suffix) %}\n {%- set backup_identifier = base_relation.identifier ~ suffix -%}\n {%- set backup_relation = base_relation.incorporate(\n path={\"identifier\": backup_identifier},\n type=backup_relation_type\n ) -%}\n {{ return(backup_relation) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.975559, "supported_languages": null}, "macro.dbt.truncate_relation": {"name": "truncate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.truncate_relation", "macro_sql": "{% macro truncate_relation(relation) -%}\n {{ return(adapter.dispatch('truncate_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__truncate_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.975917, "supported_languages": null}, "macro.dbt.default__truncate_relation": {"name": "default__truncate_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__truncate_relation", "macro_sql": "{% macro default__truncate_relation(relation) -%}\n {% call statement('truncate_relation') -%}\n truncate table {{ relation }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.976236, "supported_languages": null}, "macro.dbt.rename_relation": {"name": "rename_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.rename_relation", "macro_sql": "{% macro rename_relation(from_relation, to_relation) -%}\n {{ return(adapter.dispatch('rename_relation', 'dbt')(from_relation, to_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__rename_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.976636, "supported_languages": null}, "macro.dbt.default__rename_relation": {"name": "default__rename_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__rename_relation", "macro_sql": "{% macro default__rename_relation(from_relation, to_relation) -%}\n {% set target_name = adapter.quote_as_configured(to_relation.identifier, 'identifier') %}\n {% call statement('rename_relation') -%}\n alter table {{ from_relation }} rename to {{ target_name }}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9772, "supported_languages": null}, "macro.dbt.get_or_create_relation": {"name": "get_or_create_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.get_or_create_relation", "macro_sql": "{% macro get_or_create_relation(database, schema, identifier, type) -%}\n {{ return(adapter.dispatch('get_or_create_relation', 'dbt')(database, schema, identifier, type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_or_create_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.977695, "supported_languages": null}, "macro.dbt.default__get_or_create_relation": {"name": "default__get_or_create_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.default__get_or_create_relation", "macro_sql": "{% macro default__get_or_create_relation(database, schema, identifier, type) %}\n {%- set target_relation = adapter.get_relation(database=database, schema=schema, identifier=identifier) %}\n\n {% if target_relation %}\n {% do return([true, target_relation]) %}\n {% endif %}\n\n {%- set new_relation = api.Relation.create(\n database=database,\n schema=schema,\n identifier=identifier,\n type=type\n ) -%}\n {% do return([false, new_relation]) %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.978828, "supported_languages": null}, "macro.dbt.load_cached_relation": {"name": "load_cached_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.load_cached_relation", "macro_sql": "{% macro load_cached_relation(relation) %}\n {% do return(adapter.get_relation(\n database=relation.database,\n schema=relation.schema,\n identifier=relation.identifier\n )) -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.97929, "supported_languages": null}, "macro.dbt.load_relation": {"name": "load_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.load_relation", "macro_sql": "{% macro load_relation(relation) %}\n {{ return(load_cached_relation(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.load_cached_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.979569, "supported_languages": null}, "macro.dbt.drop_relation_if_exists": {"name": "drop_relation_if_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/relation.sql", "original_file_path": "macros/adapters/relation.sql", "unique_id": "macro.dbt.drop_relation_if_exists", "macro_sql": "{% macro drop_relation_if_exists(relation) %}\n {% if relation is not none %}\n {{ adapter.drop_relation(relation) }}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.979955, "supported_languages": null}, "macro.dbt.collect_freshness": {"name": "collect_freshness", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/freshness.sql", "original_file_path": "macros/adapters/freshness.sql", "unique_id": "macro.dbt.collect_freshness", "macro_sql": "{% macro collect_freshness(source, loaded_at_field, filter) %}\n {{ return(adapter.dispatch('collect_freshness', 'dbt')(source, loaded_at_field, filter))}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__collect_freshness"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.980705, "supported_languages": null}, "macro.dbt.default__collect_freshness": {"name": "default__collect_freshness", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/freshness.sql", "original_file_path": "macros/adapters/freshness.sql", "unique_id": "macro.dbt.default__collect_freshness", "macro_sql": "{% macro default__collect_freshness(source, loaded_at_field, filter) %}\n {% call statement('collect_freshness', fetch_result=True, auto_begin=False) -%}\n select\n max({{ loaded_at_field }}) as max_loaded_at,\n {{ current_timestamp() }} as snapshotted_at\n from {{ source }}\n {% if filter %}\n where {{ filter }}\n {% endif %}\n {% endcall %}\n {{ return(load_result('collect_freshness')) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.current_timestamp"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.981581, "supported_languages": null}, "macro.dbt.copy_grants": {"name": "copy_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.copy_grants", "macro_sql": "{% macro copy_grants() %}\n {{ return(adapter.dispatch('copy_grants', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__copy_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9841359, "supported_languages": null}, "macro.dbt.default__copy_grants": {"name": "default__copy_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__copy_grants", "macro_sql": "{% macro default__copy_grants() %}\n {{ return(True) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.984374, "supported_languages": null}, "macro.dbt.support_multiple_grantees_per_dcl_statement": {"name": "support_multiple_grantees_per_dcl_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.support_multiple_grantees_per_dcl_statement", "macro_sql": "{% macro support_multiple_grantees_per_dcl_statement() %}\n {{ return(adapter.dispatch('support_multiple_grantees_per_dcl_statement', 'dbt')()) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__support_multiple_grantees_per_dcl_statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.984707, "supported_languages": null}, "macro.dbt.default__support_multiple_grantees_per_dcl_statement": {"name": "default__support_multiple_grantees_per_dcl_statement", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__support_multiple_grantees_per_dcl_statement", "macro_sql": "\n\n{%- macro default__support_multiple_grantees_per_dcl_statement() -%}\n {{ return(True) }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.984921, "supported_languages": null}, "macro.dbt.should_revoke": {"name": "should_revoke", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.should_revoke", "macro_sql": "{% macro should_revoke(existing_relation, full_refresh_mode=True) %}\n\n {% if not existing_relation %}\n {#-- The table doesn't already exist, so no grants to copy over --#}\n {{ return(False) }}\n {% elif full_refresh_mode %}\n {#-- The object is being REPLACED -- whether grants are copied over depends on the value of user config --#}\n {{ return(copy_grants()) }}\n {% else %}\n {#-- The table is being merged/upserted/inserted -- grants will be carried over --#}\n {{ return(True) }}\n {% endif %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.copy_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.985611, "supported_languages": null}, "macro.dbt.get_show_grant_sql": {"name": "get_show_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.get_show_grant_sql", "macro_sql": "{% macro get_show_grant_sql(relation) %}\n {{ return(adapter.dispatch(\"get_show_grant_sql\", \"dbt\")(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_show_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.985974, "supported_languages": null}, "macro.dbt.default__get_show_grant_sql": {"name": "default__get_show_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__get_show_grant_sql", "macro_sql": "{% macro default__get_show_grant_sql(relation) %}\n show grants on {{ relation }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9861681, "supported_languages": null}, "macro.dbt.get_grant_sql": {"name": "get_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.get_grant_sql", "macro_sql": "{% macro get_grant_sql(relation, privilege, grantees) %}\n {{ return(adapter.dispatch('get_grant_sql', 'dbt')(relation, privilege, grantees)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_grant_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.986617, "supported_languages": null}, "macro.dbt.default__get_grant_sql": {"name": "default__get_grant_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__get_grant_sql", "macro_sql": "\n\n{%- macro default__get_grant_sql(relation, privilege, grantees) -%}\n grant {{ privilege }} on {{ relation }} to {{ grantees | join(', ') }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9869928, "supported_languages": null}, "macro.dbt.get_revoke_sql": {"name": "get_revoke_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.get_revoke_sql", "macro_sql": "{% macro get_revoke_sql(relation, privilege, grantees) %}\n {{ return(adapter.dispatch('get_revoke_sql', 'dbt')(relation, privilege, grantees)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_revoke_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9874449, "supported_languages": null}, "macro.dbt.default__get_revoke_sql": {"name": "default__get_revoke_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__get_revoke_sql", "macro_sql": "\n\n{%- macro default__get_revoke_sql(relation, privilege, grantees) -%}\n revoke {{ privilege }} on {{ relation }} from {{ grantees | join(', ') }}\n{%- endmacro -%}\n\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9878159, "supported_languages": null}, "macro.dbt.get_dcl_statement_list": {"name": "get_dcl_statement_list", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.get_dcl_statement_list", "macro_sql": "{% macro get_dcl_statement_list(relation, grant_config, get_dcl_macro) %}\n {{ return(adapter.dispatch('get_dcl_statement_list', 'dbt')(relation, grant_config, get_dcl_macro)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_dcl_statement_list"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.988359, "supported_languages": null}, "macro.dbt.default__get_dcl_statement_list": {"name": "default__get_dcl_statement_list", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__get_dcl_statement_list", "macro_sql": "\n\n{%- macro default__get_dcl_statement_list(relation, grant_config, get_dcl_macro) -%}\n {#\n -- Unpack grant_config into specific privileges and the set of users who need them granted/revoked.\n -- Depending on whether this database supports multiple grantees per statement, pass in the list of\n -- all grantees per privilege, or (if not) template one statement per privilege-grantee pair.\n -- `get_dcl_macro` will be either `get_grant_sql` or `get_revoke_sql`\n #}\n {%- set dcl_statements = [] -%}\n {%- for privilege, grantees in grant_config.items() %}\n {%- if support_multiple_grantees_per_dcl_statement() and grantees -%}\n {%- set dcl = get_dcl_macro(relation, privilege, grantees) -%}\n {%- do dcl_statements.append(dcl) -%}\n {%- else -%}\n {%- for grantee in grantees -%}\n {% set dcl = get_dcl_macro(relation, privilege, [grantee]) %}\n {%- do dcl_statements.append(dcl) -%}\n {% endfor -%}\n {%- endif -%}\n {%- endfor -%}\n {{ return(dcl_statements) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.support_multiple_grantees_per_dcl_statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.989743, "supported_languages": null}, "macro.dbt.call_dcl_statements": {"name": "call_dcl_statements", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.call_dcl_statements", "macro_sql": "{% macro call_dcl_statements(dcl_statement_list) %}\n {{ return(adapter.dispatch(\"call_dcl_statements\", \"dbt\")(dcl_statement_list)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__call_dcl_statements"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.990113, "supported_languages": null}, "macro.dbt.default__call_dcl_statements": {"name": "default__call_dcl_statements", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__call_dcl_statements", "macro_sql": "{% macro default__call_dcl_statements(dcl_statement_list) %}\n {#\n -- By default, supply all grant + revoke statements in a single semicolon-separated block,\n -- so that they're all processed together.\n\n -- Some databases do not support this. Those adapters will need to override this macro\n -- to run each statement individually.\n #}\n {% call statement('grants') %}\n {% for dcl_statement in dcl_statement_list %}\n {{ dcl_statement }};\n {% endfor %}\n {% endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.990597, "supported_languages": null}, "macro.dbt.apply_grants": {"name": "apply_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.apply_grants", "macro_sql": "{% macro apply_grants(relation, grant_config, should_revoke) %}\n {{ return(adapter.dispatch(\"apply_grants\", \"dbt\")(relation, grant_config, should_revoke)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__apply_grants"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.991051, "supported_languages": null}, "macro.dbt.default__apply_grants": {"name": "default__apply_grants", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/apply_grants.sql", "original_file_path": "macros/adapters/apply_grants.sql", "unique_id": "macro.dbt.default__apply_grants", "macro_sql": "{% macro default__apply_grants(relation, grant_config, should_revoke=True) %}\n {#-- If grant_config is {} or None, this is a no-op --#}\n {% if grant_config %}\n {% if should_revoke %}\n {#-- We think previous grants may have carried over --#}\n {#-- Show current grants and calculate diffs --#}\n {% set current_grants_table = run_query(get_show_grant_sql(relation)) %}\n {% set current_grants_dict = adapter.standardize_grants_dict(current_grants_table) %}\n {% set needs_granting = diff_of_two_dicts(grant_config, current_grants_dict) %}\n {% set needs_revoking = diff_of_two_dicts(current_grants_dict, grant_config) %}\n {% if not (needs_granting or needs_revoking) %}\n {{ log('On ' ~ relation ~': All grants are in place, no revocation or granting needed.')}}\n {% endif %}\n {% else %}\n {#-- We don't think there's any chance of previous grants having carried over. --#}\n {#-- Jump straight to granting what the user has configured. --#}\n {% set needs_revoking = {} %}\n {% set needs_granting = grant_config %}\n {% endif %}\n {% if needs_granting or needs_revoking %}\n {% set revoke_statement_list = get_dcl_statement_list(relation, needs_revoking, get_revoke_sql) %}\n {% set grant_statement_list = get_dcl_statement_list(relation, needs_granting, get_grant_sql) %}\n {% set dcl_statement_list = revoke_statement_list + grant_statement_list %}\n {% if dcl_statement_list %}\n {{ call_dcl_statements(dcl_statement_list) }}\n {% endif %}\n {% endif %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.get_show_grant_sql", "macro.dbt.get_dcl_statement_list", "macro.dbt.call_dcl_statements"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.993394, "supported_languages": null}, "macro.dbt.alter_column_comment": {"name": "alter_column_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.alter_column_comment", "macro_sql": "{% macro alter_column_comment(relation, column_dict) -%}\n {{ return(adapter.dispatch('alter_column_comment', 'dbt')(relation, column_dict)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.994474, "supported_languages": null}, "macro.dbt.default__alter_column_comment": {"name": "default__alter_column_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.default__alter_column_comment", "macro_sql": "{% macro default__alter_column_comment(relation, column_dict) -%}\n {{ exceptions.raise_not_implemented(\n 'alter_column_comment macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.994807, "supported_languages": null}, "macro.dbt.alter_relation_comment": {"name": "alter_relation_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.alter_relation_comment", "macro_sql": "{% macro alter_relation_comment(relation, relation_comment) -%}\n {{ return(adapter.dispatch('alter_relation_comment', 'dbt')(relation, relation_comment)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__alter_relation_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9952111, "supported_languages": null}, "macro.dbt.default__alter_relation_comment": {"name": "default__alter_relation_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.default__alter_relation_comment", "macro_sql": "{% macro default__alter_relation_comment(relation, relation_comment) -%}\n {{ exceptions.raise_not_implemented(\n 'alter_relation_comment macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.995542, "supported_languages": null}, "macro.dbt.persist_docs": {"name": "persist_docs", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.persist_docs", "macro_sql": "{% macro persist_docs(relation, model, for_relation=true, for_columns=true) -%}\n {{ return(adapter.dispatch('persist_docs', 'dbt')(relation, model, for_relation, for_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__persist_docs"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.9960809, "supported_languages": null}, "macro.dbt.default__persist_docs": {"name": "default__persist_docs", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/persist_docs.sql", "original_file_path": "macros/adapters/persist_docs.sql", "unique_id": "macro.dbt.default__persist_docs", "macro_sql": "{% macro default__persist_docs(relation, model, for_relation, for_columns) -%}\n {% if for_relation and config.persist_relation_docs() and model.description %}\n {% do run_query(alter_relation_comment(relation, model.description)) %}\n {% endif %}\n\n {% if for_columns and config.persist_column_docs() and model.columns %}\n {% do run_query(alter_column_comment(relation, model.columns)) %}\n {% endif %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query", "macro.dbt.alter_relation_comment", "macro.dbt.alter_column_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.99707, "supported_languages": null}, "macro.dbt.get_catalog": {"name": "get_catalog", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.get_catalog", "macro_sql": "{% macro get_catalog(information_schema, schemas) -%}\n {{ return(adapter.dispatch('get_catalog', 'dbt')(information_schema, schemas)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_catalog"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.99914, "supported_languages": null}, "macro.dbt.default__get_catalog": {"name": "default__get_catalog", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__get_catalog", "macro_sql": "{% macro default__get_catalog(information_schema, schemas) -%}\n\n {% set typename = adapter.type() %}\n {% set msg -%}\n get_catalog not implemented for {{ typename }}\n {%- endset %}\n\n {{ exceptions.raise_compiler_error(msg) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234114.999663, "supported_languages": null}, "macro.dbt.information_schema_name": {"name": "information_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.information_schema_name", "macro_sql": "{% macro information_schema_name(database) %}\n {{ return(adapter.dispatch('information_schema_name', 'dbt')(database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__information_schema_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0000231, "supported_languages": null}, "macro.dbt.default__information_schema_name": {"name": "default__information_schema_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__information_schema_name", "macro_sql": "{% macro default__information_schema_name(database) -%}\n {%- if database -%}\n {{ database }}.INFORMATION_SCHEMA\n {%- else -%}\n INFORMATION_SCHEMA\n {%- endif -%}\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.000334, "supported_languages": null}, "macro.dbt.list_schemas": {"name": "list_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.list_schemas", "macro_sql": "{% macro list_schemas(database) -%}\n {{ return(adapter.dispatch('list_schemas', 'dbt')(database)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__list_schemas"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.000685, "supported_languages": null}, "macro.dbt.default__list_schemas": {"name": "default__list_schemas", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__list_schemas", "macro_sql": "{% macro default__list_schemas(database) -%}\n {% set sql %}\n select distinct schema_name\n from {{ information_schema_name(database) }}.SCHEMATA\n where catalog_name ilike '{{ database }}'\n {% endset %}\n {{ return(run_query(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.information_schema_name", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.001179, "supported_languages": null}, "macro.dbt.check_schema_exists": {"name": "check_schema_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.check_schema_exists", "macro_sql": "{% macro check_schema_exists(information_schema, schema) -%}\n {{ return(adapter.dispatch('check_schema_exists', 'dbt')(information_schema, schema)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__check_schema_exists"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0015821, "supported_languages": null}, "macro.dbt.default__check_schema_exists": {"name": "default__check_schema_exists", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__check_schema_exists", "macro_sql": "{% macro default__check_schema_exists(information_schema, schema) -%}\n {% set sql -%}\n select count(*)\n from {{ information_schema.replace(information_schema_view='SCHEMATA') }}\n where catalog_name='{{ information_schema.database }}'\n and schema_name='{{ schema }}'\n {%- endset %}\n {{ return(run_query(sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.replace", "macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0021791, "supported_languages": null}, "macro.dbt.list_relations_without_caching": {"name": "list_relations_without_caching", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.list_relations_without_caching", "macro_sql": "{% macro list_relations_without_caching(schema_relation) %}\n {{ return(adapter.dispatch('list_relations_without_caching', 'dbt')(schema_relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__list_relations_without_caching"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0025358, "supported_languages": null}, "macro.dbt.default__list_relations_without_caching": {"name": "default__list_relations_without_caching", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/metadata.sql", "original_file_path": "macros/adapters/metadata.sql", "unique_id": "macro.dbt.default__list_relations_without_caching", "macro_sql": "{% macro default__list_relations_without_caching(schema_relation) %}\n {{ exceptions.raise_not_implemented(\n 'list_relations_without_caching macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.002848, "supported_languages": null}, "macro.dbt.drop_relation": {"name": "drop_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/drop_relation.sql", "original_file_path": "macros/adapters/drop_relation.sql", "unique_id": "macro.dbt.drop_relation", "macro_sql": "{% macro drop_relation(relation) -%}\n {{ return(adapter.dispatch('drop_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__drop_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.004204, "supported_languages": null}, "macro.dbt.default__drop_relation": {"name": "default__drop_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/drop_relation.sql", "original_file_path": "macros/adapters/drop_relation.sql", "unique_id": "macro.dbt.default__drop_relation", "macro_sql": "{% macro default__drop_relation(relation) -%}\n {% call statement('drop_relation', auto_begin=False) -%}\n {%- if relation.is_table -%}\n {{- drop_table(relation) -}}\n {%- elif relation.is_view -%}\n {{- drop_view(relation) -}}\n {%- elif relation.is_materialized_view -%}\n {{- drop_materialized_view(relation) -}}\n {%- else -%}\n drop {{ relation.type }} if exists {{ relation }} cascade\n {%- endif -%}\n {%- endcall %}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.drop_table", "macro.dbt.drop_view", "macro.dbt.drop_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.005216, "supported_languages": null}, "macro.dbt.drop_table": {"name": "drop_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/drop_relation.sql", "original_file_path": "macros/adapters/drop_relation.sql", "unique_id": "macro.dbt.drop_table", "macro_sql": "{% macro drop_table(relation) -%}\n {{ return(adapter.dispatch('drop_table', 'dbt')(relation)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__drop_table"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.005569, "supported_languages": null}, "macro.dbt.default__drop_table": {"name": "default__drop_table", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/drop_relation.sql", "original_file_path": "macros/adapters/drop_relation.sql", "unique_id": "macro.dbt.default__drop_table", "macro_sql": "{% macro default__drop_table(relation) -%}\n drop table if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0057678, "supported_languages": null}, "macro.dbt.drop_view": {"name": "drop_view", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/drop_relation.sql", "original_file_path": "macros/adapters/drop_relation.sql", "unique_id": "macro.dbt.drop_view", "macro_sql": "{% macro drop_view(relation) -%}\n {{ return(adapter.dispatch('drop_view', 'dbt')(relation)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__drop_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.006111, "supported_languages": null}, "macro.dbt.default__drop_view": {"name": "default__drop_view", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/drop_relation.sql", "original_file_path": "macros/adapters/drop_relation.sql", "unique_id": "macro.dbt.default__drop_view", "macro_sql": "{% macro default__drop_view(relation) -%}\n drop view if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.006306, "supported_languages": null}, "macro.dbt.drop_materialized_view": {"name": "drop_materialized_view", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/drop_relation.sql", "original_file_path": "macros/adapters/drop_relation.sql", "unique_id": "macro.dbt.drop_materialized_view", "macro_sql": "{% macro drop_materialized_view(relation) -%}\n {{ return(adapter.dispatch('drop_materialized_view', 'dbt')(relation)) }}\n{%- endmacro %}", "depends_on": {"macros": ["macro.dbt.default__drop_materialized_view"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0066502, "supported_languages": null}, "macro.dbt.default__drop_materialized_view": {"name": "default__drop_materialized_view", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/drop_relation.sql", "original_file_path": "macros/adapters/drop_relation.sql", "unique_id": "macro.dbt.default__drop_materialized_view", "macro_sql": "{% macro default__drop_materialized_view(relation) -%}\n drop materialized view if exists {{ relation }} cascade\n{%- endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.006847, "supported_languages": null}, "macro.dbt.get_columns_in_relation": {"name": "get_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_columns_in_relation", "macro_sql": "{% macro get_columns_in_relation(relation) -%}\n {{ return(adapter.dispatch('get_columns_in_relation', 'dbt')(relation)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt_postgres.postgres__get_columns_in_relation"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0099368, "supported_languages": null}, "macro.dbt.default__get_columns_in_relation": {"name": "default__get_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__get_columns_in_relation", "macro_sql": "{% macro default__get_columns_in_relation(relation) -%}\n {{ exceptions.raise_not_implemented(\n 'get_columns_in_relation macro not implemented for adapter '+adapter.type()) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.010253, "supported_languages": null}, "macro.dbt.sql_convert_columns_in_relation": {"name": "sql_convert_columns_in_relation", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.sql_convert_columns_in_relation", "macro_sql": "{% macro sql_convert_columns_in_relation(table) -%}\n {% set columns = [] %}\n {% for row in table %}\n {% do columns.append(api.Column(*row)) %}\n {% endfor %}\n {{ return(columns) }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.010874, "supported_languages": null}, "macro.dbt.get_empty_subquery_sql": {"name": "get_empty_subquery_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_empty_subquery_sql", "macro_sql": "{% macro get_empty_subquery_sql(select_sql, select_sql_header=none) -%}\n {{ return(adapter.dispatch('get_empty_subquery_sql', 'dbt')(select_sql, select_sql_header)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.011298, "supported_languages": null}, "macro.dbt.default__get_empty_subquery_sql": {"name": "default__get_empty_subquery_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__get_empty_subquery_sql", "macro_sql": "{% macro default__get_empty_subquery_sql(select_sql, select_sql_header=none) %}\n {%- if select_sql_header is not none -%}\n {{ select_sql_header }}\n {%- endif -%}\n select * from (\n {{ select_sql }}\n ) as __dbt_sbq\n where false\n limit 0\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.011698, "supported_languages": null}, "macro.dbt.get_empty_schema_sql": {"name": "get_empty_schema_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_empty_schema_sql", "macro_sql": "{% macro get_empty_schema_sql(columns) -%}\n {{ return(adapter.dispatch('get_empty_schema_sql', 'dbt')(columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_empty_schema_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.012053, "supported_languages": null}, "macro.dbt.default__get_empty_schema_sql": {"name": "default__get_empty_schema_sql", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__get_empty_schema_sql", "macro_sql": "{% macro default__get_empty_schema_sql(columns) %}\n {%- set col_err = [] -%}\n select\n {% for i in columns %}\n {%- set col = columns[i] -%}\n {%- if col['data_type'] is not defined -%}\n {{ col_err.append(col['name']) }}\n {%- endif -%}\n cast(null as {{ col['data_type'] }}) as {{ col['name'] }}{{ \", \" if not loop.last }}\n {%- endfor -%}\n {%- if (col_err | length) > 0 -%}\n {{ exceptions.column_type_missing(column_names=col_err) }}\n {%- endif -%}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.013323, "supported_languages": null}, "macro.dbt.get_column_schema_from_query": {"name": "get_column_schema_from_query", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_column_schema_from_query", "macro_sql": "{% macro get_column_schema_from_query(select_sql, select_sql_header=none) -%}\n {% set columns = [] %}\n {# -- Using an 'empty subquery' here to get the same schema as the given select_sql statement, without necessitating a data scan.#}\n {% set sql = get_empty_subquery_sql(select_sql, select_sql_header) %}\n {% set column_schema = adapter.get_column_schema_from_query(sql) %}\n {{ return(column_schema) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.014003, "supported_languages": null}, "macro.dbt.get_columns_in_query": {"name": "get_columns_in_query", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.get_columns_in_query", "macro_sql": "{% macro get_columns_in_query(select_sql) -%}\n {{ return(adapter.dispatch('get_columns_in_query', 'dbt')(select_sql)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__get_columns_in_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.01436, "supported_languages": null}, "macro.dbt.default__get_columns_in_query": {"name": "default__get_columns_in_query", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__get_columns_in_query", "macro_sql": "{% macro default__get_columns_in_query(select_sql) %}\n {% call statement('get_columns_in_query', fetch_result=True, auto_begin=False) -%}\n {{ get_empty_subquery_sql(select_sql) }}\n {% endcall %}\n {{ return(load_result('get_columns_in_query').table.columns | map(attribute='name') | list) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement", "macro.dbt.get_empty_subquery_sql"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.015053, "supported_languages": null}, "macro.dbt.alter_column_type": {"name": "alter_column_type", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.alter_column_type", "macro_sql": "{% macro alter_column_type(relation, column_name, new_column_type) -%}\n {{ return(adapter.dispatch('alter_column_type', 'dbt')(relation, column_name, new_column_type)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__alter_column_type"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.015502, "supported_languages": null}, "macro.dbt.default__alter_column_type": {"name": "default__alter_column_type", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__alter_column_type", "macro_sql": "{% macro default__alter_column_type(relation, column_name, new_column_type) -%}\n {#\n 1. Create a new column (w/ temp name and correct type)\n 2. Copy data over to it\n 3. Drop the existing column (cascade!)\n 4. Rename the new column to existing column\n #}\n {%- set tmp_column = column_name + \"__dbt_alter\" -%}\n\n {% call statement('alter_column_type') %}\n alter table {{ relation }} add column {{ adapter.quote(tmp_column) }} {{ new_column_type }};\n update {{ relation }} set {{ adapter.quote(tmp_column) }} = {{ adapter.quote(column_name) }};\n alter table {{ relation }} drop column {{ adapter.quote(column_name) }} cascade;\n alter table {{ relation }} rename column {{ adapter.quote(tmp_column) }} to {{ adapter.quote(column_name) }}\n {% endcall %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.statement"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.016713, "supported_languages": null}, "macro.dbt.alter_relation_add_remove_columns": {"name": "alter_relation_add_remove_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.alter_relation_add_remove_columns", "macro_sql": "{% macro alter_relation_add_remove_columns(relation, add_columns = none, remove_columns = none) -%}\n {{ return(adapter.dispatch('alter_relation_add_remove_columns', 'dbt')(relation, add_columns, remove_columns)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__alter_relation_add_remove_columns"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.017217, "supported_languages": null}, "macro.dbt.default__alter_relation_add_remove_columns": {"name": "default__alter_relation_add_remove_columns", "resource_type": "macro", "package_name": "dbt", "path": "macros/adapters/columns.sql", "original_file_path": "macros/adapters/columns.sql", "unique_id": "macro.dbt.default__alter_relation_add_remove_columns", "macro_sql": "{% macro default__alter_relation_add_remove_columns(relation, add_columns, remove_columns) %}\n\n {% if add_columns is none %}\n {% set add_columns = [] %}\n {% endif %}\n {% if remove_columns is none %}\n {% set remove_columns = [] %}\n {% endif %}\n\n {% set sql -%}\n\n alter {{ relation.type }} {{ relation }}\n\n {% for column in add_columns %}\n add column {{ column.name }} {{ column.data_type }}{{ ',' if not loop.last }}\n {% endfor %}{{ ',' if add_columns and remove_columns }}\n\n {% for column in remove_columns %}\n drop column {{ column.name }}{{ ',' if not loop.last }}\n {% endfor %}\n\n {%- endset -%}\n\n {% do run_query(sql) %}\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.run_query"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.018904, "supported_languages": null}, "macro.dbt.resolve_model_name": {"name": "resolve_model_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.resolve_model_name", "macro_sql": "{% macro resolve_model_name(input_model_name) %}\n {{ return(adapter.dispatch('resolve_model_name', 'dbt')(input_model_name)) }}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.default__resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0211682, "supported_languages": null}, "macro.dbt.default__resolve_model_name": {"name": "default__resolve_model_name", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.default__resolve_model_name", "macro_sql": "\n\n{%- macro default__resolve_model_name(input_model_name) -%}\n {{ input_model_name | string | replace('\"', '\\\"') }}\n{%- endmacro -%}\n\n", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0214772, "supported_languages": null}, "macro.dbt.build_ref_function": {"name": "build_ref_function", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.build_ref_function", "macro_sql": "{% macro build_ref_function(model) %}\n\n {%- set ref_dict = {} -%}\n {%- for _ref in model.refs -%}\n {% set _ref_args = [_ref.get('package'), _ref['name']] if _ref.get('package') else [_ref['name'],] %}\n {%- set resolved = ref(*_ref_args, v=_ref.get('version')) -%}\n {%- if _ref.get('version') -%}\n {% do _ref_args.extend([\"v\" ~ _ref['version']]) %}\n {%- endif -%}\n {%- do ref_dict.update({_ref_args | join('.'): resolve_model_name(resolved)}) -%}\n {%- endfor -%}\n\ndef ref(*args, **kwargs):\n refs = {{ ref_dict | tojson }}\n key = '.'.join(args)\n version = kwargs.get(\"v\") or kwargs.get(\"version\")\n if version:\n key += f\".v{version}\"\n dbt_load_df_function = kwargs.get(\"dbt_load_df_function\")\n return dbt_load_df_function(refs[key])\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.023145, "supported_languages": null}, "macro.dbt.build_source_function": {"name": "build_source_function", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.build_source_function", "macro_sql": "{% macro build_source_function(model) %}\n\n {%- set source_dict = {} -%}\n {%- for _source in model.sources -%}\n {%- set resolved = source(*_source) -%}\n {%- do source_dict.update({_source | join('.'): resolve_model_name(resolved)}) -%}\n {%- endfor -%}\n\ndef source(*args, dbt_load_df_function):\n sources = {{ source_dict | tojson }}\n key = '.'.join(args)\n return dbt_load_df_function(sources[key])\n\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.resolve_model_name"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.023981, "supported_languages": null}, "macro.dbt.build_config_dict": {"name": "build_config_dict", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.build_config_dict", "macro_sql": "{% macro build_config_dict(model) %}\n {%- set config_dict = {} -%}\n {% set config_dbt_used = zip(model.config.config_keys_used, model.config.config_keys_defaults) | list %}\n {%- for key, default in config_dbt_used -%}\n {# weird type testing with enum, would be much easier to write this logic in Python! #}\n {%- if key == \"language\" -%}\n {%- set value = \"python\" -%}\n {%- endif -%}\n {%- set value = model.config.get(key, default) -%}\n {%- do config_dict.update({key: value}) -%}\n {%- endfor -%}\nconfig_dict = {{ config_dict }}\n{% endmacro %}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.025177, "supported_languages": null}, "macro.dbt.py_script_postfix": {"name": "py_script_postfix", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.py_script_postfix", "macro_sql": "{% macro py_script_postfix(model) %}\n# This part is user provided model code\n# you will need to copy the next section to run the code\n# COMMAND ----------\n# this part is dbt logic for get ref work, do not modify\n\n{{ build_ref_function(model ) }}\n{{ build_source_function(model ) }}\n{{ build_config_dict(model) }}\n\nclass config:\n def __init__(self, *args, **kwargs):\n pass\n\n @staticmethod\n def get(key, default=None):\n return config_dict.get(key, default)\n\nclass this:\n \"\"\"dbt.this() or dbt.this.identifier\"\"\"\n database = \"{{ this.database }}\"\n schema = \"{{ this.schema }}\"\n identifier = \"{{ this.identifier }}\"\n {% set this_relation_name = resolve_model_name(this) %}\n def __repr__(self):\n return '{{ this_relation_name }}'\n\n\nclass dbtObj:\n def __init__(self, load_df_function) -> None:\n self.source = lambda *args: source(*args, dbt_load_df_function=load_df_function)\n self.ref = lambda *args, **kwargs: ref(*args, **kwargs, dbt_load_df_function=load_df_function)\n self.config = config\n self.this = this()\n self.is_incremental = {{ is_incremental() }}\n\n# COMMAND ----------\n{{py_script_comment()}}\n{% endmacro %}", "depends_on": {"macros": ["macro.dbt.build_ref_function", "macro.dbt.build_source_function", "macro.dbt.build_config_dict", "macro.dbt.resolve_model_name", "macro.dbt.is_incremental", "macro.dbt.py_script_comment"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0260968, "supported_languages": null}, "macro.dbt.py_script_comment": {"name": "py_script_comment", "resource_type": "macro", "package_name": "dbt", "path": "macros/python_model/python.sql", "original_file_path": "macros/python_model/python.sql", "unique_id": "macro.dbt.py_script_comment", "macro_sql": "{%macro py_script_comment()%}\n{%endmacro%}", "depends_on": {"macros": []}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0262358, "supported_languages": null}, "macro.dbt.test_unique": {"name": "test_unique", "resource_type": "macro", "package_name": "dbt", "path": "tests/generic/builtin.sql", "original_file_path": "tests/generic/builtin.sql", "unique_id": "macro.dbt.test_unique", "macro_sql": "{% test unique(model, column_name) %}\n {% set macro = adapter.dispatch('test_unique', 'dbt') %}\n {{ macro(model, column_name) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_unique"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0271208, "supported_languages": null}, "macro.dbt.test_not_null": {"name": "test_not_null", "resource_type": "macro", "package_name": "dbt", "path": "tests/generic/builtin.sql", "original_file_path": "tests/generic/builtin.sql", "unique_id": "macro.dbt.test_not_null", "macro_sql": "{% test not_null(model, column_name) %}\n {% set macro = adapter.dispatch('test_not_null', 'dbt') %}\n {{ macro(model, column_name) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_not_null"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.027589, "supported_languages": null}, "macro.dbt.test_accepted_values": {"name": "test_accepted_values", "resource_type": "macro", "package_name": "dbt", "path": "tests/generic/builtin.sql", "original_file_path": "tests/generic/builtin.sql", "unique_id": "macro.dbt.test_accepted_values", "macro_sql": "{% test accepted_values(model, column_name, values, quote=True) %}\n {% set macro = adapter.dispatch('test_accepted_values', 'dbt') %}\n {{ macro(model, column_name, values, quote) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_accepted_values"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.028165, "supported_languages": null}, "macro.dbt.test_relationships": {"name": "test_relationships", "resource_type": "macro", "package_name": "dbt", "path": "tests/generic/builtin.sql", "original_file_path": "tests/generic/builtin.sql", "unique_id": "macro.dbt.test_relationships", "macro_sql": "{% test relationships(model, column_name, to, field) %}\n {% set macro = adapter.dispatch('test_relationships', 'dbt') %}\n {{ macro(model, column_name, to, field) }}\n{% endtest %}", "depends_on": {"macros": ["macro.dbt.default__test_relationships"]}, "description": "", "meta": {}, "docs": {"show": true, "node_color": null}, "patch_path": null, "arguments": [], "created_at": 1686234115.0287201, "supported_languages": null}}, "docs": {"doc.test.somedoc": {"name": "somedoc", "resource_type": "doc", "package_name": "test", "path": "somedoc.md", "original_file_path": "models/somedoc.md", "unique_id": "doc.test.somedoc", "block_contents": "Testing, testing"}, "doc.dbt.__overview__": {"name": "__overview__", "resource_type": "doc", "package_name": "dbt", "path": "overview.md", "original_file_path": "docs/overview.md", "unique_id": "doc.dbt.__overview__", "block_contents": "### Welcome!\n\nWelcome to the auto-generated documentation for your dbt project!\n\n### Navigation\n\nYou can use the `Project` and `Database` navigation tabs on the left side of the window to explore the models\nin your project.\n\n#### Project Tab\nThe `Project` tab mirrors the directory structure of your dbt project. In this tab, you can see all of the\nmodels defined in your dbt project, as well as models imported from dbt packages.\n\n#### Database Tab\nThe `Database` tab also exposes your models, but in a format that looks more like a database explorer. This view\nshows relations (tables and views) grouped into database schemas. Note that ephemeral models are _not_ shown\nin this interface, as they do not exist in the database.\n\n### Graph Exploration\nYou can click the blue icon on the bottom-right corner of the page to view the lineage graph of your models.\n\nOn model pages, you'll see the immediate parents and children of the model you're exploring. By clicking the `Expand`\nbutton at the top-right of this lineage pane, you'll be able to see all of the models that are used to build,\nor are built from, the model you're exploring.\n\nOnce expanded, you'll be able to use the `--select` and `--exclude` model selection syntax to filter the\nmodels in the graph. For more information on model selection, check out the [dbt docs](https://docs.getdbt.com/docs/model-selection-syntax).\n\nNote that you can also right-click on models to interactively filter and explore the graph.\n\n---\n\n### More information\n\n- [What is dbt](https://docs.getdbt.com/docs/introduction)?\n- Read the [dbt viewpoint](https://docs.getdbt.com/docs/viewpoint)\n- [Installation](https://docs.getdbt.com/docs/installation)\n- Join the [dbt Community](https://www.getdbt.com/community/) for questions and discussion"}}, "exposures": {"exposure.test.simple_exposure": {"name": "simple_exposure", "resource_type": "exposure", "package_name": "test", "path": "schema.yml", "original_file_path": "models/schema.yml", "unique_id": "exposure.test.simple_exposure", "fqn": ["test", "simple_exposure"], "type": "dashboard", "owner": {"email": "something@example.com", "name": null}, "description": "", "label": null, "maturity": null, "meta": {}, "tags": [], "config": {"enabled": true}, "unrendered_config": {}, "url": null, "depends_on": {"macros": [], "nodes": ["source.test.my_source.my_table", "model.test.my_model"], "public_nodes": []}, "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [["my_source", "my_table"]], "metrics": [], "created_at": 1686234115.440831}}, "metrics": {"metric.test.my_metric": {"name": "my_metric", "resource_type": "metric", "package_name": "test", "path": "schema.yml", "original_file_path": "models/schema.yml", "unique_id": "metric.test.my_metric", "fqn": ["test", "my_metric"], "description": "", "label": "Count records", "type": "simple", "type_params": {"measure": {"name": "customers", "filter": null, "alias": null}, "measures": [], "numerator": null, "denominator": null, "expr": null, "window": null, "grain_to_date": null, "metrics": []}, "filter": null, "metadata": null, "meta": {}, "tags": [], "config": {"enabled": true, "group": null}, "unrendered_config": {}, "sources": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "refs": [], "metrics": [], "created_at": 1686234115.48299, "group": null}}, "groups": {}, "selectors": {}, "disabled": {"model.test.disabled_model": [{"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state", "name": "disabled_model", "resource_type": "model", "package_name": "test", "path": "disabled_model.sql", "original_file_path": "models/disabled_model.sql", "unique_id": "model.test.disabled_model", "fqn": ["test", "disabled_model"], "alias": "disabled_model", "checksum": {"name": "sha256", "checksum": "597106d23ce34e3cd2430588e5c1cf474ebdd138fc47e09b925a4ab258a27acc"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "view", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1686234115.301064, "config_call_dict": {"enabled": false}, "relation_name": "\"dbt\".\"test16862341144970300705_test_previous_version_state\".\"disabled_model\"", "raw_code": "{{ config(enabled=False) }}\nselect 2 as id", "language": "sql", "refs": [], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "access": "protected", "constraints": [], "version": null, "latest_version": null, "deprecation_date": null, "state_relation": null}], "snapshot.test.disabled_snapshot_seed": [{"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state", "name": "disabled_snapshot_seed", "resource_type": "snapshot", "package_name": "test", "path": "disabled_snapshot_seed.sql", "original_file_path": "snapshots/disabled_snapshot_seed.sql", "unique_id": "snapshot.test.disabled_snapshot_seed", "fqn": ["test", "disabled_snapshot_seed", "disabled_snapshot_seed"], "alias": "disabled_snapshot_seed", "checksum": {"name": "sha256", "checksum": "fe76c9dd437341c9e82a0f2a8baf3148f961b768eaa0a4410cd27d3c071bd617"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "snapshot", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": "id", "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "strategy": "check", "target_schema": "test16862341144970300705_test_previous_version_state", "target_database": null, "updated_at": null, "check_cols": "all", "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"unique_key": "id", "strategy": "check", "check_cols": "all", "target_schema": "test16862341144970300705_test_previous_version_state", "enabled": false}, "created_at": 1686234115.3148642, "config_call_dict": {"unique_key": "id", "strategy": "check", "check_cols": "all", "target_schema": "test16862341144970300705_test_previous_version_state", "enabled": false}, "relation_name": "\"dbt\".\"test16862341144970300705_test_previous_version_state\".\"disabled_snapshot_seed\"", "raw_code": "\n{{\n config(\n unique_key='id',\n strategy='check',\n check_cols='all',\n target_schema=schema,\n enabled=False,\n )\n}}\nselect * from {{ ref('my_seed') }}\n", "language": "sql", "refs": [{"name": "my_seed", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "state_relation": null}], "analysis.test.disabled_al": [{"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state", "name": "disabled_al", "resource_type": "analysis", "package_name": "test", "path": "analysis/disabled_al.sql", "original_file_path": "analyses/disabled_al.sql", "unique_id": "analysis.test.disabled_al", "fqn": ["test", "analysis", "disabled_al"], "alias": "disabled_al", "checksum": {"name": "sha256", "checksum": "32d36ad6cff0786eb562440ba60ef6c9b9a7f4c282dfb7a52eaf19d36370f0e1"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "view", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1686234115.325257, "config_call_dict": {"enabled": false}, "relation_name": null, "raw_code": "{{ config(enabled=False) }}\nselect 9 as id", "language": "sql", "refs": [], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}], "test.test.disabled_just_my": [{"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state_dbt_test__audit", "name": "disabled_just_my", "resource_type": "test", "package_name": "test", "path": "disabled_just_my.sql", "original_file_path": "tests/disabled_just_my.sql", "unique_id": "test.test.disabled_just_my", "fqn": ["test", "disabled_just_my"], "alias": "disabled_just_my", "checksum": {"name": "sha256", "checksum": "4f2268fd89a3b4ef899264ada6d7aa33603671cbc5d5acead7dc2eadf1add985"}, "config": {"enabled": false, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1686234115.37972, "config_call_dict": {"enabled": false}, "relation_name": null, "raw_code": "{{ config(enabled=False) }}\n\nselect * from {{ ref('my_model') }}\nwhere false", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}}], "test.test.disabled_check_nothing_my_model_.f2c6a72d37": [{"test_metadata": {"name": "disabled_check_nothing", "kwargs": {"model": "{{ get_where_subquery(ref('my_model')) }}"}, "namespace": null}, "database": "dbt", "schema": "test16862341144970300705_test_previous_version_state_dbt_test__audit", "name": "disabled_check_nothing_my_model_", "resource_type": "test", "package_name": "test", "path": "disabled_check_nothing_my_model_.sql", "original_file_path": "models/schema.yml", "unique_id": "test.test.disabled_check_nothing_my_model_.f2c6a72d37", "fqn": ["test", "disabled_check_nothing_my_model_"], "alias": "disabled_check_nothing_my_model_", "checksum": {"name": "none", "checksum": ""}, "config": {"enabled": false, "alias": null, "schema": "dbt_test__audit", "database": null, "tags": [], "meta": {}, "group": null, "materialized": "test", "severity": "ERROR", "store_failures": null, "where": null, "limit": null, "fail_calc": "count(*)", "warn_if": "!= 0", "error_if": "!= 0"}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": null, "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1686234115.4339762, "config_call_dict": {"enabled": false}, "relation_name": null, "raw_code": "{{ test_disabled_check_nothing(**_dbt_generic_test_kwargs) }}", "language": "sql", "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "depends_on": {"macros": ["macro.test.test_disabled_check_nothing", "macro.dbt.get_where_subquery"], "nodes": [], "public_nodes": []}, "compiled_path": null, "contract": {"enforced": false, "checksum": null}, "column_name": null, "file_key_name": "models.my_model", "attached_node": "model.test.my_model"}], "exposure.test.disabled_exposure": [{"name": "disabled_exposure", "resource_type": "exposure", "package_name": "test", "path": "schema.yml", "original_file_path": "models/schema.yml", "unique_id": "exposure.test.disabled_exposure", "fqn": ["test", "disabled_exposure"], "type": "dashboard", "owner": {"email": "something@example.com", "name": null}, "description": "", "label": null, "maturity": null, "meta": {}, "tags": [], "config": {"enabled": false}, "unrendered_config": {"enabled": false}, "url": null, "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "refs": [{"name": "my_model", "package": null, "version": null}], "sources": [], "metrics": [], "created_at": 1686234115.442136}], "metric.test.disabled_metric": [{"name": "disabled_metric", "resource_type": "metric", "package_name": "test", "path": "schema.yml", "original_file_path": "models/schema.yml", "unique_id": "metric.test.disabled_metric", "fqn": ["test", "disabled_metric"], "description": "", "label": "Count records", "type": "simple", "type_params": {"measure": {"name": "customers", "filter": null, "alias": null}, "measures": [], "numerator": null, "denominator": null, "expr": null, "window": null, "grain_to_date": null, "metrics": []}, "filter": null, "metadata": null, "meta": {}, "tags": [], "config": {"enabled": false, "group": null}, "unrendered_config": {"enabled": false}, "sources": [], "depends_on": {"macros": [], "nodes": [], "public_nodes": []}, "refs": [], "metrics": [], "created_at": 1686234115.4838452, "group": null}], "seed.test.disabled_seed": [{"database": "dbt", "schema": "test16862341144970300705_test_previous_version_state", "name": "disabled_seed", "resource_type": "seed", "package_name": "test", "path": "disabled_seed.csv", "original_file_path": "seeds/disabled_seed.csv", "unique_id": "seed.test.disabled_seed", "fqn": ["test", "disabled_seed"], "alias": "disabled_seed", "checksum": {"name": "sha256", "checksum": "31fddd8ec40c6aba6a3a8e7d83fedea2fd0a56c47b64ea3df1847ec1b018e2d1"}, "config": {"enabled": false, "alias": null, "schema": null, "database": null, "tags": [], "meta": {}, "group": null, "materialized": "seed", "incremental_strategy": null, "persist_docs": {}, "quoting": {}, "column_types": {}, "full_refresh": null, "unique_key": null, "on_schema_change": "ignore", "on_configuration_change": "apply", "grants": {}, "packages": [], "docs": {"show": true, "node_color": null}, "contract": {"enforced": false}, "quote_columns": null, "post-hook": [], "pre-hook": []}, "tags": [], "description": "", "columns": {}, "meta": {}, "group": null, "docs": {"show": true, "node_color": null}, "patch_path": "test://models/schema.yml", "build_path": null, "deferred": false, "unrendered_config": {"enabled": false}, "created_at": 1686234115.4391758, "config_call_dict": {}, "relation_name": "\"dbt\".\"test16862341144970300705_test_previous_version_state\".\"disabled_seed\"", "raw_code": "", "root_path": "/private/var/folders/79/5290gpvn3lx5jdryk4844rm80000gn/T/pytest-of-quigleymalcolm/pytest-52/popen-gw0/project8", "depends_on": {"macros": []}, "state_relation": null}], "source.test.my_source.disabled_table": [{"database": "dbt", "schema": "my_source", "name": "disabled_table", "resource_type": "source", "package_name": "test", "path": "models/schema.yml", "original_file_path": "models/schema.yml", "unique_id": "source.test.my_source.disabled_table", "fqn": ["test", "my_source", "disabled_table"], "source_name": "my_source", "source_description": "My source", "loader": "a_loader", "identifier": "disabled_table", "quoting": {"database": null, "schema": null, "identifier": null, "column": null}, "loaded_at_field": null, "freshness": {"warn_after": {"count": null, "period": null}, "error_after": {"count": null, "period": null}, "filter": null}, "external": null, "description": "Disabled table", "columns": {}, "meta": {}, "source_meta": {}, "tags": [], "config": {"enabled": false}, "patch_path": null, "unrendered_config": {"enabled": false}, "relation_name": "\"dbt\".\"my_source\".\"disabled_table\"", "created_at": 1686234115.485694}]}, "parent_map": {"model.test.my_model": [], "snapshot.test.snapshot_seed": ["seed.test.my_seed"], "analysis.test.a": [], "test.test.just_my": ["model.test.my_model"], "seed.test.my_seed": [], "test.test.not_null_my_model_id.43e0e9183a": ["model.test.my_model"], "test.test.check_nothing_my_model_.d5a5e66110": ["model.test.my_model"], "source.test.my_source.my_table": [], "exposure.test.simple_exposure": ["model.test.my_model", "source.test.my_source.my_table"], "metric.test.my_metric": []}, "child_map": {"model.test.my_model": ["exposure.test.simple_exposure", "test.test.check_nothing_my_model_.d5a5e66110", "test.test.just_my", "test.test.not_null_my_model_id.43e0e9183a"], "snapshot.test.snapshot_seed": [], "analysis.test.a": [], "test.test.just_my": [], "seed.test.my_seed": ["snapshot.test.snapshot_seed"], "test.test.not_null_my_model_id.43e0e9183a": [], "test.test.check_nothing_my_model_.d5a5e66110": [], "source.test.my_source.my_table": ["exposure.test.simple_exposure"], "exposure.test.simple_exposure": [], "metric.test.my_metric": []}, "group_map": {}, "public_nodes": {}, "semantic_nodes": {}} diff --git a/tests/functional/artifacts/test_previous_version_state.py b/tests/functional/artifacts/test_previous_version_state.py index f4cc773e233..401ff2b4dc1 100644 --- a/tests/functional/artifacts/test_previous_version_state.py +++ b/tests/functional/artifacts/test_previous_version_state.py @@ -130,21 +130,16 @@ metrics: - name: my_metric label: Count records - model: ref('my_model') - - type: count - sql: "*" - timestamp: updated_at - time_grains: [day] + type: simple + type_params: + measure: customers - name: disabled_metric label: Count records - model: ref('my_model') config: enabled: False - type: count - sql: "*" - timestamp: updated_at - time_grains: [day] + type: simple + type_params: + measure: customers sources: - name: my_source diff --git a/tests/functional/deprecations/test_deprecations.py b/tests/functional/deprecations/test_deprecations.py index 4b71e0df0e7..6c2678433b0 100644 --- a/tests/functional/deprecations/test_deprecations.py +++ b/tests/functional/deprecations/test_deprecations.py @@ -18,19 +18,6 @@ """ -metrics_old_metric_names__yml = """ -version: 2 -metrics: - - name: my_metric - label: My metric - model: ref('my_model') - - type: count - sql: "*" - timestamp: updated_at - time_grains: [day] -""" - bad_name_yaml = """ version: 2 @@ -150,32 +137,6 @@ def test_package_redirect_fail(self, project): assert expected_msg in exc_str -class TestMetricAttrRenameDeprecation: - @pytest.fixture(scope="class") - def models(self): - return { - "my_model.sql": models_trivial__model_sql, - "metrics.yml": metrics_old_metric_names__yml, - } - - def test_metric_handle_rename(self, project): - deprecations.reset_deprecations() - assert deprecations.active_deprecations == set() - run_dbt(["parse"]) - expected = {"metric-attr-renamed"} - assert expected == deprecations.active_deprecations - - def test_metric_handle_rename_fail(self, project): - deprecations.reset_deprecations() - assert deprecations.active_deprecations == set() - with pytest.raises(dbt.exceptions.CompilationError) as exc: - # turn off partial parsing to ensure that the metric is re-parsed - run_dbt(["--warn-error", "--no-partial-parse", "parse"]) - exc_str = " ".join(str(exc.value).split()) # flatten all whitespace - expected_msg = "renamed attributes for metrics" - assert expected_msg in exc_str - - class TestExposureNameDeprecation: @pytest.fixture(scope="class") def models(self): diff --git a/tests/functional/duplicates/test_duplicate_metric.py b/tests/functional/duplicates/test_duplicate_metric.py index f8beca39c24..3237f533658 100644 --- a/tests/functional/duplicates/test_duplicate_metric.py +++ b/tests/functional/duplicates/test_duplicate_metric.py @@ -12,30 +12,20 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: "people" meta: my_meta: 'testing' - name: number_of_people label: "Collective tenure" description: Total number of years of team experience - model: "ref('people')" - calculation_method: sum - expression: "*" - timestamp: created_at - time_grains: [day] - filters: - - field: loves_dbt - operator: 'is' - value: 'true' - + type: simple + type_params: + measure: + name: "years_tenure" + filter: "loves_dbt is true" """ diff --git a/tests/functional/exposures/fixtures.py b/tests/functional/exposures/fixtures.py index f02c5723f72..8b97c657aff 100644 --- a/tests/functional/exposures/fixtures.py +++ b/tests/functional/exposures/fixtures.py @@ -19,14 +19,10 @@ metrics: - name: metric - model: ref('model') label: "label" - - calculation_method: count_distinct - expression: id - - timestamp: first_order - time_grains: [day] + type: simple + type_params: + measure: "distinct_metrics" """ simple_exposure_yml = """ diff --git a/tests/functional/groups/test_access.py b/tests/functional/groups/test_access.py index 08cc4eb793e..fdffe4e1abd 100644 --- a/tests/functional/groups/test_access.py +++ b/tests/functional/groups/test_access.py @@ -127,14 +127,9 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('people_model')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: "people" meta: my_meta: 'testing' config: @@ -147,14 +142,9 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('people_model')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: "people" meta: my_meta: 'testing' config: @@ -243,9 +233,3 @@ def test_access_attribute(self, project): manifest = get_manifest(project.project_root) metric_id = "metric.test.number_of_people" assert manifest.metrics[metric_id].group == "analytics" - - # Change group of metric - write_file(v2_people_metric_yml, "models", "people_metric.yml") - # Should raise a reference error - with pytest.raises(DbtReferenceError): - run_dbt(["parse"]) diff --git a/tests/functional/metrics/fixtures.py b/tests/functional/metrics/fixtures.py index 8a03cb0d7fa..84b348a9ecd 100644 --- a/tests/functional/metrics/fixtures.py +++ b/tests/functional/metrics/fixtures.py @@ -30,45 +30,39 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' - name: collective_tenure label: "Collective tenure" description: Total number of years of team experience - model: "ref('people')" - calculation_method: sum - expression: tenure - timestamp: created_at - time_grains: [day, week, month] - filters: - - field: loves_dbt - operator: 'is' - value: 'true' + type: simple + type_params: + measure: + name: "years_tenure" + filter: "loves_dbt is true" - name: average_tenure label: "Average tenure" description: "The average tenure per person" - calculation_method: derived - expression: "{{metric('collective_tenure')}} / {{metric('number_of_people')}} " - timestamp: created_at - time_grains: [day, week, month] + type: ratio + type_params: + numerator: + name: years_tenure + denominator: + name: people - name: average_tenure_plus_one - label: "Average tenure" + label: "Average tenure, plus 1" description: "The average tenure per person" - calculation_method: derived - expression: "{{metric('average_tenure')}} + 1 " - timestamp: created_at - time_grains: [day, week, month] + type: derived + type_params: + metrics: + - average_tenure + expr: "average_tenure + 1" """ models_people_metrics_yml = """ @@ -79,45 +73,30 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' - name: collective_tenure label: "Collective tenure" description: Total number of years of team experience - model: "ref('people')" - calculation_method: sum - expression: tenure - timestamp: created_at - time_grains: [day] - filters: - - field: loves_dbt - operator: 'is' - value: 'true' + type: simple + type_params: + measure: + name: years_tenure + filter: "loves_dbt is true" - name: collective_window label: "Collective window" description: Testing window - model: "ref('people')" - calculation_method: sum - expression: tenure - timestamp: created_at - time_grains: [day] - window: - count: 14 - period: day - filters: - - field: loves_dbt - operator: 'is' - value: 'true' + type: simple + type_params: + measure: + name: years_tenure + filter: "loves_dbt is true" + window: 14 days """ @@ -212,14 +191,9 @@ - name: number of people label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' @@ -233,14 +207,9 @@ - name: number_of_people! label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' @@ -255,14 +224,9 @@ - name: 1_number_of_people label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' @@ -276,14 +240,9 @@ - name: this_name_is_going_to_contain_more_than_250_characters_but_be_otherwise_acceptable_and_then_will_throw_an_error_which_I_expect_to_happen_and_repeat_this_name_is_going_to_contain_more_than_250_characters_but_be_otherwise_acceptable_and_then_will_throw_an_error_which_I_expect_to_happen label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' @@ -319,12 +278,9 @@ {% for m in some_metrics %} name: {{ m.name }} label: {{ m.label }} - calculation_method: {{ m.calculation_method }} - expression: {{ m.expression }} - timestamp: {{ m.timestamp }} - time_grains: {{ m.time_grains }} - dimensions: {{ m.dimensions }} - filters: {{ m.filters }} + type: {{ m.type }} + type_params: {{ m.type_params }} + filters {{ m.filter }} window: {{ m.window }} {% endfor %} @@ -378,77 +334,24 @@ metrics: - name: count_orders label: Count orders - model: ref('mock_purchase_data') - - calculation_method: count - expression: "*" - timestamp: purchased_at - time_grains: [day, week, month, quarter, year] - - dimensions: - - payment_type + type: simple + type_params: + measure: num_orders - name: sum_order_revenue label: Total order revenue - model: ref('mock_purchase_data') - - calculation_method: sum - expression: "payment_total" - timestamp: purchased_at - time_grains: [day, week, month, quarter, year] - - dimensions: - - payment_type + type: simple + type_params: + measure: order_revenue - name: average_order_value label: Average Order Value - - calculation_method: derived - expression: "{{metric('sum_order_revenue')}} / {{metric('count_orders')}} " - timestamp: purchased_at - time_grains: [day, week, month, quarter, year] - - dimensions: - - payment_type -""" - -derived_metric_old_attr_names_yml = """ -version: 2 -metrics: - - name: count_orders - label: Count orders - model: ref('mock_purchase_data') - - type: count - sql: "*" - timestamp: purchased_at - time_grains: [day, week, month, quarter, year] - - dimensions: - - payment_type - - - name: sum_order_revenue - label: Total order revenue - model: ref('mock_purchase_data') - - type: sum - sql: "payment_total" - timestamp: purchased_at - time_grains: [day, week, month, quarter, year] - - dimensions: - - payment_type - - - name: average_order_value - label: Average Order Value - - type: expression - sql: "{{metric('sum_order_revenue')}} / {{metric('count_orders')}} " - timestamp: purchased_at - time_grains: [day, week, month, quarter, year] - - dimensions: - - payment_type + type: ratio + type_params: + numerator: + name: sum_order_revenue + denominator: + name: count_orders """ disabled_metric_level_schema_yml = """ @@ -459,31 +362,22 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" + type: simple + type_params: + measure: people config: enabled: False - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt meta: my_meta: 'testing' - name: collective_tenure label: "Collective tenure" description: Total number of years of team experience - model: "ref('people')" - calculation_method: sum - expression: "*" - timestamp: created_at - time_grains: [day] - filters: - - field: loves_dbt - operator: 'is' - value: 'true' + type: simple + type_params: + measure: + name: years_tenure + filter: "loves_dbt is true" """ @@ -495,31 +389,22 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" + type: simple + type_params: + measure: people config: enabled: True - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt meta: my_meta: 'testing' - name: collective_tenure label: "Collective tenure" description: Total number of years of team experience - model: "ref('people')" - calculation_method: sum - expression: "*" - timestamp: created_at - time_grains: [day] - filters: - - field: loves_dbt - operator: 'is' - value: 'true' + type: simple + type_params: + measure: + name: years_tenure + filter: "loves_dbt is true" """ @@ -552,12 +437,9 @@ {% for m in some_metrics %} name: {{ m.name }} label: {{ m.label }} - calculation_method: {{ m.calculation_method }} - expression: {{ m.expression }} - timestamp: {{ m.timestamp }} - time_grains: {{ m.time_grains }} - dimensions: {{ m.dimensions }} - filters: {{ m.filters }} + type: {{ m.type }} + type_params: {{ m.type_params }} + filter: {{ m.filter }} window: {{ m.window }} {% endfor %} @@ -572,13 +454,9 @@ metrics: - name: some_metric label: Some Metric - model: ref('model_a') - - calculation_method: count - expression: id - - timestamp: ts - time_grains: [day] + type: simple + type_params: + measure: some_measure """ metrics_2_yml = """ @@ -587,13 +465,9 @@ metrics: - name: some_metric label: Some Metric - model: ref('model_a') - - calculation_method: count - expression: user_id - - timestamp: ts - time_grains: [day] + type: simple + type_params: + measure: some_measure """ model_a_sql = """ @@ -631,31 +505,9 @@ config: enabled: True and False description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt - meta: - my_meta: 'testing' -""" - -metric_without_timestamp_or_timegrains_yml = """ -version: 2 - -metrics: - - name: number_of_people - label: "Number of people" - description: Total count of people - model: "ref('people')" - calculation_method: count - expression: "*" - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' """ diff --git a/tests/functional/metrics/test_metric_deferral.py b/tests/functional/metrics/test_metric_deferral.py index 10c91b7f34b..620c8dba25f 100644 --- a/tests/functional/metrics/test_metric_deferral.py +++ b/tests/functional/metrics/test_metric_deferral.py @@ -59,6 +59,7 @@ def models(self): "metrics.yml": metrics_1_yml, } + @pytest.mark.skip("TODO") def test_metric_deferral(self, project): results = run_dbt(["run", "--target", "prod"]) assert len(results) == 2 diff --git a/tests/functional/metrics/test_metric_helper_functions.py b/tests/functional/metrics/test_metric_helper_functions.py index da9a0046ba4..ec1015aa637 100644 --- a/tests/functional/metrics/test_metric_helper_functions.py +++ b/tests/functional/metrics/test_metric_helper_functions.py @@ -14,6 +14,9 @@ def models(self): "people.sql": models_people_sql, } + @pytest.mark.skip( + "TODO reactivate after we begin property hydrating metric `depends_on` and `refs`" + ) def test_expression_metric( self, project, diff --git a/tests/functional/metrics/test_metrics.py b/tests/functional/metrics/test_metrics.py index adc55c3b996..5715706afd5 100644 --- a/tests/functional/metrics/test_metrics.py +++ b/tests/functional/metrics/test_metrics.py @@ -18,8 +18,6 @@ downstream_model_sql, invalid_derived_metric_contains_model_yml, derived_metric_yml, - derived_metric_old_attr_names_yml, - metric_without_timestamp_or_timegrains_yml, invalid_metric_without_timestamp_with_time_grains_yml, invalid_metric_without_timestamp_with_window_yml, ) @@ -50,33 +48,6 @@ def test_simple_metric( assert metric_ids == expected_metric_ids -class TestSimpleMetricsNoTimestamp: - @pytest.fixture(scope="class") - def models(self): - return { - "people_metrics.yml": metric_without_timestamp_or_timegrains_yml, - "people.sql": models_people_sql, - } - - def test_simple_metric_no_timestamp( - self, - project, - ): - # initial run - results = run_dbt(["run"]) - assert len(results) == 1 - manifest = get_manifest(project.project_root) - metric_ids = list(manifest.metrics.keys()) - expected_metric_ids = [ - "metric.test.number_of_people", - ] - assert metric_ids == expected_metric_ids - - # make sure the 'expression' metric depends on the two upstream metrics - metric_test = manifest.metrics["metric.test.number_of_people"] - assert metric_test.timestamp is None - - class TestInvalidRefMetrics: @pytest.fixture(scope="class") def models(self): @@ -219,6 +190,7 @@ def seeds(self): "mock_purchase_data.csv": mock_purchase_data_csv, } + @pytest.mark.skip("TODO bring back once we start populating metric `depends_on`") def test_derived_metric( self, project, @@ -265,27 +237,15 @@ def test_derived_metric( for property in [ "name", "label", - "calculation_method", - "expression", - "timestamp", - "time_grains", - "dimensions", - "filters", + "type", + "type_params", + "filter", "window", ]: expected_value = getattr(parsed_metric_node, property) assert f"{property}: {expected_value}" in compiled_code -class TestDerivedMetricOldAttrNames(TestDerivedMetric): - @pytest.fixture(scope="class") - def models(self): - return { - "derived_metric.yml": derived_metric_old_attr_names_yml, - "downstream_model.sql": downstream_model_sql, - } - - class TestInvalidTimestampTimeGrainsMetrics: @pytest.fixture(scope="class") def models(self): diff --git a/tests/functional/partial_parsing/fixtures.py b/tests/functional/partial_parsing/fixtures.py index fe68d55be36..5af604f2355 100644 --- a/tests/functional/partial_parsing/fixtures.py +++ b/tests/functional/partial_parsing/fixtures.py @@ -349,17 +349,11 @@ label: New Customers model: customers description: "The number of paid customers who are using the product" - calculation_method: count - expression: user_id - timestamp: signup_date - time_grains: [day, week, month] - dimensions: - - plan - - country - filters: - - field: is_paying - value: True - operator: '=' + type: simple + type_params: + measure: + name: customers + filter: "loves_dbt is true" +meta: is_okr: True tags: @@ -431,32 +425,23 @@ metrics: - - model: "ref('people')" - name: number_of_people + - name: number_of_people description: Total count of people label: "Number of people" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: '{{ env_var("ENV_VAR_METRICS") }}' - - model: "ref('people')" - name: collective_tenure + - name: collective_tenure description: Total number of years of team experience label: "Collective tenure" - calculation_method: sum - expression: tenure - timestamp: created_at - time_grains: [day] - filters: - - field: loves_dbt - operator: is - value: 'true' + type: simple + type_params: + measure: + name: years_tenure + filter: "loves_dbt is true" """ @@ -587,32 +572,23 @@ metrics: - - model: "ref('people')" - name: number_of_people + - name: number_of_people description: Total count of people label: "Number of people" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' - - model: "ref('people')" - name: collective_tenure + - name: collective_tenure description: Total number of years of team experience label: "Collective tenure" - calculation_method: sum - expression: tenure - timestamp: created_at - time_grains: [day] - filters: - - field: loves_dbt - operator: is - value: 'true' + type: simple + type_params: + measure: + name: years_tenure + filter: "loves_dbt is true" """ @@ -985,32 +961,23 @@ metrics: - - model: "ref('people')" - name: number_of_people + - name: number_of_people description: Total count of people label: "Number of people" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'replaced' - - model: "ref('people')" - name: collective_tenure + - name: collective_tenure description: Total number of years of team experience label: "Collective tenure" - calculation_method: sum - expression: tenure - timestamp: created_at - time_grains: [day] - filters: - - field: loves_dbt - operator: is - value: 'true' + type: simple + type_params: + measure: + name: years_tenure + filter: "loves_dbt is true" """ @@ -1177,17 +1144,12 @@ metrics: - - model: "ref('people')" - name: number_of_people + - name: number_of_people description: Total count of people label: "Number of people" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'replaced' diff --git a/tests/functional/partial_parsing/test_pp_disabled_config.py b/tests/functional/partial_parsing/test_pp_disabled_config.py index c590884c41e..01df216d758 100644 --- a/tests/functional/partial_parsing/test_pp_disabled_config.py +++ b/tests/functional/partial_parsing/test_pp_disabled_config.py @@ -16,14 +16,9 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('model_one')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' @@ -51,14 +46,9 @@ description: Total count of people config: enabled: false - model: "ref('model_one')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' @@ -86,14 +76,9 @@ - name: number_of_people label: "Number of people" description: Total count of people - model: "ref('model_one')" - calculation_method: count - expression: "*" - timestamp: created_at - time_grains: [day, week, month] - dimensions: - - favorite_color - - loves_dbt + type: simple + type_params: + measure: people meta: my_meta: 'testing' """ diff --git a/tests/functional/partial_parsing/test_pp_metrics.py b/tests/functional/partial_parsing/test_pp_metrics.py index c54829ef030..d6e837f7b55 100644 --- a/tests/functional/partial_parsing/test_pp_metrics.py +++ b/tests/functional/partial_parsing/test_pp_metrics.py @@ -1,6 +1,5 @@ import pytest -from dbt.contracts.graph.nodes import RefArgs from dbt.tests.util import run_dbt, write_file, get_manifest from tests.functional.partial_parsing.fixtures import ( people_sql, @@ -34,15 +33,17 @@ def test_metrics(self, project): manifest = get_manifest(project.project_root) assert len(manifest.metrics) == 2 metric_people_id = "metric.test.number_of_people" - metric_tenure_id = "metric.test.collective_tenure" metric_people = manifest.metrics[metric_people_id] - metric_tenure = manifest.metrics[metric_tenure_id] expected_meta = {"my_meta": "testing"} assert metric_people.meta == expected_meta - assert metric_people.refs == [RefArgs(name="people")] - assert metric_tenure.refs == [RefArgs(name="people")] - expected_depends_on_nodes = ["model.test.people"] - assert metric_people.depends_on.nodes == expected_depends_on_nodes + + # TODO: Bring back when we resolving `depends_on_nodes` + # metric_tenure_id = "metric.test.collective_tenure" + # metric_tenure = manifest.metrics[metric_tenure_id] + # assert metric_people.refs == [RefArgs(name="people")] + # assert metric_tenure.refs == [RefArgs(name="people")] + # expected_depends_on_nodes = ["model.test.people"] + # assert metric_people.depends_on.nodes == expected_depends_on_nodes # Change metrics yaml files write_file(people_metrics2_yml, project.project_root, "models", "people_metrics.yml") @@ -52,19 +53,21 @@ def test_metrics(self, project): metric_people = manifest.metrics[metric_people_id] expected_meta = {"my_meta": "replaced"} assert metric_people.meta == expected_meta - expected_depends_on_nodes = ["model.test.people"] - assert metric_people.depends_on.nodes == expected_depends_on_nodes + # TODO: Bring back when we resolving `depends_on_nodes` + # expected_depends_on_nodes = ["model.test.people"] + # assert metric_people.depends_on.nodes == expected_depends_on_nodes # Add model referring to metric write_file(metric_model_a_sql, project.project_root, "models", "metric_model_a.sql") results = run_dbt(["run"]) manifest = get_manifest(project.project_root) - model_a = manifest.nodes["model.test.metric_model_a"] - expected_depends_on_nodes = [ - "metric.test.number_of_people", - "metric.test.collective_tenure", - ] - assert model_a.depends_on.nodes == expected_depends_on_nodes + # TODO: Bring back when we resolving `depends_on_nodes` + # model_a = manifest.nodes["model.test.metric_model_a"] + # expected_depends_on_nodes = [ + # "metric.test.number_of_people", + # "metric.test.collective_tenure", + # ] + # assert model_a.depends_on.nodes == expected_depends_on_nodes # Then delete a metric write_file(people_metrics3_yml, project.project_root, "models", "people_metrics.yml") From cb64682d3352812095eb2911a556d7c46f6c923f Mon Sep 17 00:00:00 2001 From: Github Build Bot Date: Thu, 8 Jun 2023 20:15:20 +0000 Subject: [PATCH 55/67] Bumping version to 1.6.0b3 and generate changelog --- .bumpversion.cfg | 2 +- .changes/1.6.0-b3.md | 46 +++++++++++++++++ .../Breaking Changes-20230515-053148.yaml | 0 .../Breaking Changes-20230607-190309.yaml | 0 .../Features-20230329-120313.yaml | 0 .../Features-20230424-163611.yaml | 0 .../Features-20230509-212935.yaml | 0 .../Features-20230523-225955.yaml | 0 .../Features-20230530-164847.yaml | 0 .../Features-20230601-132223.yaml | 0 .../Features-20230602-083302.yaml | 0 .../Features-20230604-025956.yaml | 0 .../Features-20230604-080052.yaml | 0 .../Features-20230605-222039.yaml | 0 .../Features-20230606-165351.yaml | 0 .../Fixes-20230504-140642.yaml | 0 .../Fixes-20230506-180900.yaml | 0 .../Fixes-20230524-160648.yaml | 0 .../Fixes-20230525-073651.yaml | 0 .../Fixes-20230525-165053.yaml | 0 .../Fixes-20230526-153738.yaml | 0 .../Fixes-20230526-164727.yaml | 0 .../Fixes-20230530-104228.yaml | 0 .../Fixes-20230531-131919.yaml | 0 .../Fixes-20230601-130549.yaml | 0 .../Fixes-20230605-121127.yaml | 0 .../Fixes-20230605-124425.yaml | 0 .../Under the Hood-20230602-145743.yaml | 0 .../Under the Hood-20230605-234706.yaml | 0 CHANGELOG.md | 50 ++++++++++++++++++- core/dbt/version.py | 2 +- core/setup.py | 2 +- docker/Dockerfile | 12 ++--- .../dbt/adapters/postgres/__version__.py | 2 +- plugins/postgres/setup.py | 2 +- .../adapter/dbt/tests/adapter/__version__.py | 2 +- tests/adapter/setup.py | 2 +- 37 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 .changes/1.6.0-b3.md rename .changes/{unreleased => 1.6.0}/Breaking Changes-20230515-053148.yaml (100%) rename .changes/{unreleased => 1.6.0}/Breaking Changes-20230607-190309.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230329-120313.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230424-163611.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230509-212935.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230523-225955.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230530-164847.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230601-132223.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230602-083302.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230604-025956.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230604-080052.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230605-222039.yaml (100%) rename .changes/{unreleased => 1.6.0}/Features-20230606-165351.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230504-140642.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230506-180900.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230524-160648.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230525-073651.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230525-165053.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230526-153738.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230526-164727.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230530-104228.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230531-131919.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230601-130549.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230605-121127.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230605-124425.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230602-145743.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230605-234706.yaml (100%) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index fc2c9a12a93..98ac244eba2 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.6.0b2 +current_version = 1.6.0b3 parse = (?P[\d]+) # major version number \.(?P[\d]+) # minor version number \.(?P[\d]+) # patch version number diff --git a/.changes/1.6.0-b3.md b/.changes/1.6.0-b3.md new file mode 100644 index 00000000000..5e6f3909f9f --- /dev/null +++ b/.changes/1.6.0-b3.md @@ -0,0 +1,46 @@ +## dbt-core 1.6.0-b3 - June 08, 2023 + +### Breaking Changes + +- Dropped support for Python 3.7 ([#7082](https://github.com/dbt-labs/dbt-core/issues/7082)) +- Switch from dbt-metrics to dbt-semantic-interfaces for MetricNode definitions ([#7500](https://github.com/dbt-labs/dbt-core/issues/7500), [#7404](https://github.com/dbt-labs/dbt-core/issues/7404)) + +### Features + +- Add support for materialized views ([#6911](https://github.com/dbt-labs/dbt-core/issues/6911)) +- Optimize template rendering for common parse scenarios ([#7449](https://github.com/dbt-labs/dbt-core/issues/7449)) +- nodes in packages respect custom generate_alias_name, generate_schema_name, generate_database_name macro overrides defined in packages ([#7444](https://github.com/dbt-labs/dbt-core/issues/7444)) +- Enable state for deferral to be separate from state for selectors ([#7300](https://github.com/dbt-labs/dbt-core/issues/7300)) +- add access selection syntax ([#7738](https://github.com/dbt-labs/dbt-core/issues/7738)) +- add project_name to manifest metadata ([#7752](https://github.com/dbt-labs/dbt-core/issues/7752)) +- dbt retry ([#7299](https://github.com/dbt-labs/dbt-core/issues/7299)) +- Revamp debug, add --connection flag. Prepare for future refactors/interface changes. ([#7104](https://github.com/dbt-labs/dbt-core/issues/7104)) +- Validate public models are not materialized as ephemeral ([#7226](https://github.com/dbt-labs/dbt-core/issues/7226)) +- Added support for parsing and serializaing semantic models ([#7499](https://github.com/dbt-labs/dbt-core/issues/7499), [#7503](https://github.com/dbt-labs/dbt-core/issues/7503)) + +### Fixes + +- Constraint rendering fixes: wrap check expression in parentheses, foreign key 'references', support expression in all constraint types ([#7417](https://github.com/dbt-labs/dbt-core/issues/7417), [#7480](https://github.com/dbt-labs/dbt-core/issues/7480), [#7416](https://github.com/dbt-labs/dbt-core/issues/7416)) +- Fix warning messages for deprecated dbt_project.yml configs ([#7424](https://github.com/dbt-labs/dbt-core/issues/7424)) +- Add `%` to adapter suite test cases for `persist_docs` ([#7698](https://github.com/dbt-labs/dbt-core/issues/7698)) +- Improve warnings for constraints and materialization types ([#7335](https://github.com/dbt-labs/dbt-core/issues/7335)) +- Incorrect paths used for "target" and "state" directories ([#7465](https://github.com/dbt-labs/dbt-core/issues/7465)) +- fix StopIteration error when publication for project not found ([#7711](https://github.com/dbt-labs/dbt-core/issues/7711)) +- Using version 0 works when resolving single model ([#7372](https://github.com/dbt-labs/dbt-core/issues/7372)) +- Fix empty --warn-error-options error message ([#7730](https://github.com/dbt-labs/dbt-core/issues/7730)) +- send sql header on contract enforcement ([#7714](https://github.com/dbt-labs/dbt-core/issues/7714)) +- Fixed doc link in selector.py ([#7533](https://github.com/dbt-labs/dbt-core/issues/7533)) +- Fix null-safe equals comparison via `equals` ([#7778](https://github.com/dbt-labs/dbt-core/issues/7778)) +- Log PublicationArtifactAvailable even when partially parsing unchanged public models ([#7782](https://github.com/dbt-labs/dbt-core/issues/7782)) +- fix RuntimeError when removing project dependency from dependencies.yml ([#7743](https://github.com/dbt-labs/dbt-core/issues/7743)) + +### Under the Hood + +- Fix flaky test for --fail-fast ([#7744](https://github.com/dbt-labs/dbt-core/issues/7744)) +- Create `add_from_artifact` to populate `state_relation` field of nodes ([#7551](https://github.com/dbt-labs/dbt-core/issues/7551)) + +### Contributors +- [@dave-connors-3](https://github.com/dave-connors-3) ([#7738](https://github.com/dbt-labs/dbt-core/issues/7738)) +- [@quazi-irfan](https://github.com/quazi-irfan) ([#7533](https://github.com/dbt-labs/dbt-core/issues/7533)) +- [@sdebruyn](https://github.com/sdebruyn) ([#7082](https://github.com/dbt-labs/dbt-core/issues/7082)) +- [@stu-k](https://github.com/stu-k) ([#7299](https://github.com/dbt-labs/dbt-core/issues/7299), [#7551](https://github.com/dbt-labs/dbt-core/issues/7551)) diff --git a/.changes/unreleased/Breaking Changes-20230515-053148.yaml b/.changes/1.6.0/Breaking Changes-20230515-053148.yaml similarity index 100% rename from .changes/unreleased/Breaking Changes-20230515-053148.yaml rename to .changes/1.6.0/Breaking Changes-20230515-053148.yaml diff --git a/.changes/unreleased/Breaking Changes-20230607-190309.yaml b/.changes/1.6.0/Breaking Changes-20230607-190309.yaml similarity index 100% rename from .changes/unreleased/Breaking Changes-20230607-190309.yaml rename to .changes/1.6.0/Breaking Changes-20230607-190309.yaml diff --git a/.changes/unreleased/Features-20230329-120313.yaml b/.changes/1.6.0/Features-20230329-120313.yaml similarity index 100% rename from .changes/unreleased/Features-20230329-120313.yaml rename to .changes/1.6.0/Features-20230329-120313.yaml diff --git a/.changes/unreleased/Features-20230424-163611.yaml b/.changes/1.6.0/Features-20230424-163611.yaml similarity index 100% rename from .changes/unreleased/Features-20230424-163611.yaml rename to .changes/1.6.0/Features-20230424-163611.yaml diff --git a/.changes/unreleased/Features-20230509-212935.yaml b/.changes/1.6.0/Features-20230509-212935.yaml similarity index 100% rename from .changes/unreleased/Features-20230509-212935.yaml rename to .changes/1.6.0/Features-20230509-212935.yaml diff --git a/.changes/unreleased/Features-20230523-225955.yaml b/.changes/1.6.0/Features-20230523-225955.yaml similarity index 100% rename from .changes/unreleased/Features-20230523-225955.yaml rename to .changes/1.6.0/Features-20230523-225955.yaml diff --git a/.changes/unreleased/Features-20230530-164847.yaml b/.changes/1.6.0/Features-20230530-164847.yaml similarity index 100% rename from .changes/unreleased/Features-20230530-164847.yaml rename to .changes/1.6.0/Features-20230530-164847.yaml diff --git a/.changes/unreleased/Features-20230601-132223.yaml b/.changes/1.6.0/Features-20230601-132223.yaml similarity index 100% rename from .changes/unreleased/Features-20230601-132223.yaml rename to .changes/1.6.0/Features-20230601-132223.yaml diff --git a/.changes/unreleased/Features-20230602-083302.yaml b/.changes/1.6.0/Features-20230602-083302.yaml similarity index 100% rename from .changes/unreleased/Features-20230602-083302.yaml rename to .changes/1.6.0/Features-20230602-083302.yaml diff --git a/.changes/unreleased/Features-20230604-025956.yaml b/.changes/1.6.0/Features-20230604-025956.yaml similarity index 100% rename from .changes/unreleased/Features-20230604-025956.yaml rename to .changes/1.6.0/Features-20230604-025956.yaml diff --git a/.changes/unreleased/Features-20230604-080052.yaml b/.changes/1.6.0/Features-20230604-080052.yaml similarity index 100% rename from .changes/unreleased/Features-20230604-080052.yaml rename to .changes/1.6.0/Features-20230604-080052.yaml diff --git a/.changes/unreleased/Features-20230605-222039.yaml b/.changes/1.6.0/Features-20230605-222039.yaml similarity index 100% rename from .changes/unreleased/Features-20230605-222039.yaml rename to .changes/1.6.0/Features-20230605-222039.yaml diff --git a/.changes/unreleased/Features-20230606-165351.yaml b/.changes/1.6.0/Features-20230606-165351.yaml similarity index 100% rename from .changes/unreleased/Features-20230606-165351.yaml rename to .changes/1.6.0/Features-20230606-165351.yaml diff --git a/.changes/unreleased/Fixes-20230504-140642.yaml b/.changes/1.6.0/Fixes-20230504-140642.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230504-140642.yaml rename to .changes/1.6.0/Fixes-20230504-140642.yaml diff --git a/.changes/unreleased/Fixes-20230506-180900.yaml b/.changes/1.6.0/Fixes-20230506-180900.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230506-180900.yaml rename to .changes/1.6.0/Fixes-20230506-180900.yaml diff --git a/.changes/unreleased/Fixes-20230524-160648.yaml b/.changes/1.6.0/Fixes-20230524-160648.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230524-160648.yaml rename to .changes/1.6.0/Fixes-20230524-160648.yaml diff --git a/.changes/unreleased/Fixes-20230525-073651.yaml b/.changes/1.6.0/Fixes-20230525-073651.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230525-073651.yaml rename to .changes/1.6.0/Fixes-20230525-073651.yaml diff --git a/.changes/unreleased/Fixes-20230525-165053.yaml b/.changes/1.6.0/Fixes-20230525-165053.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230525-165053.yaml rename to .changes/1.6.0/Fixes-20230525-165053.yaml diff --git a/.changes/unreleased/Fixes-20230526-153738.yaml b/.changes/1.6.0/Fixes-20230526-153738.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230526-153738.yaml rename to .changes/1.6.0/Fixes-20230526-153738.yaml diff --git a/.changes/unreleased/Fixes-20230526-164727.yaml b/.changes/1.6.0/Fixes-20230526-164727.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230526-164727.yaml rename to .changes/1.6.0/Fixes-20230526-164727.yaml diff --git a/.changes/unreleased/Fixes-20230530-104228.yaml b/.changes/1.6.0/Fixes-20230530-104228.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230530-104228.yaml rename to .changes/1.6.0/Fixes-20230530-104228.yaml diff --git a/.changes/unreleased/Fixes-20230531-131919.yaml b/.changes/1.6.0/Fixes-20230531-131919.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230531-131919.yaml rename to .changes/1.6.0/Fixes-20230531-131919.yaml diff --git a/.changes/unreleased/Fixes-20230601-130549.yaml b/.changes/1.6.0/Fixes-20230601-130549.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230601-130549.yaml rename to .changes/1.6.0/Fixes-20230601-130549.yaml diff --git a/.changes/unreleased/Fixes-20230605-121127.yaml b/.changes/1.6.0/Fixes-20230605-121127.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230605-121127.yaml rename to .changes/1.6.0/Fixes-20230605-121127.yaml diff --git a/.changes/unreleased/Fixes-20230605-124425.yaml b/.changes/1.6.0/Fixes-20230605-124425.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230605-124425.yaml rename to .changes/1.6.0/Fixes-20230605-124425.yaml diff --git a/.changes/unreleased/Under the Hood-20230602-145743.yaml b/.changes/1.6.0/Under the Hood-20230602-145743.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230602-145743.yaml rename to .changes/1.6.0/Under the Hood-20230602-145743.yaml diff --git a/.changes/unreleased/Under the Hood-20230605-234706.yaml b/.changes/1.6.0/Under the Hood-20230605-234706.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230605-234706.yaml rename to .changes/1.6.0/Under the Hood-20230605-234706.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 760f22fbf07..e2a6443b4ed 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,54 @@ - "Breaking changes" listed under a version may require action from end users or external maintainers when upgrading to that version. - Do not edit this file directly. This file is auto-generated using [changie](https://github.com/miniscruff/changie). For details on how to document a change, see [the contributing guide](https://github.com/dbt-labs/dbt-core/blob/main/CONTRIBUTING.md#adding-changelog-entry) +## dbt-core 1.6.0-b3 - June 08, 2023 + +### Breaking Changes + +- Dropped support for Python 3.7 ([#7082](https://github.com/dbt-labs/dbt-core/issues/7082)) +- Switch from dbt-metrics to dbt-semantic-interfaces for MetricNode definitions ([#7500](https://github.com/dbt-labs/dbt-core/issues/7500), [#7404](https://github.com/dbt-labs/dbt-core/issues/7404)) + +### Features + +- Add support for materialized views ([#6911](https://github.com/dbt-labs/dbt-core/issues/6911)) +- Optimize template rendering for common parse scenarios ([#7449](https://github.com/dbt-labs/dbt-core/issues/7449)) +- nodes in packages respect custom generate_alias_name, generate_schema_name, generate_database_name macro overrides defined in packages ([#7444](https://github.com/dbt-labs/dbt-core/issues/7444)) +- Enable state for deferral to be separate from state for selectors ([#7300](https://github.com/dbt-labs/dbt-core/issues/7300)) +- add access selection syntax ([#7738](https://github.com/dbt-labs/dbt-core/issues/7738)) +- add project_name to manifest metadata ([#7752](https://github.com/dbt-labs/dbt-core/issues/7752)) +- dbt retry ([#7299](https://github.com/dbt-labs/dbt-core/issues/7299)) +- Revamp debug, add --connection flag. Prepare for future refactors/interface changes. ([#7104](https://github.com/dbt-labs/dbt-core/issues/7104)) +- Validate public models are not materialized as ephemeral ([#7226](https://github.com/dbt-labs/dbt-core/issues/7226)) +- Added support for parsing and serializaing semantic models ([#7499](https://github.com/dbt-labs/dbt-core/issues/7499), [#7503](https://github.com/dbt-labs/dbt-core/issues/7503)) + +### Fixes + +- Constraint rendering fixes: wrap check expression in parentheses, foreign key 'references', support expression in all constraint types ([#7417](https://github.com/dbt-labs/dbt-core/issues/7417), [#7480](https://github.com/dbt-labs/dbt-core/issues/7480), [#7416](https://github.com/dbt-labs/dbt-core/issues/7416)) +- Fix warning messages for deprecated dbt_project.yml configs ([#7424](https://github.com/dbt-labs/dbt-core/issues/7424)) +- Add `%` to adapter suite test cases for `persist_docs` ([#7698](https://github.com/dbt-labs/dbt-core/issues/7698)) +- Improve warnings for constraints and materialization types ([#7335](https://github.com/dbt-labs/dbt-core/issues/7335)) +- Incorrect paths used for "target" and "state" directories ([#7465](https://github.com/dbt-labs/dbt-core/issues/7465)) +- fix StopIteration error when publication for project not found ([#7711](https://github.com/dbt-labs/dbt-core/issues/7711)) +- Using version 0 works when resolving single model ([#7372](https://github.com/dbt-labs/dbt-core/issues/7372)) +- Fix empty --warn-error-options error message ([#7730](https://github.com/dbt-labs/dbt-core/issues/7730)) +- send sql header on contract enforcement ([#7714](https://github.com/dbt-labs/dbt-core/issues/7714)) +- Fixed doc link in selector.py ([#7533](https://github.com/dbt-labs/dbt-core/issues/7533)) +- Fix null-safe equals comparison via `equals` ([#7778](https://github.com/dbt-labs/dbt-core/issues/7778)) +- Log PublicationArtifactAvailable even when partially parsing unchanged public models ([#7782](https://github.com/dbt-labs/dbt-core/issues/7782)) +- fix RuntimeError when removing project dependency from dependencies.yml ([#7743](https://github.com/dbt-labs/dbt-core/issues/7743)) + +### Under the Hood + +- Fix flaky test for --fail-fast ([#7744](https://github.com/dbt-labs/dbt-core/issues/7744)) +- Create `add_from_artifact` to populate `state_relation` field of nodes ([#7551](https://github.com/dbt-labs/dbt-core/issues/7551)) + +### Contributors +- [@dave-connors-3](https://github.com/dave-connors-3) ([#7738](https://github.com/dbt-labs/dbt-core/issues/7738)) +- [@quazi-irfan](https://github.com/quazi-irfan) ([#7533](https://github.com/dbt-labs/dbt-core/issues/7533)) +- [@sdebruyn](https://github.com/sdebruyn) ([#7082](https://github.com/dbt-labs/dbt-core/issues/7082)) +- [@stu-k](https://github.com/stu-k) ([#7299](https://github.com/dbt-labs/dbt-core/issues/7299), [#7551](https://github.com/dbt-labs/dbt-core/issues/7551)) + + ## dbt-core 1.6.0-b2 - May 25, 2023 ### Features @@ -44,7 +92,6 @@ - [@sdebruyn](https://github.com/sdebruyn) ([#7670](https://github.com/dbt-labs/dbt-core/issues/7670)) - [@stu-k](https://github.com/stu-k) ([#7607](https://github.com/dbt-labs/dbt-core/issues/7607), [#7550](https://github.com/dbt-labs/dbt-core/issues/7550)) - ## dbt-core 1.6.0-b1 - May 12, 2023 ### Features @@ -103,6 +150,7 @@ For information on prior major and minor releases, see their changelogs: +* [1.5](https://github.com/dbt-labs/dbt-core/blob/1.5.latest/CHANGELOG.md) * [1.4](https://github.com/dbt-labs/dbt-core/blob/1.4.latest/CHANGELOG.md) * [1.3](https://github.com/dbt-labs/dbt-core/blob/1.3.latest/CHANGELOG.md) * [1.2](https://github.com/dbt-labs/dbt-core/blob/1.2.latest/CHANGELOG.md) diff --git a/core/dbt/version.py b/core/dbt/version.py index 923e37b40d6..de20632d60e 100644 --- a/core/dbt/version.py +++ b/core/dbt/version.py @@ -232,5 +232,5 @@ def _get_adapter_plugin_names() -> Iterator[str]: yield plugin_name -__version__ = "1.6.0b2" +__version__ = "1.6.0b3" installed = get_installed_version() diff --git a/core/setup.py b/core/setup.py index 2eeb0d1389b..6da8e0ef8b1 100644 --- a/core/setup.py +++ b/core/setup.py @@ -25,7 +25,7 @@ package_name = "dbt-core" -package_version = "1.6.0b2" +package_version = "1.6.0b3" description = """With dbt, data analysts and engineers can build analytics \ the way engineers build applications.""" diff --git a/docker/Dockerfile b/docker/Dockerfile index 7cb7f8dbc8c..a38e857d8bf 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,12 +14,12 @@ FROM --platform=$build_for python:3.11.2-slim-bullseye as base # N.B. The refs updated automagically every release via bumpversion # N.B. dbt-postgres is currently found in the core codebase so a value of dbt-core@ is correct -ARG dbt_core_ref=dbt-core@v1.6.0b2 -ARG dbt_postgres_ref=dbt-core@v1.6.0b2 -ARG dbt_redshift_ref=dbt-redshift@v1.6.0b2 -ARG dbt_bigquery_ref=dbt-bigquery@v1.6.0b2 -ARG dbt_snowflake_ref=dbt-snowflake@v1.6.0b2 -ARG dbt_spark_ref=dbt-spark@v1.6.0b2 +ARG dbt_core_ref=dbt-core@v1.6.0b3 +ARG dbt_postgres_ref=dbt-core@v1.6.0b3 +ARG dbt_redshift_ref=dbt-redshift@v1.6.0b3 +ARG dbt_bigquery_ref=dbt-bigquery@v1.6.0b3 +ARG dbt_snowflake_ref=dbt-snowflake@v1.6.0b3 +ARG dbt_spark_ref=dbt-spark@v1.6.0b3 # special case args ARG dbt_spark_version=all ARG dbt_third_party diff --git a/plugins/postgres/dbt/adapters/postgres/__version__.py b/plugins/postgres/dbt/adapters/postgres/__version__.py index 21c2b283654..0c2870f87d7 100644 --- a/plugins/postgres/dbt/adapters/postgres/__version__.py +++ b/plugins/postgres/dbt/adapters/postgres/__version__.py @@ -1 +1 @@ -version = "1.6.0b2" +version = "1.6.0b3" diff --git a/plugins/postgres/setup.py b/plugins/postgres/setup.py index 369592c2f5d..657ccba11fa 100644 --- a/plugins/postgres/setup.py +++ b/plugins/postgres/setup.py @@ -41,7 +41,7 @@ def _dbt_psycopg2_name(): package_name = "dbt-postgres" -package_version = "1.6.0b2" +package_version = "1.6.0b3" description = """The postgres adapter plugin for dbt (data build tool)""" this_directory = os.path.abspath(os.path.dirname(__file__)) diff --git a/tests/adapter/dbt/tests/adapter/__version__.py b/tests/adapter/dbt/tests/adapter/__version__.py index 21c2b283654..0c2870f87d7 100644 --- a/tests/adapter/dbt/tests/adapter/__version__.py +++ b/tests/adapter/dbt/tests/adapter/__version__.py @@ -1 +1 @@ -version = "1.6.0b2" +version = "1.6.0b3" diff --git a/tests/adapter/setup.py b/tests/adapter/setup.py index 89cf278eb1f..4003fdea981 100644 --- a/tests/adapter/setup.py +++ b/tests/adapter/setup.py @@ -20,7 +20,7 @@ package_name = "dbt-tests-adapter" -package_version = "1.6.0b2" +package_version = "1.6.0b3" description = """The dbt adapter tests for adapter plugins""" this_directory = os.path.abspath(os.path.dirname(__file__)) From 5f9e527768b5dc4b2380c8d9eaa15ce175c46a92 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Mon, 12 Jun 2023 11:55:07 -0400 Subject: [PATCH 56/67] Rm spaces from NodeType strings (#7842) * Rm space from NodeType strings * Add changelog entry --- .changes/unreleased/Under the Hood-20230612-070827.yaml | 6 ++++++ core/dbt/node_types.py | 4 ++-- test/unit/test_node_types.py | 4 ++-- .../semantic_models/test_semantic_model_parsing.py | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 .changes/unreleased/Under the Hood-20230612-070827.yaml diff --git a/.changes/unreleased/Under the Hood-20230612-070827.yaml b/.changes/unreleased/Under the Hood-20230612-070827.yaml new file mode 100644 index 00000000000..1c9dc80eb15 --- /dev/null +++ b/.changes/unreleased/Under the Hood-20230612-070827.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Rm space from NodeType strings +time: 2023-06-12T07:08:27.276551-04:00 +custom: + Author: jtcohen6 + Issue: "7841" diff --git a/core/dbt/node_types.py b/core/dbt/node_types.py index 5a98cb95be1..2af115d1b64 100644 --- a/core/dbt/node_types.py +++ b/core/dbt/node_types.py @@ -26,14 +26,14 @@ class NodeType(StrEnum): Seed = "seed" # TODO: rm? RPCCall = "rpc" - SqlOperation = "sql operation" + SqlOperation = "sqloperation" Documentation = "doc" Source = "source" Macro = "macro" Exposure = "exposure" Metric = "metric" Group = "group" - SemanticModel = "semantic model" + SemanticModel = "semanticmodel" @classmethod def executable(cls) -> List["NodeType"]: diff --git a/test/unit/test_node_types.py b/test/unit/test_node_types.py index f56e57b27da..abe65d858c6 100644 --- a/test/unit/test_node_types.py +++ b/test/unit/test_node_types.py @@ -9,14 +9,14 @@ NodeType.Operation: "operations", NodeType.Seed: "seeds", NodeType.RPCCall: "rpcs", - NodeType.SqlOperation: "sql operations", + NodeType.SqlOperation: "sqloperations", NodeType.Documentation: "docs", NodeType.Source: "sources", NodeType.Macro: "macros", NodeType.Exposure: "exposures", NodeType.Metric: "metrics", NodeType.Group: "groups", - NodeType.SemanticModel: "semantic models", + NodeType.SemanticModel: "semanticmodels", } diff --git a/tests/functional/semantic_models/test_semantic_model_parsing.py b/tests/functional/semantic_models/test_semantic_model_parsing.py index 344e58c0f61..9a422f69a10 100644 --- a/tests/functional/semantic_models/test_semantic_model_parsing.py +++ b/tests/functional/semantic_models/test_semantic_model_parsing.py @@ -53,5 +53,5 @@ def test_semantic_model_parsing(self, project): assert isinstance(result.result, Manifest) manifest = result.result assert len(manifest.semantic_nodes) == 1 - semantic_model = manifest.semantic_nodes["semantic model.test.revenue"] + semantic_model = manifest.semantic_nodes["semanticmodel.test.revenue"] assert semantic_model.node_relation.alias == "fct_revenue" From f9abeca231ad20a8d0c4d8154b60bfda48d7fef5 Mon Sep 17 00:00:00 2001 From: FishtownBuildBot <77737458+FishtownBuildBot@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:55:42 -0500 Subject: [PATCH 57/67] Add new index.html and changelog yaml files from dbt-docs (#7836) --- .changes/unreleased/Docs-20230531-115419.yaml | 6 ++++++ core/dbt/include/index.html | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 .changes/unreleased/Docs-20230531-115419.yaml diff --git a/.changes/unreleased/Docs-20230531-115419.yaml b/.changes/unreleased/Docs-20230531-115419.yaml new file mode 100644 index 00000000000..08057f5e3a5 --- /dev/null +++ b/.changes/unreleased/Docs-20230531-115419.yaml @@ -0,0 +1,6 @@ +kind: Docs +body: Fix for column tests not rendering on quoted columns +time: 2023-05-31T11:54:19.687363-04:00 +custom: + Author: drewbanin + Issue: "201" diff --git a/core/dbt/include/index.html b/core/dbt/include/index.html index 5631ac61c36..2546d651b87 100644 --- a/core/dbt/include/index.html +++ b/core/dbt/include/index.html @@ -48,7 +48,7 @@ * * Date: 2020-03-14 */ -function(e){var t,n,r,i,o,a,s,l,c,u,d,f,p,h,g,m,v,b,y,x="sizzle"+1*new Date,w=e.document,k=0,A=0,E=le(),S=le(),$=le(),C=le(),_=function(e,t){return e===t&&(d=!0),0},O={}.hasOwnProperty,j=[],T=j.pop,P=j.push,D=j.push,R=j.slice,I=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),H=new RegExp(M+"|>"),G=new RegExp(B),W=new RegExp("^"+z+"$"),Y={ID:new RegExp("^#("+z+")"),CLASS:new RegExp("^\\.("+z+")"),TAG:new RegExp("^("+z+"|[*])"),ATTR:new RegExp("^"+L),PSEUDO:new RegExp("^"+B),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+N+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},X=/HTML$/i,Z=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){f()},ae=xe((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{D.apply(j=R.call(w.childNodes),w.childNodes),j[w.childNodes.length].nodeType}catch(e){D={apply:j.length?function(e,t){P.apply(e,R.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function se(e,t,r,i){var o,s,c,u,d,h,v,b=t&&t.ownerDocument,w=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==w&&9!==w&&11!==w)return r;if(!i&&(f(t),t=t||p,g)){if(11!==w&&(d=K.exec(e)))if(o=d[1]){if(9===w){if(!(c=t.getElementById(o)))return r;if(c.id===o)return r.push(c),r}else if(b&&(c=b.getElementById(o))&&y(t,c)&&c.id===o)return r.push(c),r}else{if(d[2])return D.apply(r,t.getElementsByTagName(e)),r;if((o=d[3])&&n.getElementsByClassName&&t.getElementsByClassName)return D.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!C[e+" "]&&(!m||!m.test(e))&&(1!==w||"object"!==t.nodeName.toLowerCase())){if(v=e,b=t,1===w&&(H.test(e)||U.test(e))){for((b=ee.test(e)&&ve(t.parentNode)||t)===t&&n.scope||((u=t.getAttribute("id"))?u=u.replace(re,ie):t.setAttribute("id",u=x)),s=(h=a(e)).length;s--;)h[s]=(u?"#"+u:":scope")+" "+ye(h[s]);v=h.join(",")}try{return D.apply(r,b.querySelectorAll(v)),r}catch(t){C(e,!0)}finally{u===x&&t.removeAttribute("id")}}}return l(e.replace(q,"$1"),t,r,i)}function le(){var e=[];return function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}}function ce(e){return e[x]=!0,e}function ue(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){for(var n=e.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=t}function fe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function pe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function he(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ge(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ae(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function me(e){return ce((function(t){return t=+t,ce((function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))}))}))}function ve(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=se.support={},o=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!X.test(t||n&&n.nodeName||"HTML")},f=se.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!=p&&9===a.nodeType&&a.documentElement?(h=(p=a).documentElement,g=!o(p),w!=p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",oe,!1):i.attachEvent&&i.attachEvent("onunload",oe)),n.scope=ue((function(e){return h.appendChild(e).appendChild(p.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length})),n.attributes=ue((function(e){return e.className="i",!e.getAttribute("className")})),n.getElementsByTagName=ue((function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length})),n.getElementsByClassName=J.test(p.getElementsByClassName),n.getById=ue((function(e){return h.appendChild(e).id=x,!p.getElementsByName||!p.getElementsByName(x).length})),n.getById?(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],m=[],(n.qsa=J.test(p.querySelectorAll))&&(ue((function(e){var t;h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+M+"*(?:value|"+N+")"),e.querySelectorAll("[id~="+x+"-]").length||m.push("~="),(t=p.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||m.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+x+"+*").length||m.push(".#.+[+~]"),e.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ue((function(e){e.innerHTML="";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=J.test(b=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue((function(e){n.disconnectedMatch=b.call(e,"*"),b.call(e,"[s!='']:x"),v.push("!=",B)})),m=m.length&&new RegExp(m.join("|")),v=v.length&&new RegExp(v.join("|")),t=J.test(h.compareDocumentPosition),y=t||J.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},_=t?function(e,t){if(e===t)return d=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e==p||e.ownerDocument==w&&y(w,e)?-1:t==p||t.ownerDocument==w&&y(w,t)?1:u?I(u,e)-I(u,t):0:4&r?-1:1)}:function(e,t){if(e===t)return d=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==p?-1:t==p?1:i?-1:o?1:u?I(u,e)-I(u,t):0;if(i===o)return fe(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?fe(a[r],s[r]):a[r]==w?-1:s[r]==w?1:0},p):p},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(f(e),n.matchesSelector&&g&&!C[t+" "]&&(!v||!v.test(t))&&(!m||!m.test(t)))try{var r=b.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){C(t,!0)}return se(t,p,null,[e]).length>0},se.contains=function(e,t){return(e.ownerDocument||e)!=p&&f(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=p&&f(e);var i=r.attrHandle[t.toLowerCase()],o=i&&O.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,r=[],i=0,o=0;if(d=!n.detectDuplicates,u=!n.sortStable&&e.slice(0),e.sort(_),d){for(;t=e[o++];)t===e[o]&&(i=r.push(o));for(;i--;)e.splice(r[i],1)}return u=null,e},i=se.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=i(t);return n},(r=se.selectors={cacheLength:50,createPseudo:ce,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Y.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&G.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(r){var i=se.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(F," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var c,u,d,f,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,v=s&&t.nodeName.toLowerCase(),b=!l&&!s,y=!1;if(m){if(o){for(;g;){for(f=t;f=f[g];)if(s?f.nodeName.toLowerCase()===v:1===f.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&b){for(y=(p=(c=(u=(d=(f=m)[x]||(f[x]={}))[f.uniqueID]||(d[f.uniqueID]={}))[e]||[])[0]===k&&c[1])&&c[2],f=p&&m.childNodes[p];f=++p&&f&&f[g]||(y=p=0)||h.pop();)if(1===f.nodeType&&++y&&f===t){u[e]=[k,p,y];break}}else if(b&&(y=p=(c=(u=(d=(f=t)[x]||(f[x]={}))[f.uniqueID]||(d[f.uniqueID]={}))[e]||[])[0]===k&&c[1]),!1===y)for(;(f=++p&&f&&f[g]||(y=p=0)||h.pop())&&((s?f.nodeName.toLowerCase()!==v:1!==f.nodeType)||!++y||(b&&((u=(d=f[x]||(f[x]={}))[f.uniqueID]||(d[f.uniqueID]={}))[e]=[k,y]),f!==t)););return(y-=i)===r||y%r==0&&y/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return i[x]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?ce((function(e,n){for(var r,o=i(e,t),a=o.length;a--;)e[r=I(e,o[a])]=!(n[r]=o[a])})):function(e){return i(e,0,n)}):i}},pseudos:{not:ce((function(e){var t=[],n=[],r=s(e.replace(q,"$1"));return r[x]?ce((function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))})):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}})),has:ce((function(e){return function(t){return se(e,t).length>0}})),contains:ce((function(e){return e=e.replace(te,ne),function(t){return(t.textContent||i(t)).indexOf(e)>-1}})),lang:ce((function(e){return W.test(e||"")||se.error("unsupported lang: "+e),e=e.replace(te,ne).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:me((function(){return[0]})),last:me((function(e,t){return[t-1]})),eq:me((function(e,t,n){return[n<0?n+t:n]})),even:me((function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e})),gt:me((function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function ke(e,t,n,r,i){for(var o,a=[],s=0,l=e.length,c=null!=t;s-1&&(o[c]=!(a[c]=d))}}else v=ke(v===a?v.splice(h,v.length):v),i?i(null,a,v,l):D.apply(a,v)}))}function Ee(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],l=a?1:0,u=xe((function(e){return e===t}),s,!0),d=xe((function(e){return I(t,e)>-1}),s,!0),f=[function(e,n,r){var i=!a&&(r||n!==c)||((t=n).nodeType?u(e,n,r):d(e,n,r));return t=null,i}];l1&&we(f),l>1&&ye(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(q,"$1"),n,l0,i=e.length>0,o=function(o,a,s,l,u){var d,h,m,v=0,b="0",y=o&&[],x=[],w=c,A=o||i&&r.find.TAG("*",u),E=k+=null==w?1:Math.random()||.1,S=A.length;for(u&&(c=a==p||a||u);b!==S&&null!=(d=A[b]);b++){if(i&&d){for(h=0,a||d.ownerDocument==p||(f(d),s=!g);m=e[h++];)if(m(d,a||p,s)){l.push(d);break}u&&(k=E)}n&&((d=!m&&d)&&v--,o&&y.push(d))}if(v+=b,n&&b!==v){for(h=0;m=t[h++];)m(y,x,a,s);if(o){if(v>0)for(;b--;)y[b]||x[b]||(x[b]=T.call(l));x=ke(x)}D.apply(l,x),u&&!o&&x.length>0&&v+t.length>1&&se.uniqueSort(l)}return u&&(k=E,c=w),y};return n?ce(o):o}(o,i))).selector=e}return s},l=se.select=function(e,t,n,i){var o,l,c,u,d,f="function"==typeof e&&e,p=!i&&a(e=f.selector||e);if(n=n||[],1===p.length){if((l=p[0]=p[0].slice(0)).length>2&&"ID"===(c=l[0]).type&&9===t.nodeType&&g&&r.relative[l[1].type]){if(!(t=(r.find.ID(c.matches[0].replace(te,ne),t)||[])[0]))return n;f&&(t=t.parentNode),e=e.slice(l.shift().value.length)}for(o=Y.needsContext.test(e)?0:l.length;o--&&(c=l[o],!r.relative[u=c.type]);)if((d=r.find[u])&&(i=d(c.matches[0].replace(te,ne),ee.test(l[0].type)&&ve(t.parentNode)||t))){if(l.splice(o,1),!(e=i.length&&ye(l)))return D.apply(n,i),n;break}}return(f||s(e,p))(i,t,!g,n,!t||ee.test(e)&&ve(t.parentNode)||t),n},n.sortStable=x.split("").sort(_).join("")===x,n.detectDuplicates=!!d,f(),n.sortDetached=ue((function(e){return 1&e.compareDocumentPosition(p.createElement("fieldset"))})),ue((function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")}))||de("type|href|height|width",(function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)})),n.attributes&&ue((function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||de("value",(function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),ue((function(e){return null==e.getAttribute("disabled")}))||de(N,(function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null})),se}(n);A.find=S,A.expr=S.selectors,A.expr[":"]=A.expr.pseudos,A.uniqueSort=A.unique=S.uniqueSort,A.text=S.getText,A.isXMLDoc=S.isXML,A.contains=S.contains,A.escapeSelector=S.escape;var $=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&A(e).is(n))break;r.push(e)}return r},C=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},_=A.expr.match.needsContext;function O(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var j=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,t,n){return v(t)?A.grep(e,(function(e,r){return!!t.call(e,r,e)!==n})):t.nodeType?A.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?A.grep(e,(function(e){return u.call(t,e)>-1!==n})):A.filter(t,e,n)}A.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?A.find.matchesSelector(r,e)?[r]:[]:A.find.matches(e,A.grep(t,(function(e){return 1===e.nodeType})))},A.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(A(e).filter((function(){for(t=0;t1?A.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&_.test(e)?A(e):e||[],!1).length}});var P,D=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(A.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||P,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:D.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof A?t[0]:t,A.merge(this,A.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:y,!0)),j.test(r[1])&&A.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=y.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(A):A.makeArray(e,this)}).prototype=A.fn,P=A(y);var R=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};function N(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}A.fn.extend({has:function(e){var t=A(e,this),n=t.length;return this.filter((function(){for(var e=0;e-1:1===n.nodeType&&A.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?A.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(A(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(A.uniqueSort(A.merge(this.get(),A(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),A.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return $(e,"parentNode")},parentsUntil:function(e,t,n){return $(e,"parentNode",n)},next:function(e){return N(e,"nextSibling")},prev:function(e){return N(e,"previousSibling")},nextAll:function(e){return $(e,"nextSibling")},prevAll:function(e){return $(e,"previousSibling")},nextUntil:function(e,t,n){return $(e,"nextSibling",n)},prevUntil:function(e,t,n){return $(e,"previousSibling",n)},siblings:function(e){return C((e.parentNode||{}).firstChild,e)},children:function(e){return C(e.firstChild)},contents:function(e){return null!=e.contentDocument&&a(e.contentDocument)?e.contentDocument:(O(e,"template")&&(e=e.content||e),A.merge([],e.childNodes))}},(function(e,t){A.fn[e]=function(n,r){var i=A.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=A.filter(r,i)),this.length>1&&(I[e]||A.uniqueSort(i),R.test(e)&&i.reverse()),this.pushStack(i)}}));var M=/[^\x20\t\r\n\f]+/g;function z(e){return e}function L(e){throw e}function B(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}A.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return A.each(e.match(M)||[],(function(e,n){t[n]=!0})),t}(e):A.extend({},e);var t,n,r,i,o=[],a=[],s=-1,l=function(){for(i=i||e.once,r=t=!0;a.length;s=-1)for(n=a.shift();++s-1;)o.splice(n,1),n<=s&&s--})),this},has:function(e){return e?A.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},A.extend({Deferred:function(e){var t=[["notify","progress",A.Callbacks("memory"),A.Callbacks("memory"),2],["resolve","done",A.Callbacks("once memory"),A.Callbacks("once memory"),0,"resolved"],["reject","fail",A.Callbacks("once memory"),A.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return A.Deferred((function(n){A.each(t,(function(t,r){var i=v(e[r[4]])&&e[r[4]];o[r[1]]((function(){var e=i&&i.apply(this,arguments);e&&v(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[e]:arguments)}))})),e=null})).promise()},then:function(e,r,i){var o=0;function a(e,t,r,i){return function(){var s=this,l=arguments,c=function(){var n,c;if(!(e=o&&(r!==L&&(s=void 0,l=[n]),t.rejectWith(s,l))}};e?u():(A.Deferred.getStackHook&&(u.stackTrace=A.Deferred.getStackHook()),n.setTimeout(u))}}return A.Deferred((function(n){t[0][3].add(a(0,n,v(i)?i:z,n.notifyWith)),t[1][3].add(a(0,n,v(e)?e:z)),t[2][3].add(a(0,n,v(r)?r:L))})).promise()},promise:function(e){return null!=e?A.extend(e,i):i}},o={};return A.each(t,(function(e,n){var a=n[2],s=n[5];i[n[1]]=a.add,s&&a.add((function(){r=s}),t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),a.add(n[3].fire),o[n[0]]=function(){return o[n[0]+"With"](this===o?void 0:this,arguments),this},o[n[0]+"With"]=a.fireWith})),i.promise(o),e&&e.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=s.call(arguments),o=A.Deferred(),a=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?s.call(arguments):n,--t||o.resolveWith(r,i)}};if(t<=1&&(B(e,o.done(a(n)).resolve,o.reject,!t),"pending"===o.state()||v(i[n]&&i[n].then)))return o.then();for(;n--;)B(i[n],a(n),o.reject);return o.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;A.Deferred.exceptionHook=function(e,t){n.console&&n.console.warn&&e&&F.test(e.name)&&n.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},A.readyException=function(e){n.setTimeout((function(){throw e}))};var q=A.Deferred();function V(){y.removeEventListener("DOMContentLoaded",V),n.removeEventListener("load",V),A.ready()}A.fn.ready=function(e){return q.then(e).catch((function(e){A.readyException(e)})),this},A.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--A.readyWait:A.isReady)||(A.isReady=!0,!0!==e&&--A.readyWait>0||q.resolveWith(y,[A]))}}),A.ready.then=q.then,"complete"===y.readyState||"loading"!==y.readyState&&!y.documentElement.doScroll?n.setTimeout(A.ready):(y.addEventListener("DOMContentLoaded",V),n.addEventListener("load",V));var U=function(e,t,n,r,i,o,a){var s=0,l=e.length,c=null==n;if("object"===k(n))for(s in i=!0,n)U(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),c&&(a?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(A(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each((function(){J.remove(this,e)}))}}),A.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,A.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=A.queue(e,t),r=n.length,i=n.shift(),o=A._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,(function(){A.dequeue(e,t)}),o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:A.Callbacks("once memory").add((function(){Q.remove(e,[t+"queue",n])}))})}}),A.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,ve=/^$|^module$|\/(?:java|ecma)script/i;pe=y.createDocumentFragment().appendChild(y.createElement("div")),(he=y.createElement("input")).setAttribute("type","radio"),he.setAttribute("checked","checked"),he.setAttribute("name","t"),pe.appendChild(he),m.checkClone=pe.cloneNode(!0).cloneNode(!0).lastChild.checked,pe.innerHTML="",m.noCloneChecked=!!pe.cloneNode(!0).lastChild.defaultValue,pe.innerHTML="",m.option=!!pe.lastChild;var be={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&O(e,t)?A.merge([e],n):n}function xe(e,t){for(var n=0,r=e.length;n",""]);var we=/<|&#?\w+;/;function ke(e,t,n,r,i){for(var o,a,s,l,c,u,d=t.createDocumentFragment(),f=[],p=0,h=e.length;p-1)i&&i.push(o);else if(c=ae(o),a=ye(d.appendChild(o),"script"),c&&xe(a),n)for(u=0;o=a[u++];)ve.test(o.type||"")&&n.push(o);return d}var Ae=/^key/,Ee=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Se=/^([^.]*)(?:\.(.+)|)/;function $e(){return!0}function Ce(){return!1}function _e(e,t){return e===function(){try{return y.activeElement}catch(e){}}()==("focus"===t)}function Oe(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Oe(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ce;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return A().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=A.guid++)),e.each((function(){A.event.add(this,t,i,r,n)}))}function je(e,t,n){n?(Q.set(e,t,!1),A.event.add(e,t,{namespace:!1,handler:function(e){var r,i,o=Q.get(this,t);if(1&e.isTrigger&&this[t]){if(o.length)(A.event.special[t]||{}).delegateType&&e.stopPropagation();else if(o=s.call(arguments),Q.set(this,t,o),r=n(this,t),this[t](),o!==(i=Q.get(this,t))||r?Q.set(this,t,!1):i={},o!==i)return e.stopImmediatePropagation(),e.preventDefault(),i.value}else o.length&&(Q.set(this,t,{value:A.event.trigger(A.extend(o[0],A.Event.prototype),o.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,t)&&A.event.add(e,t,$e)}A.event={global:{},add:function(e,t,n,r,i){var o,a,s,l,c,u,d,f,p,h,g,m=Q.get(e);if(X(e))for(n.handler&&(n=(o=n).handler,i=o.selector),i&&A.find.matchesSelector(oe,i),n.guid||(n.guid=A.guid++),(l=m.events)||(l=m.events=Object.create(null)),(a=m.handle)||(a=m.handle=function(t){return void 0!==A&&A.event.triggered!==t.type?A.event.dispatch.apply(e,arguments):void 0}),c=(t=(t||"").match(M)||[""]).length;c--;)p=g=(s=Se.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),p&&(d=A.event.special[p]||{},p=(i?d.delegateType:d.bindType)||p,d=A.event.special[p]||{},u=A.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&A.expr.match.needsContext.test(i),namespace:h.join(".")},o),(f=l[p])||((f=l[p]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(p,a)),d.add&&(d.add.call(e,u),u.handler.guid||(u.handler.guid=n.guid)),i?f.splice(f.delegateCount++,0,u):f.push(u),A.event.global[p]=!0)},remove:function(e,t,n,r,i){var o,a,s,l,c,u,d,f,p,h,g,m=Q.hasData(e)&&Q.get(e);if(m&&(l=m.events)){for(c=(t=(t||"").match(M)||[""]).length;c--;)if(p=g=(s=Se.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),p){for(d=A.event.special[p]||{},f=l[p=(r?d.delegateType:d.bindType)||p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=f.length;o--;)u=f[o],!i&&g!==u.origType||n&&n.guid!==u.guid||s&&!s.test(u.namespace)||r&&r!==u.selector&&("**"!==r||!u.selector)||(f.splice(o,1),u.selector&&f.delegateCount--,d.remove&&d.remove.call(e,u));a&&!f.length&&(d.teardown&&!1!==d.teardown.call(e,h,m.handle)||A.removeEvent(e,p,m.handle),delete l[p])}else for(p in l)A.event.remove(e,p+t[c],n,r,!0);A.isEmptyObject(l)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),l=A.event.fix(e),c=(Q.get(this,"events")||Object.create(null))[l.type]||[],u=A.event.special[l.type]||{};for(s[0]=l,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||!0!==c.disabled)){for(o=[],a={},n=0;n-1:A.find(i,this,null,[c]).length),a[i]&&o.push(r);o.length&&s.push({elem:c,handlers:o})}return c=this,l\s*$/g;function Re(e,t){return O(e,"table")&&O(11!==t.nodeType?t:t.firstChild,"tr")&&A(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ne(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Q.hasData(e)&&(s=Q.get(e).events))for(i in Q.remove(t,"handle events"),s)for(n=0,r=s[i].length;n1&&"string"==typeof h&&!m.checkClone&&Pe.test(h))return e.each((function(i){var o=e.eq(i);g&&(t[0]=h.call(this,i,o.html())),Le(o,t,n,r)}));if(f&&(o=(i=ke(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(a=A.map(ye(i,"script"),Ie)).length;d0&&xe(a,!l&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=A.event.special,o=0;void 0!==(n=e[o]);o++)if(X(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?A.event.remove(n,r):A.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),A.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return U(this,(function(e){return void 0===e?A.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return Le(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)}))},prepend:function(){return Le(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return Le(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return Le(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(A.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return A.clone(this,e,t)}))},html:function(e){return U(this,(function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Te.test(e)&&!be[(me.exec(e)||["",""])[1].toLowerCase()]){e=A.htmlPrefilter(e);try{for(;n3,oe.removeChild(e)),s}}))}();var We=["Webkit","Moz","ms"],Ye=y.createElement("div").style,Xe={};function Ze(e){var t=A.cssProps[e]||Xe[e];return t||(e in Ye?e:Xe[e]=function(e){for(var t=e[0].toUpperCase()+e.slice(1),n=We.length;n--;)if((e=We[n]+t)in Ye)return e}(e)||e)}var Qe=/^(none|table(?!-c[ea]).+)/,Je=/^--/,Ke={position:"absolute",visibility:"hidden",display:"block"},et={letterSpacing:"0",fontWeight:"400"};function tt(e,t,n){var r=re.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function nt(e,t,n,r,i,o){var a="width"===t?1:0,s=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=A.css(e,n+ie[a],!0,i)),r?("content"===n&&(l-=A.css(e,"padding"+ie[a],!0,i)),"margin"!==n&&(l-=A.css(e,"border"+ie[a]+"Width",!0,i))):(l+=A.css(e,"padding"+ie[a],!0,i),"padding"!==n?l+=A.css(e,"border"+ie[a]+"Width",!0,i):s+=A.css(e,"border"+ie[a]+"Width",!0,i));return!r&&o>=0&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-l-s-.5))||0),l}function rt(e,t,n){var r=qe(e),i=(!m.boxSizingReliable()||n)&&"border-box"===A.css(e,"boxSizing",!1,r),o=i,a=He(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Fe.test(a)){if(!n)return a;a="auto"}return(!m.boxSizingReliable()&&i||!m.reliableTrDimensions()&&O(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===A.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===A.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+nt(e,t,n||(i?"border":"content"),o,r,a)+"px"}function it(e,t,n,r,i){return new it.prototype.init(e,t,n,r,i)}A.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=He(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=Y(t),l=Je.test(t),c=e.style;if(l||(t=Ze(s)),a=A.cssHooks[t]||A.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:c[t];"string"===(o=typeof n)&&(i=re.exec(n))&&i[1]&&(n=ce(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||l||(n+=i&&i[3]||(A.cssNumber[s]?"":"px")),m.clearCloneStyle||""!==n||0!==t.indexOf("background")||(c[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(l?c.setProperty(t,n):c[t]=n))}},css:function(e,t,n,r){var i,o,a,s=Y(t);return Je.test(t)||(t=Ze(s)),(a=A.cssHooks[t]||A.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=He(e,t,r)),"normal"===i&&t in et&&(i=et[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),A.each(["height","width"],(function(e,t){A.cssHooks[t]={get:function(e,n,r){if(n)return!Qe.test(A.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?rt(e,t,r):Ve(e,Ke,(function(){return rt(e,t,r)}))},set:function(e,n,r){var i,o=qe(e),a=!m.scrollboxSize()&&"absolute"===o.position,s=(a||r)&&"border-box"===A.css(e,"boxSizing",!1,o),l=r?nt(e,t,r,s,o):0;return s&&a&&(l-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-nt(e,t,"border",!1,o)-.5)),l&&(i=re.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=A.css(e,t)),tt(0,n,l)}}})),A.cssHooks.marginLeft=Ge(m.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(He(e,"marginLeft"))||e.getBoundingClientRect().left-Ve(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),A.each({margin:"",padding:"",border:"Width"},(function(e,t){A.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+ie[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(A.cssHooks[e+t].set=tt)})),A.fn.extend({css:function(e,t){return U(this,(function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=qe(e),i=t.length;a1)}}),A.Tween=it,it.prototype={constructor:it,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||A.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(A.cssNumber[n]?"":"px")},cur:function(){var e=it.propHooks[this.prop];return e&&e.get?e.get(this):it.propHooks._default.get(this)},run:function(e){var t,n=it.propHooks[this.prop];return this.options.duration?this.pos=t=A.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):it.propHooks._default.set(this),this}},it.prototype.init.prototype=it.prototype,it.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=A.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){A.fx.step[e.prop]?A.fx.step[e.prop](e):1!==e.elem.nodeType||!A.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:A.style(e.elem,e.prop,e.now+e.unit)}}},it.propHooks.scrollTop=it.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},A.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},A.fx=it.prototype.init,A.fx.step={};var ot,at,st=/^(?:toggle|show|hide)$/,lt=/queueHooks$/;function ct(){at&&(!1===y.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(ct):n.setTimeout(ct,A.fx.interval),A.fx.tick())}function ut(){return n.setTimeout((function(){ot=void 0})),ot=Date.now()}function dt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ie[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ft(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each((function(){A.removeAttr(this,e)}))}}),A.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?A.prop(e,t,n):(1===o&&A.isXMLDoc(e)||(i=A.attrHooks[t.toLowerCase()]||(A.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void A.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=A.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!m.radioValue&&"radio"===t&&O(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?A.removeAttr(e,n):e.setAttribute(n,n),n}},A.each(A.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=gt[t]||A.find.attr;gt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=gt[a],gt[a]=i,i=null!=n(e,t,r)?a:null,gt[a]=o),i}}));var mt=/^(?:input|select|textarea|button)$/i,vt=/^(?:a|area)$/i;function bt(e){return(e.match(M)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(M)||[]}A.fn.extend({prop:function(e,t){return U(this,A.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[A.propFix[e]||e]}))}}),A.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&A.isXMLDoc(e)||(t=A.propFix[t]||t,i=A.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=A.find.attr(e,"tabindex");return t?parseInt(t,10):mt.test(e.nodeName)||vt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(A.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),A.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){A.propFix[this.toLowerCase()]=this})),A.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,l=0;if(v(e))return this.each((function(t){A(this).addClass(e.call(this,t,yt(this)))}));if((t=xt(e)).length)for(;n=this[l++];)if(i=yt(n),r=1===n.nodeType&&" "+bt(i)+" "){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=bt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,l=0;if(v(e))return this.each((function(t){A(this).removeClass(e.call(this,t,yt(this)))}));if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)for(;n=this[l++];)if(i=yt(n),r=1===n.nodeType&&" "+bt(i)+" "){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(s=bt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):v(e)?this.each((function(n){A(this).toggleClass(e.call(this,n,yt(this),t),t)})):this.each((function(){var t,i,o,a;if(r)for(i=0,o=A(this),a=xt(e);t=a[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||((t=yt(this))&&Q.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":Q.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+bt(yt(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;A.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=v(e),this.each((function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,A(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=A.map(i,(function(e){return null==e?"":e+""}))),(t=A.valHooks[this.type]||A.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))}))):i?(t=A.valHooks[i.type]||A.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(wt,""):null==n?"":n:void 0}}),A.extend({valHooks:{option:{get:function(e){var t=A.find.attr(e,"value");return null!=t?t:bt(A.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],l=a?o+1:i.length;for(r=o<0?l:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),A.each(["radio","checkbox"],(function(){A.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=A.inArray(A(e).val(),t)>-1}},m.checkOn||(A.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),m.focusin="onfocusin"in n;var kt=/^(?:focusinfocus|focusoutblur)$/,At=function(e){e.stopPropagation()};A.extend(A.event,{trigger:function(e,t,r,i){var o,a,s,l,c,u,d,f,h=[r||y],g=p.call(e,"type")?e.type:e,m=p.call(e,"namespace")?e.namespace.split("."):[];if(a=f=s=r=r||y,3!==r.nodeType&&8!==r.nodeType&&!kt.test(g+A.event.triggered)&&(g.indexOf(".")>-1&&(m=g.split("."),g=m.shift(),m.sort()),c=g.indexOf(":")<0&&"on"+g,(e=e[A.expando]?e:new A.Event(g,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=m.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:A.makeArray(t,[e]),d=A.event.special[g]||{},i||!d.trigger||!1!==d.trigger.apply(r,t))){if(!i&&!d.noBubble&&!b(r)){for(l=d.delegateType||g,kt.test(l+g)||(a=a.parentNode);a;a=a.parentNode)h.push(a),s=a;s===(r.ownerDocument||y)&&h.push(s.defaultView||s.parentWindow||n)}for(o=0;(a=h[o++])&&!e.isPropagationStopped();)f=a,e.type=o>1?l:d.bindType||g,(u=(Q.get(a,"events")||Object.create(null))[e.type]&&Q.get(a,"handle"))&&u.apply(a,t),(u=c&&a[c])&&u.apply&&X(a)&&(e.result=u.apply(a,t),!1===e.result&&e.preventDefault());return e.type=g,i||e.isDefaultPrevented()||d._default&&!1!==d._default.apply(h.pop(),t)||!X(r)||c&&v(r[g])&&!b(r)&&((s=r[c])&&(r[c]=null),A.event.triggered=g,e.isPropagationStopped()&&f.addEventListener(g,At),r[g](),e.isPropagationStopped()&&f.removeEventListener(g,At),A.event.triggered=void 0,s&&(r[c]=s)),e.result}},simulate:function(e,t,n){var r=A.extend(new A.Event,n,{type:e,isSimulated:!0});A.event.trigger(r,null,t)}}),A.fn.extend({trigger:function(e,t){return this.each((function(){A.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return A.event.trigger(e,t,n,!0)}}),m.focusin||A.each({focus:"focusin",blur:"focusout"},(function(e,t){var n=function(e){A.event.simulate(t,e.target,A.event.fix(e))};A.event.special[t]={setup:function(){var r=this.ownerDocument||this.document||this,i=Q.access(r,t);i||r.addEventListener(e,n,!0),Q.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this.document||this,i=Q.access(r,t)-1;i?Q.access(r,t,i):(r.removeEventListener(e,n,!0),Q.remove(r,t))}}}));var Et=n.location,St={guid:Date.now()},$t=/\?/;A.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||A.error("Invalid XML: "+e),t};var Ct=/\[\]$/,_t=/\r?\n/g,Ot=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function Tt(e,t,n,r){var i;if(Array.isArray(t))A.each(t,(function(t,i){n||Ct.test(e)?r(e,i):Tt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)}));else if(n||"object"!==k(t))r(e,t);else for(i in t)Tt(e+"["+i+"]",t[i],n,r)}A.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!A.isPlainObject(e))A.each(e,(function(){i(this.name,this.value)}));else for(n in e)Tt(n,e[n],t,i);return r.join("&")},A.fn.extend({serialize:function(){return A.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=A.prop(this,"elements");return e?A.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!A(this).is(":disabled")&&jt.test(this.nodeName)&&!Ot.test(e)&&(this.checked||!ge.test(e))})).map((function(e,t){var n=A(this).val();return null==n?null:Array.isArray(n)?A.map(n,(function(e){return{name:t.name,value:e.replace(_t,"\r\n")}})):{name:t.name,value:n.replace(_t,"\r\n")}})).get()}});var Pt=/%20/g,Dt=/#.*$/,Rt=/([?&])_=[^&]*/,It=/^(.*?):[ \t]*([^\r\n]*)$/gm,Nt=/^(?:GET|HEAD)$/,Mt=/^\/\//,zt={},Lt={},Bt="*/".concat("*"),Ft=y.createElement("a");function qt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(v(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Vt(e,t,n,r){var i={},o=e===Lt;function a(s){var l;return i[s]=!0,A.each(e[s]||[],(function(e,s){var c=s(t,n,r);return"string"!=typeof c||o||i[c]?o?!(l=c):void 0:(t.dataTypes.unshift(c),a(c),!1)})),l}return a(t.dataTypes[0])||!i["*"]&&a("*")}function Ut(e,t){var n,r,i=A.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&A.extend(!0,e,r),e}Ft.href=Et.href,A.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Bt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":A.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ut(Ut(e,A.ajaxSettings),t):Ut(A.ajaxSettings,e)},ajaxPrefilter:qt(zt),ajaxTransport:qt(Lt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,a,s,l,c,u,d,f,p=A.ajaxSetup({},t),h=p.context||p,g=p.context&&(h.nodeType||h.jquery)?A(h):A.event,m=A.Deferred(),v=A.Callbacks("once memory"),b=p.statusCode||{},x={},w={},k="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!a)for(a={};t=It.exec(o);)a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return c?o:null},setRequestHeader:function(e,t){return null==c&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,x[e]=t),this},overrideMimeType:function(e){return null==c&&(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)b[t]=[b[t],e[t]];return this},abort:function(e){var t=e||k;return r&&r.abort(t),S(0,t),this}};if(m.promise(E),p.url=((e||p.url||Et.href)+"").replace(Mt,Et.protocol+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(M)||[""],null==p.crossDomain){l=y.createElement("a");try{l.href=p.url,l.href=l.href,p.crossDomain=Ft.protocol+"//"+Ft.host!=l.protocol+"//"+l.host}catch(e){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=A.param(p.data,p.traditional)),Vt(zt,p,t,E),c)return E;for(d in(u=A.event&&p.global)&&0==A.active++&&A.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nt.test(p.type),i=p.url.replace(Dt,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(Pt,"+")):(f=p.url.slice(i.length),p.data&&(p.processData||"string"==typeof p.data)&&(i+=($t.test(i)?"&":"?")+p.data,delete p.data),!1===p.cache&&(i=i.replace(Rt,"$1"),f=($t.test(i)?"&":"?")+"_="+St.guid+++f),p.url=i+f),p.ifModified&&(A.lastModified[i]&&E.setRequestHeader("If-Modified-Since",A.lastModified[i]),A.etag[i]&&E.setRequestHeader("If-None-Match",A.etag[i])),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&E.setRequestHeader("Content-Type",p.contentType),E.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Bt+"; q=0.01":""):p.accepts["*"]),p.headers)E.setRequestHeader(d,p.headers[d]);if(p.beforeSend&&(!1===p.beforeSend.call(h,E,p)||c))return E.abort();if(k="abort",v.add(p.complete),E.done(p.success),E.fail(p.error),r=Vt(Lt,p,t,E)){if(E.readyState=1,u&&g.trigger("ajaxSend",[E,p]),c)return E;p.async&&p.timeout>0&&(s=n.setTimeout((function(){E.abort("timeout")}),p.timeout));try{c=!1,r.send(x,S)}catch(e){if(c)throw e;S(-1,e)}}else S(-1,"No Transport");function S(e,t,a,l){var d,f,y,x,w,k=t;c||(c=!0,s&&n.clearTimeout(s),r=void 0,o=l||"",E.readyState=e>0?4:0,d=e>=200&&e<300||304===e,a&&(x=function(e,t,n){for(var r,i,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){l.unshift(i);break}if(l[0]in n)o=l[0];else{for(i in n){if(!l[0]||e.converters[i+" "+l[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==l[0]&&l.unshift(o),n[o]}(p,E,a)),!d&&A.inArray("script",p.dataTypes)>-1&&(p.converters["text script"]=function(){}),x=function(e,t,n,r){var i,o,a,s,l,c={},u=e.dataTypes.slice();if(u[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(o=u.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=u.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(!(a=c[l+" "+o]||c["* "+o]))for(i in c)if((s=i.split(" "))[1]===o&&(a=c[l+" "+s[0]]||c["* "+s[0]])){!0===a?a=c[i]:!0!==c[i]&&(o=s[0],u.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}(p,x,E,d),d?(p.ifModified&&((w=E.getResponseHeader("Last-Modified"))&&(A.lastModified[i]=w),(w=E.getResponseHeader("etag"))&&(A.etag[i]=w)),204===e||"HEAD"===p.type?k="nocontent":304===e?k="notmodified":(k=x.state,f=x.data,d=!(y=x.error))):(y=k,!e&&k||(k="error",e<0&&(e=0))),E.status=e,E.statusText=(t||k)+"",d?m.resolveWith(h,[f,k,E]):m.rejectWith(h,[E,k,y]),E.statusCode(b),b=void 0,u&&g.trigger(d?"ajaxSuccess":"ajaxError",[E,p,d?f:y]),v.fireWith(h,[E,k]),u&&(g.trigger("ajaxComplete",[E,p]),--A.active||A.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return A.get(e,t,n,"json")},getScript:function(e,t){return A.get(e,void 0,t,"script")}}),A.each(["get","post"],(function(e,t){A[t]=function(e,n,r,i){return v(n)&&(i=i||r,r=n,n=void 0),A.ajax(A.extend({url:e,type:t,dataType:i,data:n,success:r},A.isPlainObject(e)&&e))}})),A.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),A._evalUrl=function(e,t,n){return A.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){A.globalEval(e,t,n)}})},A.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=A(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return v(e)?this.each((function(t){A(this).wrapInner(e.call(this,t))})):this.each((function(){var t=A(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=v(e);return this.each((function(n){A(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){A(this).replaceWith(this.childNodes)})),this}}),A.expr.pseudos.hidden=function(e){return!A.expr.pseudos.visible(e)},A.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},A.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Ht={0:200,1223:204},Gt=A.ajaxSettings.xhr();m.cors=!!Gt&&"withCredentials"in Gt,m.ajax=Gt=!!Gt,A.ajaxTransport((function(e){var t,r;if(m.cors||Gt&&!e.crossDomain)return{send:function(i,o){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(a,i[a]);t=function(e){return function(){t&&(t=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Ht[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),r=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&n.setTimeout((function(){t&&r()}))},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),A.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),A.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return A.globalEval(e),e}}}),A.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),A.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,i){t=A(" From 4a833a42726b8e39ae66df7200d9b02db6908a7d Mon Sep 17 00:00:00 2001 From: Emily Rockman Date: Tue, 13 Jun 2023 07:08:28 -0500 Subject: [PATCH 58/67] Move remaining unit tests to `/tests` directory (#7843) * moved remaining unit tests to directory * fix path * Delete profiles.yml * rename remaining test refs --- CONTRIBUTING.md | 6 +++--- core/dbt/clients/jinja_static.py | 2 +- pytest.ini | 1 - test/unit/__init__.py | 0 {test => tests}/unit/README.md | 0 {test => tests}/unit/mock_adapter.py | 0 {test => tests}/unit/test_adapter_connection_manager.py | 0 {test => tests}/unit/test_adapter_factory.py | 0 {test => tests}/unit/test_agate_helper.py | 0 {test => tests}/unit/test_base_column.py | 0 {test => tests}/unit/test_cache.py | 0 {test => tests}/unit/test_compiler.py | 0 {test => tests}/unit/test_config.py | 0 {test => tests}/unit/test_context.py | 0 {test => tests}/unit/test_contracts_graph_compiled.py | 0 {test => tests}/unit/test_contracts_graph_parsed.py | 0 {test => tests}/unit/test_contracts_graph_unparsed.py | 0 {test => tests}/unit/test_contracts_project.py | 0 {test => tests}/unit/test_core_dbt_utils.py | 0 {test => tests}/unit/test_deps.py | 0 {test => tests}/unit/test_docs_blocks.py | 0 {test => tests}/unit/test_docs_generate.py | 0 {test => tests}/unit/test_flags.py | 0 {test => tests}/unit/test_graph.py | 0 {test => tests}/unit/test_graph_selection.py | 0 {test => tests}/unit/test_graph_selector_methods.py | 0 {test => tests}/unit/test_graph_selector_parsing.py | 0 {test => tests}/unit/test_graph_selector_spec.py | 0 {test => tests}/unit/test_jinja.py | 0 {test => tests}/unit/test_linker.py | 0 {test => tests}/unit/test_macro_calls.py | 0 {test => tests}/unit/test_macro_resolver.py | 0 {test => tests}/unit/test_manifest.py | 0 {test => tests}/unit/test_manifest_selectors.py | 0 {test => tests}/unit/test_model_config.py | 0 {test => tests}/unit/test_node_types.py | 0 {test => tests}/unit/test_parse_manifest.py | 0 {test => tests}/unit/test_parser.py | 0 {test => tests}/unit/test_partial_parsing.py | 0 {test => tests}/unit/test_postgres_adapter.py | 0 {test => tests}/unit/test_query_headers.py | 2 +- {test => tests}/unit/test_registry_get_request_exception.py | 0 {test => tests}/unit/test_selector_errors.py | 0 {test => tests}/unit/test_semver.py | 0 {test => tests}/unit/test_sql_result.py | 0 {test => tests}/unit/test_system_client.py | 0 {test => tests}/unit/test_tracking.py | 0 {test => tests}/unit/test_utils.py | 0 {test => tests}/unit/test_yaml_renderer.py | 0 {test => tests}/unit/utils.py | 0 tox.ini | 1 - 51 files changed, 5 insertions(+), 7 deletions(-) delete mode 100644 test/unit/__init__.py rename {test => tests}/unit/README.md (100%) rename {test => tests}/unit/mock_adapter.py (100%) rename {test => tests}/unit/test_adapter_connection_manager.py (100%) rename {test => tests}/unit/test_adapter_factory.py (100%) rename {test => tests}/unit/test_agate_helper.py (100%) rename {test => tests}/unit/test_base_column.py (100%) rename {test => tests}/unit/test_cache.py (100%) rename {test => tests}/unit/test_compiler.py (100%) rename {test => tests}/unit/test_config.py (100%) rename {test => tests}/unit/test_context.py (100%) rename {test => tests}/unit/test_contracts_graph_compiled.py (100%) rename {test => tests}/unit/test_contracts_graph_parsed.py (100%) rename {test => tests}/unit/test_contracts_graph_unparsed.py (100%) rename {test => tests}/unit/test_contracts_project.py (100%) rename {test => tests}/unit/test_core_dbt_utils.py (100%) rename {test => tests}/unit/test_deps.py (100%) rename {test => tests}/unit/test_docs_blocks.py (100%) rename {test => tests}/unit/test_docs_generate.py (100%) rename {test => tests}/unit/test_flags.py (100%) rename {test => tests}/unit/test_graph.py (100%) rename {test => tests}/unit/test_graph_selection.py (100%) rename {test => tests}/unit/test_graph_selector_methods.py (100%) rename {test => tests}/unit/test_graph_selector_parsing.py (100%) rename {test => tests}/unit/test_graph_selector_spec.py (100%) rename {test => tests}/unit/test_jinja.py (100%) rename {test => tests}/unit/test_linker.py (100%) rename {test => tests}/unit/test_macro_calls.py (100%) rename {test => tests}/unit/test_macro_resolver.py (100%) rename {test => tests}/unit/test_manifest.py (100%) rename {test => tests}/unit/test_manifest_selectors.py (100%) rename {test => tests}/unit/test_model_config.py (100%) rename {test => tests}/unit/test_node_types.py (100%) rename {test => tests}/unit/test_parse_manifest.py (100%) rename {test => tests}/unit/test_parser.py (100%) rename {test => tests}/unit/test_partial_parsing.py (100%) rename {test => tests}/unit/test_postgres_adapter.py (100%) rename {test => tests}/unit/test_query_headers.py (97%) rename {test => tests}/unit/test_registry_get_request_exception.py (100%) rename {test => tests}/unit/test_selector_errors.py (100%) rename {test => tests}/unit/test_semver.py (100%) rename {test => tests}/unit/test_sql_result.py (100%) rename {test => tests}/unit/test_system_client.py (100%) rename {test => tests}/unit/test_tracking.py (100%) rename {test => tests}/unit/test_utils.py (100%) rename {test => tests}/unit/test_yaml_renderer.py (100%) rename {test => tests}/unit/utils.py (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7643483f3d6..dda10c0da21 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -171,9 +171,9 @@ Finally, you can also run a specific test or group of tests using [`pytest`](htt ```sh # run all unit tests in a file -python3 -m pytest test/unit/test_graph.py +python3 -m pytest tests/unit/test_graph.py # run a specific unit test -python3 -m pytest test/unit/test_graph.py::GraphTest::test__dependency_list +python3 -m pytest tests/unit/test_graph.py::GraphTest::test__dependency_list # run specific Postgres integration tests (old way) python3 -m pytest -m profile_postgres test/integration/074_postgres_unlogged_table_tests # run specific Postgres integration tests (new way) @@ -185,7 +185,7 @@ python3 -m pytest tests/functional/sources ### Unit, Integration, Functional? Here are some general rules for adding tests: -* unit tests (`test/unit` & `tests/unit`) don’t need to access a database; "pure Python" tests should be written as unit tests +* unit tests (`tests/unit`) don’t need to access a database; "pure Python" tests should be written as unit tests * functional tests (`test/integration` & `tests/functional`) cover anything that interacts with a database, namely adapter * *everything in* `test/*` *is being steadily migrated to* `tests/*` diff --git a/core/dbt/clients/jinja_static.py b/core/dbt/clients/jinja_static.py index 47790166ae5..8184c43622e 100644 --- a/core/dbt/clients/jinja_static.py +++ b/core/dbt/clients/jinja_static.py @@ -141,7 +141,7 @@ def statically_parse_adapter_dispatch(func_call, ctx, db_wrapper): macro = db_wrapper.dispatch(func_name, macro_namespace=macro_namespace).macro func_name = f"{macro.package_name}.{macro.name}" possible_macro_calls.append(func_name) - else: # this is only for test/unit/test_macro_calls.py + else: # this is only for tests/unit/test_macro_calls.py if macro_namespace: packages = [macro_namespace] else: diff --git a/pytest.ini b/pytest.ini index fb950db7c9c..0760d49a55a 100644 --- a/pytest.ini +++ b/pytest.ini @@ -5,6 +5,5 @@ filterwarnings = env_files = test.env testpaths = - test/unit tests/functional tests/unit diff --git a/test/unit/__init__.py b/test/unit/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/test/unit/README.md b/tests/unit/README.md similarity index 100% rename from test/unit/README.md rename to tests/unit/README.md diff --git a/test/unit/mock_adapter.py b/tests/unit/mock_adapter.py similarity index 100% rename from test/unit/mock_adapter.py rename to tests/unit/mock_adapter.py diff --git a/test/unit/test_adapter_connection_manager.py b/tests/unit/test_adapter_connection_manager.py similarity index 100% rename from test/unit/test_adapter_connection_manager.py rename to tests/unit/test_adapter_connection_manager.py diff --git a/test/unit/test_adapter_factory.py b/tests/unit/test_adapter_factory.py similarity index 100% rename from test/unit/test_adapter_factory.py rename to tests/unit/test_adapter_factory.py diff --git a/test/unit/test_agate_helper.py b/tests/unit/test_agate_helper.py similarity index 100% rename from test/unit/test_agate_helper.py rename to tests/unit/test_agate_helper.py diff --git a/test/unit/test_base_column.py b/tests/unit/test_base_column.py similarity index 100% rename from test/unit/test_base_column.py rename to tests/unit/test_base_column.py diff --git a/test/unit/test_cache.py b/tests/unit/test_cache.py similarity index 100% rename from test/unit/test_cache.py rename to tests/unit/test_cache.py diff --git a/test/unit/test_compiler.py b/tests/unit/test_compiler.py similarity index 100% rename from test/unit/test_compiler.py rename to tests/unit/test_compiler.py diff --git a/test/unit/test_config.py b/tests/unit/test_config.py similarity index 100% rename from test/unit/test_config.py rename to tests/unit/test_config.py diff --git a/test/unit/test_context.py b/tests/unit/test_context.py similarity index 100% rename from test/unit/test_context.py rename to tests/unit/test_context.py diff --git a/test/unit/test_contracts_graph_compiled.py b/tests/unit/test_contracts_graph_compiled.py similarity index 100% rename from test/unit/test_contracts_graph_compiled.py rename to tests/unit/test_contracts_graph_compiled.py diff --git a/test/unit/test_contracts_graph_parsed.py b/tests/unit/test_contracts_graph_parsed.py similarity index 100% rename from test/unit/test_contracts_graph_parsed.py rename to tests/unit/test_contracts_graph_parsed.py diff --git a/test/unit/test_contracts_graph_unparsed.py b/tests/unit/test_contracts_graph_unparsed.py similarity index 100% rename from test/unit/test_contracts_graph_unparsed.py rename to tests/unit/test_contracts_graph_unparsed.py diff --git a/test/unit/test_contracts_project.py b/tests/unit/test_contracts_project.py similarity index 100% rename from test/unit/test_contracts_project.py rename to tests/unit/test_contracts_project.py diff --git a/test/unit/test_core_dbt_utils.py b/tests/unit/test_core_dbt_utils.py similarity index 100% rename from test/unit/test_core_dbt_utils.py rename to tests/unit/test_core_dbt_utils.py diff --git a/test/unit/test_deps.py b/tests/unit/test_deps.py similarity index 100% rename from test/unit/test_deps.py rename to tests/unit/test_deps.py diff --git a/test/unit/test_docs_blocks.py b/tests/unit/test_docs_blocks.py similarity index 100% rename from test/unit/test_docs_blocks.py rename to tests/unit/test_docs_blocks.py diff --git a/test/unit/test_docs_generate.py b/tests/unit/test_docs_generate.py similarity index 100% rename from test/unit/test_docs_generate.py rename to tests/unit/test_docs_generate.py diff --git a/test/unit/test_flags.py b/tests/unit/test_flags.py similarity index 100% rename from test/unit/test_flags.py rename to tests/unit/test_flags.py diff --git a/test/unit/test_graph.py b/tests/unit/test_graph.py similarity index 100% rename from test/unit/test_graph.py rename to tests/unit/test_graph.py diff --git a/test/unit/test_graph_selection.py b/tests/unit/test_graph_selection.py similarity index 100% rename from test/unit/test_graph_selection.py rename to tests/unit/test_graph_selection.py diff --git a/test/unit/test_graph_selector_methods.py b/tests/unit/test_graph_selector_methods.py similarity index 100% rename from test/unit/test_graph_selector_methods.py rename to tests/unit/test_graph_selector_methods.py diff --git a/test/unit/test_graph_selector_parsing.py b/tests/unit/test_graph_selector_parsing.py similarity index 100% rename from test/unit/test_graph_selector_parsing.py rename to tests/unit/test_graph_selector_parsing.py diff --git a/test/unit/test_graph_selector_spec.py b/tests/unit/test_graph_selector_spec.py similarity index 100% rename from test/unit/test_graph_selector_spec.py rename to tests/unit/test_graph_selector_spec.py diff --git a/test/unit/test_jinja.py b/tests/unit/test_jinja.py similarity index 100% rename from test/unit/test_jinja.py rename to tests/unit/test_jinja.py diff --git a/test/unit/test_linker.py b/tests/unit/test_linker.py similarity index 100% rename from test/unit/test_linker.py rename to tests/unit/test_linker.py diff --git a/test/unit/test_macro_calls.py b/tests/unit/test_macro_calls.py similarity index 100% rename from test/unit/test_macro_calls.py rename to tests/unit/test_macro_calls.py diff --git a/test/unit/test_macro_resolver.py b/tests/unit/test_macro_resolver.py similarity index 100% rename from test/unit/test_macro_resolver.py rename to tests/unit/test_macro_resolver.py diff --git a/test/unit/test_manifest.py b/tests/unit/test_manifest.py similarity index 100% rename from test/unit/test_manifest.py rename to tests/unit/test_manifest.py diff --git a/test/unit/test_manifest_selectors.py b/tests/unit/test_manifest_selectors.py similarity index 100% rename from test/unit/test_manifest_selectors.py rename to tests/unit/test_manifest_selectors.py diff --git a/test/unit/test_model_config.py b/tests/unit/test_model_config.py similarity index 100% rename from test/unit/test_model_config.py rename to tests/unit/test_model_config.py diff --git a/test/unit/test_node_types.py b/tests/unit/test_node_types.py similarity index 100% rename from test/unit/test_node_types.py rename to tests/unit/test_node_types.py diff --git a/test/unit/test_parse_manifest.py b/tests/unit/test_parse_manifest.py similarity index 100% rename from test/unit/test_parse_manifest.py rename to tests/unit/test_parse_manifest.py diff --git a/test/unit/test_parser.py b/tests/unit/test_parser.py similarity index 100% rename from test/unit/test_parser.py rename to tests/unit/test_parser.py diff --git a/test/unit/test_partial_parsing.py b/tests/unit/test_partial_parsing.py similarity index 100% rename from test/unit/test_partial_parsing.py rename to tests/unit/test_partial_parsing.py diff --git a/test/unit/test_postgres_adapter.py b/tests/unit/test_postgres_adapter.py similarity index 100% rename from test/unit/test_postgres_adapter.py rename to tests/unit/test_postgres_adapter.py diff --git a/test/unit/test_query_headers.py b/tests/unit/test_query_headers.py similarity index 97% rename from test/unit/test_query_headers.py rename to tests/unit/test_query_headers.py index 68b8df69b18..9e814720a76 100644 --- a/test/unit/test_query_headers.py +++ b/tests/unit/test_query_headers.py @@ -3,7 +3,7 @@ from dbt.adapters.base.query_headers import MacroQueryStringSetter -from test.unit.utils import config_from_parts_or_dicts +from tests.unit.utils import config_from_parts_or_dicts class TestQueryHeaders(TestCase): diff --git a/test/unit/test_registry_get_request_exception.py b/tests/unit/test_registry_get_request_exception.py similarity index 100% rename from test/unit/test_registry_get_request_exception.py rename to tests/unit/test_registry_get_request_exception.py diff --git a/test/unit/test_selector_errors.py b/tests/unit/test_selector_errors.py similarity index 100% rename from test/unit/test_selector_errors.py rename to tests/unit/test_selector_errors.py diff --git a/test/unit/test_semver.py b/tests/unit/test_semver.py similarity index 100% rename from test/unit/test_semver.py rename to tests/unit/test_semver.py diff --git a/test/unit/test_sql_result.py b/tests/unit/test_sql_result.py similarity index 100% rename from test/unit/test_sql_result.py rename to tests/unit/test_sql_result.py diff --git a/test/unit/test_system_client.py b/tests/unit/test_system_client.py similarity index 100% rename from test/unit/test_system_client.py rename to tests/unit/test_system_client.py diff --git a/test/unit/test_tracking.py b/tests/unit/test_tracking.py similarity index 100% rename from test/unit/test_tracking.py rename to tests/unit/test_tracking.py diff --git a/test/unit/test_utils.py b/tests/unit/test_utils.py similarity index 100% rename from test/unit/test_utils.py rename to tests/unit/test_utils.py diff --git a/test/unit/test_yaml_renderer.py b/tests/unit/test_yaml_renderer.py similarity index 100% rename from test/unit/test_yaml_renderer.py rename to tests/unit/test_yaml_renderer.py diff --git a/test/unit/utils.py b/tests/unit/utils.py similarity index 100% rename from test/unit/utils.py rename to tests/unit/utils.py diff --git a/tox.ini b/tox.ini index 97d9a488f30..4a1a63634ca 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,6 @@ passenv = DBT_* PYTEST_ADDOPTS commands = - {envpython} -m pytest --cov=core {posargs} test/unit {envpython} -m pytest --cov=core {posargs} tests/unit deps = -rdev-requirements.txt From ca73a2aa15aba760abd4503dab7a16d6023c389f Mon Sep 17 00:00:00 2001 From: Gerda Shank Date: Tue, 13 Jun 2023 09:08:09 -0400 Subject: [PATCH 59/67] Use project directory in path selector instead of cwd (#7829) * Use contextvar to store and get project_root for path selector method * Changie * Modify test to check Path selector with project-dir * Don't set cv_project_root in base task if no config --- .changes/unreleased/Fixes-20230608-135952.yaml | 6 ++++++ core/dbt/graph/selector_methods.py | 5 +++-- core/dbt/task/base.py | 3 +++ core/dbt/task/contextvars.py | 6 ++++++ .../graph_selection/test_graph_selection.py | 17 +++++++++++++++-- 5 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230608-135952.yaml create mode 100644 core/dbt/task/contextvars.py diff --git a/.changes/unreleased/Fixes-20230608-135952.yaml b/.changes/unreleased/Fixes-20230608-135952.yaml new file mode 100644 index 00000000000..6c84e05403b --- /dev/null +++ b/.changes/unreleased/Fixes-20230608-135952.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Fix path selector when using project-dir +time: 2023-06-08T13:59:52.95775-04:00 +custom: + Author: gshank + Issue: "7819" diff --git a/core/dbt/graph/selector_methods.py b/core/dbt/graph/selector_methods.py index e132175e972..d35e0c21aff 100644 --- a/core/dbt/graph/selector_methods.py +++ b/core/dbt/graph/selector_methods.py @@ -26,6 +26,7 @@ DbtRuntimeError, ) from dbt.node_types import NodeType +from dbt.task.contextvars import cv_project_root SELECTOR_GLOB = "*" @@ -324,8 +325,8 @@ def search(self, included_nodes: Set[UniqueId], selector: str) -> Iterator[Uniqu class PathSelectorMethod(SelectorMethod): def search(self, included_nodes: Set[UniqueId], selector: str) -> Iterator[UniqueId]: """Yields nodes from included that match the given path.""" - # use '.' and not 'root' for easy comparison - root = Path.cwd() + # get project root from contextvar + root = Path(cv_project_root.get()) paths = set(p.relative_to(root) for p in root.glob(selector)) for node, real_node in self.all_nodes(included_nodes): ofp = Path(real_node.original_file_path) diff --git a/core/dbt/task/base.py b/core/dbt/task/base.py index a7ec1e046db..1e28a91ef3f 100644 --- a/core/dbt/task/base.py +++ b/core/dbt/task/base.py @@ -45,6 +45,7 @@ from dbt.graph import Graph from dbt.logger import log_manager from .printer import print_run_result_error +from dbt.task.contextvars import cv_project_root class NoneConfig: @@ -75,6 +76,8 @@ def __init__(self, args, config, project=None): self.args = args self.config = config self.project = config if isinstance(config, Project) else project + if self.config: + cv_project_root.set(self.config.project_root) @classmethod def pre_init_hook(cls, args): diff --git a/core/dbt/task/contextvars.py b/core/dbt/task/contextvars.py new file mode 100644 index 00000000000..6524b0935d1 --- /dev/null +++ b/core/dbt/task/contextvars.py @@ -0,0 +1,6 @@ +from contextvars import ContextVar + +# This is a place to hold common contextvars used in tasks so that we can +# avoid circular imports. + +cv_project_root: ContextVar = ContextVar("project_root") diff --git a/tests/functional/graph_selection/test_graph_selection.py b/tests/functional/graph_selection/test_graph_selection.py index 6263c1d2c12..88b45c8bcf5 100644 --- a/tests/functional/graph_selection/test_graph_selection.py +++ b/tests/functional/graph_selection/test_graph_selection.py @@ -121,11 +121,24 @@ def test_locally_qualified_name(self, project): check_result_nodes_by_name(results, ["nested_users", "subdir", "versioned"]) assert_correct_schemas(project) - results = run_dbt(["run", "--select", "models/test/subdir*"]) + os.chdir( + project.profiles_dir + ) # Change to random directory to test that Path selector works with project-dir + results = run_dbt( + ["run", "--project-dir", str(project.project_root), "--select", "models/test/subdir*"] + ) check_result_nodes_by_name(results, ["nested_users", "subdir", "versioned"]) assert_correct_schemas(project) - results = run_dbt(["build", "--select", "models/patch_path_selection_schema.yml"]) + results = run_dbt( + [ + "build", + "--project-dir", + str(project.project_root), + "--select", + "models/patch_path_selection_schema.yml", + ] + ) check_result_nodes_by_name(results, ["subdir"]) assert_correct_schemas(project) From 60524c0f8eab116f0b0660cf1de5a699a810b830 Mon Sep 17 00:00:00 2001 From: mirnawong1 <89008547+mirnawong1@users.noreply.github.com> Date: Tue, 13 Jun 2023 14:51:21 +0100 Subject: [PATCH 60/67] update adapters url (#7779) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update adapters url in response to [docs.getedbt.com pr 3465](https://github.com/dbt-labs/docs.getdbt.com/issues/3465), updating this error message to point to the correct URL, which was recently changed. old URL: https://docs.getdbt.com/docs/supported-data-platforms#adapter-installation new URL: https://docs.getdbt.com/docs/connect-adapters#install-using-the-cli thank you @dbeatty10 for your 🦅 👀 ! * adding changie entry * Update .changes/unreleased/Breaking Changes-20230612-161159.yaml --------- Co-authored-by: Emily Rockman --- .changes/unreleased/Breaking Changes-20230612-161159.yaml | 6 ++++++ core/dbt/exceptions.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Breaking Changes-20230612-161159.yaml diff --git a/.changes/unreleased/Breaking Changes-20230612-161159.yaml b/.changes/unreleased/Breaking Changes-20230612-161159.yaml new file mode 100644 index 00000000000..7d6eca90585 --- /dev/null +++ b/.changes/unreleased/Breaking Changes-20230612-161159.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Updating this error message to point to the correct URL +time: 2023-06-12T16:11:59.181953+01:00 +custom: + Author: mirnawong1 + Issue: "7789" diff --git a/core/dbt/exceptions.py b/core/dbt/exceptions.py index 9109b8dffd0..b336776761d 100644 --- a/core/dbt/exceptions.py +++ b/core/dbt/exceptions.py @@ -703,7 +703,7 @@ def __init__(self): super().__init__(msg=self.get_message()) def get_message(self) -> str: - msg = "No adapters available. Learn how to install an adapter by going to https://docs.getdbt.com/docs/supported-data-platforms#adapter-installation" + msg = "No adapters available. Learn how to install an adapter by going to https://docs.getdbt.com/docs/connect-adapters#install-using-the-cli" return msg From d46e8855efa6b9fd13e2cb090e074aea3628f7c0 Mon Sep 17 00:00:00 2001 From: Emily Rockman Date: Tue, 13 Jun 2023 09:47:50 -0500 Subject: [PATCH 61/67] Allow ProjectDependency to have extra fields (#7834) * Allow ProjectDependency to have extra fields * changelog --- .changes/unreleased/Fixes-20230609-121930.yaml | 6 ++++++ core/dbt/contracts/publication.py | 17 ++++++++++++----- .../multi_project/test_publication.py | 11 ++++++++++- 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230609-121930.yaml diff --git a/.changes/unreleased/Fixes-20230609-121930.yaml b/.changes/unreleased/Fixes-20230609-121930.yaml new file mode 100644 index 00000000000..324ab410808 --- /dev/null +++ b/.changes/unreleased/Fixes-20230609-121930.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Allow project dependencies to use miscellaneous keys +time: 2023-06-09T12:19:30.469487-05:00 +custom: + Author: emmyoop + Issue: "7497" diff --git a/core/dbt/contracts/publication.py b/core/dbt/contracts/publication.py index ca201503888..300683457e2 100644 --- a/core/dbt/contracts/publication.py +++ b/core/dbt/contracts/publication.py @@ -1,18 +1,25 @@ -from typing import Optional, List, Dict, Any +from typing import Any, Dict, List, Optional from datetime import datetime -from dbt.dataclass_schema import dbtClassMixin + from dataclasses import dataclass, field -from dbt.contracts.util import BaseArtifactMetadata, ArtifactMixin, schema_version +from dbt.contracts.util import ( + AdditionalPropertiesMixin, + ArtifactMixin, + BaseArtifactMetadata, + schema_version, +) from dbt.contracts.graph.unparsed import NodeVersion from dbt.contracts.graph.nodes import ManifestOrPublicNode -from dbt.node_types import NodeType, AccessType +from dbt.dataclass_schema import dbtClassMixin, ExtensibleDbtClassMixin +from dbt.node_types import AccessType, NodeType @dataclass -class ProjectDependency(dbtClassMixin): +class ProjectDependency(AdditionalPropertiesMixin, ExtensibleDbtClassMixin): name: str + _extra: Dict[str, Any] = field(default_factory=dict) @dataclass diff --git a/tests/functional/multi_project/test_publication.py b/tests/functional/multi_project/test_publication.py index eae657899fd..7e2a51c0ae2 100644 --- a/tests/functional/multi_project/test_publication.py +++ b/tests/functional/multi_project/test_publication.py @@ -7,7 +7,7 @@ run_dbt_and_capture, get_logging_events, ) -from dbt.contracts.publication import PublicationArtifact, PublicModel +from dbt.contracts.publication import ProjectDependency, PublicationArtifact, PublicModel from dbt.exceptions import ( PublicationConfigNotFound, TargetNotFoundError, @@ -43,6 +43,7 @@ dependencies_yml = """ projects: - name: marketing + custom_field: some value """ marketing_pub_json = """ @@ -156,6 +157,14 @@ def test_pub_artifacts(self, project): publication = PublicationArtifact.from_dict(publication_dict) assert publication.dependencies == ["marketing"] + # check project_dependencies in manifest + project_dependencies = manifest.project_dependencies + assert project_dependencies + project_dependency = project_dependencies.projects[0] + assert isinstance(project_dependency, ProjectDependency) + assert project_dependency.name == "marketing" + assert "custom_field" in project_dependency._extra + # source_node, target_model_name, target_model_package, target_model_version, current_project, node_package resolved_node = manifest.resolve_ref(None, "fct_one", "marketing", None, "test", "test") assert resolved_node From 83d163add58838b14638d21f59ab5a4510d24031 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Tue, 13 Jun 2023 15:32:56 -0400 Subject: [PATCH 62/67] Respect column `quote` config in model contracts (#7537) --- .../unreleased/Fixes-20230506-191813.yaml | 6 ++ core/dbt/adapters/base/impl.py | 3 +- core/dbt/adapters/sql/impl.py | 1 + .../macros/adapters/columns.sql | 3 +- .../models/table/create_table_as.sql | 17 ++++-- .../dbt/include/postgres/macros/adapters.sql | 4 +- .../macros/utils/columns_spec_ddl.sql | 10 --- .../dbt/tests/adapter/constraints/fixtures.py | 44 ++++++++++++- .../adapter/constraints/test_constraints.py | 61 ++++++++++++++----- 9 files changed, 115 insertions(+), 34 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230506-191813.yaml diff --git a/.changes/unreleased/Fixes-20230506-191813.yaml b/.changes/unreleased/Fixes-20230506-191813.yaml new file mode 100644 index 00000000000..c08e2ad930d --- /dev/null +++ b/.changes/unreleased/Fixes-20230506-191813.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Respect column 'quote' config in model contracts +time: 2023-05-06T19:18:13.351819+02:00 +custom: + Author: jtcohen6 + Issue: "7370" diff --git a/core/dbt/adapters/base/impl.py b/core/dbt/adapters/base/impl.py index 59e2a0a93a6..1fa2ce903f6 100644 --- a/core/dbt/adapters/base/impl.py +++ b/core/dbt/adapters/base/impl.py @@ -1346,7 +1346,8 @@ def render_raw_columns_constraints(cls, raw_columns: Dict[str, Dict[str, Any]]) rendered_column_constraints = [] for v in raw_columns.values(): - rendered_column_constraint = [f"{v['name']} {v['data_type']}"] + col_name = cls.quote(v["name"]) if v.get("quote") else v["name"] + rendered_column_constraint = [f"{col_name} {v['data_type']}"] for con in v.get("constraints", None): constraint = cls._parse_column_constraint(con) c = cls.process_parsed_constraint(constraint, cls.render_column_constraint) diff --git a/core/dbt/adapters/sql/impl.py b/core/dbt/adapters/sql/impl.py index 835302a9b0d..2f26d3a2e63 100644 --- a/core/dbt/adapters/sql/impl.py +++ b/core/dbt/adapters/sql/impl.py @@ -197,6 +197,7 @@ def list_relations_without_caching( ) return relations + @classmethod def quote(self, identifier): return '"{}"'.format(identifier) diff --git a/core/dbt/include/global_project/macros/adapters/columns.sql b/core/dbt/include/global_project/macros/adapters/columns.sql index 0d7e5532b9c..b5a03ec53b5 100644 --- a/core/dbt/include/global_project/macros/adapters/columns.sql +++ b/core/dbt/include/global_project/macros/adapters/columns.sql @@ -49,7 +49,8 @@ {%- if col['data_type'] is not defined -%} {{ col_err.append(col['name']) }} {%- endif -%} - cast(null as {{ col['data_type'] }}) as {{ col['name'] }}{{ ", " if not loop.last }} + {% set col_name = adapter.quote(col['name']) if col.get('quote') else col['name'] %} + cast(null as {{ col['data_type'] }}) as {{ col_name }}{{ ", " if not loop.last }} {%- endfor -%} {%- if (col_err | length) > 0 -%} {{ exceptions.column_type_missing(column_names=col_err) }} diff --git a/core/dbt/include/global_project/macros/materializations/models/table/create_table_as.sql b/core/dbt/include/global_project/macros/materializations/models/table/create_table_as.sql index af70f12bc31..8e15d85d9cd 100644 --- a/core/dbt/include/global_project/macros/materializations/models/table/create_table_as.sql +++ b/core/dbt/include/global_project/macros/materializations/models/table/create_table_as.sql @@ -36,15 +36,24 @@ ); {%- endmacro %} + +{% macro default__get_column_names() %} + {#- loop through user_provided_columns to get column names -#} + {%- set user_provided_columns = model['columns'] -%} + {%- for i in user_provided_columns %} + {%- set col = user_provided_columns[i] -%} + {%- set col_name = adapter.quote(col['name']) if col.get('quote') else col['name'] -%} + {{ col_name }}{{ ", " if not loop.last }} + {%- endfor -%} +{% endmacro %} + + {% macro get_select_subquery(sql) %} {{ return(adapter.dispatch('get_select_subquery', 'dbt')(sql)) }} {% endmacro %} {% macro default__get_select_subquery(sql) %} - select - {% for column in model['columns'] %} - {{ column }}{{ ", " if not loop.last }} - {% endfor %} + select {{ adapter.dispatch('get_column_names', 'dbt')() }} from ( {{ sql }} ) as model_subq diff --git a/plugins/postgres/dbt/include/postgres/macros/adapters.sql b/plugins/postgres/dbt/include/postgres/macros/adapters.sql index 53d2bd622b3..c8bdab6eccb 100644 --- a/plugins/postgres/dbt/include/postgres/macros/adapters.sql +++ b/plugins/postgres/dbt/include/postgres/macros/adapters.sql @@ -13,7 +13,9 @@ {% if contract_config.enforced %} {{ get_assert_columns_equivalent(sql) }} {{ get_table_columns_and_constraints() }} ; - insert into {{ relation }} {{ get_column_names() }} + insert into {{ relation }} ( + {{ adapter.dispatch('get_column_names', 'dbt')() }} + ) {%- set sql = get_select_subquery(sql) %} {% else %} as diff --git a/plugins/postgres/dbt/include/postgres/macros/utils/columns_spec_ddl.sql b/plugins/postgres/dbt/include/postgres/macros/utils/columns_spec_ddl.sql index b2f83bea4a9..e69de29bb2d 100644 --- a/plugins/postgres/dbt/include/postgres/macros/utils/columns_spec_ddl.sql +++ b/plugins/postgres/dbt/include/postgres/macros/utils/columns_spec_ddl.sql @@ -1,10 +0,0 @@ -{% macro get_column_names() %} - {# loop through user_provided_columns to get column names #} - {%- set user_provided_columns = model['columns'] -%} - ( - {% for i in user_provided_columns %} - {% set col = user_provided_columns[i] %} - {{ col['name'] }} {{ "," if not loop.last }} - {% endfor %} - ) -{% endmacro %} diff --git a/tests/adapter/dbt/tests/adapter/constraints/fixtures.py b/tests/adapter/dbt/tests/adapter/constraints/fixtures.py index 7896eb04516..c8c98b26bd5 100644 --- a/tests/adapter/dbt/tests/adapter/constraints/fixtures.py +++ b/tests/adapter/dbt/tests/adapter/constraints/fixtures.py @@ -251,6 +251,16 @@ '2019-01-01' as date_day """ + +# 'from' is a reserved word, so it must be quoted +my_model_with_quoted_column_name_sql = """ +select + 'blue' as {{ adapter.quote('from') }}, + 1 as id, + '2019-01-01' as date_day +""" + + model_schema_yml = """ version: 2 models: @@ -260,7 +270,6 @@ enforced: true columns: - name: id - quote: true data_type: integer description: hello constraints: @@ -344,7 +353,6 @@ enforced: true columns: - name: id - quote: true data_type: integer description: hello constraints: @@ -454,7 +462,6 @@ expression: {schema}.foreign_key_model (id) columns: - name: id - quote: true data_type: integer description: hello constraints: @@ -490,6 +497,37 @@ data_type: {data_type} """ + +model_quoted_column_schema_yml = """ +version: 2 +models: + - name: my_model + config: + contract: + enforced: true + materialized: table + constraints: + - type: check + # this one is the on the user + expression: ("from" = 'blue') + columns: [ '"from"' ] + columns: + - name: id + data_type: integer + description: hello + constraints: + - type: not_null + tests: + - unique + - name: from # reserved word + quote: true + data_type: text + constraints: + - type: not_null + - name: date_day + data_type: text +""" + model_contract_header_schema_yml = """ version: 2 models: diff --git a/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py b/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py index de78143aff7..188c3793032 100644 --- a/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py +++ b/tests/adapter/dbt/tests/adapter/constraints/test_constraints.py @@ -23,9 +23,11 @@ my_model_incremental_wrong_name_sql, my_model_with_nulls_sql, my_model_incremental_with_nulls_sql, + my_model_with_quoted_column_name_sql, model_schema_yml, model_fk_constraint_schema_yml, constrained_model_schema_yml, + model_quoted_column_schema_yml, foreign_key_model_sql, my_model_wrong_order_depends_on_fk_sql, my_model_incremental_wrong_order_depends_on_fk_sql, @@ -165,11 +167,12 @@ def test__constraints_correct_column_data_types(self, project, data_types): def _normalize_whitespace(input: str) -> str: - return re.sub(r"\s+", " ", input).lower().strip() + subbed = re.sub(r"\s+", " ", input) + return re.sub(r"\s?([\(\),])\s?", r"\1", subbed).lower().strip() def _find_and_replace(sql, find, replace): - sql_tokens = sql.split(" ") + sql_tokens = sql.split() for idx in [n for n, x in enumerate(sql_tokens) if find in x]: sql_tokens[idx] = replace return " ".join(sql_tokens) @@ -235,17 +238,12 @@ def test__constraints_ddl(self, project, expected_sql): # the name is not what we're testing here anyways and varies based on materialization # TODO: consider refactoring this to introspect logs instead generated_sql = read_file("target", "run", "test", "models", "my_model.sql") - generated_sql_modified = _normalize_whitespace(generated_sql) - generated_sql_generic = _find_and_replace( - generated_sql_modified, "my_model", "" - ) + generated_sql_generic = _find_and_replace(generated_sql, "my_model", "") generated_sql_generic = _find_and_replace( generated_sql_generic, "foreign_key_model", "" ) - expected_sql_check = _normalize_whitespace(expected_sql) - - assert expected_sql_check == generated_sql_generic + assert _normalize_whitespace(expected_sql) == _normalize_whitespace(generated_sql_generic) class BaseConstraintsRollback: @@ -485,15 +483,50 @@ def test__model_constraints_ddl(self, project, expected_sql): # assert at least my_model was run - additional upstreams may or may not be provided to the test setup via models fixture assert len(results) >= 1 generated_sql = read_file("target", "run", "test", "models", "my_model.sql") - generated_sql_modified = _normalize_whitespace(generated_sql) - generated_sql_generic = _find_and_replace( - generated_sql_modified, "my_model", "" - ) + + generated_sql_generic = _find_and_replace(generated_sql, "my_model", "") generated_sql_generic = _find_and_replace( generated_sql_generic, "foreign_key_model", "" ) - assert _normalize_whitespace(expected_sql) == generated_sql_generic + + assert _normalize_whitespace(expected_sql) == _normalize_whitespace(generated_sql_generic) class TestModelConstraintsRuntimeEnforcement(BaseModelConstraintsRuntimeEnforcement): pass + + +class BaseConstraintQuotedColumn(BaseConstraintsRuntimeDdlEnforcement): + @pytest.fixture(scope="class") + def models(self): + return { + "my_model.sql": my_model_with_quoted_column_name_sql, + "constraints_schema.yml": model_quoted_column_schema_yml, + } + + @pytest.fixture(scope="class") + def expected_sql(self): + return """ +create table ( + id integer not null, + "from" text not null, + date_day text, + check (("from" = 'blue')) +) ; +insert into ( + id, "from", date_day +) +( + select id, "from", date_day + from ( + select + 'blue' as "from", + 1 as id, + '2019-01-01' as date_day + ) as model_subq +); +""" + + +class TestConstraintQuotedColumn(BaseConstraintQuotedColumn): + pass From 38c0600982200a561403af8a3b63f5bbc4a94ecf Mon Sep 17 00:00:00 2001 From: Quigley Malcolm Date: Tue, 13 Jun 2023 13:25:35 -0700 Subject: [PATCH 63/67] Update SemanticModel node to match DSI 0.1.0dev3 protocols (#7848) * Add tests to ensure our semantic layer nodes satisfy the DSI protocols These tests create runtime checkable versions of the protocols defined in DSI. Thus we can instantiate instances of our semantic layer nodes and use `isinstance` to check that they satisfy the protocol. These `runtime_checkable` versions of the protocols should only exist in testing and should never be used in the actual package code. * Update the `Dimension` object of `SemanticModel` node to match DSI protocol * Make `UnparsedDimension` more strict and update schema readers accordingly * Update the `Entity` object of `SemanticModel` node to match DSI protocol * Make `UnparsedEntity` more strict and update schema readers accordingly * Update the `Measure` object of `SemanticModel` node to match DSI protocol * Make `UnparsedMeasure` more strict and update schema readers accordingly * Update the `SemanticModel` node to match DSI protocol A lot of the additions are helper functions which we don't actually use in core. This is a known issue. We're in the process of removing a fair number of them from the DSI protocol spec. However, in the meantime we need to implement them to satisfy the protocol unfortunately. * Make `UnparsedSemanticModel` more strict and update schema readers accordingly * Changie entry for updating SemanticModel node --- .../unreleased/Fixes-20230612-175854.yaml | 7 + core/dbt/contracts/graph/nodes.py | 100 ++++++++---- core/dbt/contracts/graph/semantic_models.py | 152 ++++++++++++++++++ core/dbt/contracts/graph/unparsed.py | 45 ++++-- core/dbt/parser/schema_yaml_readers.py | 95 ++++++++++- .../test_semantic_model_parsing.py | 4 +- ..._semantic_layer_nodes_satisfy_protocols.py | 123 ++++++++++++++ 7 files changed, 472 insertions(+), 54 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230612-175854.yaml create mode 100644 core/dbt/contracts/graph/semantic_models.py create mode 100644 tests/unit/test_semantic_layer_nodes_satisfy_protocols.py diff --git a/.changes/unreleased/Fixes-20230612-175854.yaml b/.changes/unreleased/Fixes-20230612-175854.yaml new file mode 100644 index 00000000000..2353d4d8152 --- /dev/null +++ b/.changes/unreleased/Fixes-20230612-175854.yaml @@ -0,0 +1,7 @@ +kind: Fixes +body: Update SemanticModel node to properly impelment the DSI 0.1.0dev3 SemanticModel + protocol spec +time: 2023-06-12T17:58:54.289704-07:00 +custom: + Author: QMalcolm + Issue: 7833 7827 diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 5f3513fbda3..a3a00441a41 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -12,17 +12,21 @@ from dbt.clients.system import write_file from dbt.contracts.files import FileHash -from dbt.contracts.graph.unparsed import ( +from dbt.contracts.graph.semantic_models import ( + Defaults, Dimension, - Docs, Entity, + Measure, + SourceFileMetadata, +) +from dbt.contracts.graph.unparsed import ( + Docs, ExposureType, ExternalTable, FreshnessThreshold, HasYamlMetadata, MacroArgument, MaturityType, - Measure, Owner, Quoting, TestDef, @@ -43,7 +47,11 @@ from dbt.events.contextvars import set_contextvars from dbt.flags import get_flags from dbt.node_types import ModelLanguage, NodeType, AccessType -from dbt_semantic_interfaces.references import MeasureReference +from dbt_semantic_interfaces.references import ( + MeasureReference, + LinkableElementReference, + SemanticModelReference, +) from dbt_semantic_interfaces.references import MetricReference as DSIMetricReference from dbt_semantic_interfaces.type_enums.metric_type import MetricType from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity @@ -554,30 +562,6 @@ def depends_on_macros(self): return self.depends_on.macros -@dataclass -class FileSlice(dbtClassMixin, Replaceable): - """Provides file slice level context about what something was created from. - - Implementation of the dbt-semantic-interfaces `FileSlice` protocol - """ - - filename: str - content: str - start_line_number: int - end_line_number: int - - -@dataclass -class SourceFileMetadata(dbtClassMixin, Replaceable): - """Provides file context about what something was created from. - - Implementation of the dbt-semantic-interfaces `Metadata` protocol - """ - - repo_file_path: str - file_slice: FileSlice - - # ==================================== # CompiledNode subclasses # ==================================== @@ -703,7 +687,6 @@ def same_contract(self, old, adapter_type=None) -> bool: and old_value.constraints != self.columns[old_key].constraints and old.materialization_enforces_constraints ): - for old_constraint in old_value.constraints: if ( old_constraint not in self.columns[old_key].constraints @@ -1493,12 +1476,63 @@ class NodeRelation(dbtClassMixin): @dataclass class SemanticModel(GraphNode): - description: Optional[str] model: str node_relation: Optional[NodeRelation] - entities: Sequence[Entity] - measures: Sequence[Measure] - dimensions: Sequence[Dimension] + description: Optional[str] = None + defaults: Optional[Defaults] = None + entities: Sequence[Entity] = field(default_factory=list) + measures: Sequence[Measure] = field(default_factory=list) + dimensions: Sequence[Dimension] = field(default_factory=list) + metadata: Optional[SourceFileMetadata] = None + + @property + def entity_references(self) -> List[LinkableElementReference]: + return [entity.reference for entity in self.entities] + + @property + def dimension_references(self) -> List[LinkableElementReference]: + return [dimension.reference for dimension in self.dimensions] + + @property + def measure_references(self) -> List[MeasureReference]: + return [measure.reference for measure in self.measures] + + @property + def has_validity_dimensions(self) -> bool: + return any([dim.validity_params is not None for dim in self.dimensions]) + + @property + def validity_start_dimension(self) -> Optional[Dimension]: + validity_start_dims = [ + dim for dim in self.dimensions if dim.validity_params and dim.validity_params.is_start + ] + if not validity_start_dims: + return None + return validity_start_dims[0] + + @property + def validity_end_dimension(self) -> Optional[Dimension]: + validity_end_dims = [ + dim for dim in self.dimensions if dim.validity_params and dim.validity_params.is_end + ] + if not validity_end_dims: + return None + return validity_end_dims[0] + + @property + def partitions(self) -> List[Dimension]: # noqa: D + return [dim for dim in self.dimensions or [] if dim.is_partition] + + @property + def partition(self) -> Optional[Dimension]: + partitions = self.partitions + if not partitions: + return None + return partitions[0] + + @property + def reference(self) -> SemanticModelReference: + return SemanticModelReference(semantic_model_name=self.name) # ==================================== diff --git a/core/dbt/contracts/graph/semantic_models.py b/core/dbt/contracts/graph/semantic_models.py new file mode 100644 index 00000000000..596b8075d49 --- /dev/null +++ b/core/dbt/contracts/graph/semantic_models.py @@ -0,0 +1,152 @@ +from dataclasses import dataclass +from dbt.dataclass_schema import dbtClassMixin +from dbt_semantic_interfaces.references import ( + DimensionReference, + EntityReference, + MeasureReference, + TimeDimensionReference, +) +from dbt_semantic_interfaces.type_enums.aggregation_type import AggregationType +from dbt_semantic_interfaces.type_enums.dimension_type import DimensionType +from dbt_semantic_interfaces.type_enums.entity_type import EntityType +from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity +from typing import List, Optional + + +@dataclass +class FileSlice(dbtClassMixin): + """Provides file slice level context about what something was created from. + + Implementation of the dbt-semantic-interfaces `FileSlice` protocol + """ + + filename: str + content: str + start_line_number: int + end_line_number: int + + +@dataclass +class SourceFileMetadata(dbtClassMixin): + """Provides file context about what something was created from. + + Implementation of the dbt-semantic-interfaces `Metadata` protocol + """ + + repo_file_path: str + file_slice: FileSlice + + +@dataclass +class Defaults(dbtClassMixin): + agg_time_dimension: Optional[str] = None + + +# ==================================== +# Dimension objects +# ==================================== + + +@dataclass +class DimensionValidityParams(dbtClassMixin): + is_start: bool = False + is_end: bool = False + + +@dataclass +class DimensionTypeParams(dbtClassMixin): + time_granularity: TimeGranularity + validity_params: Optional[DimensionValidityParams] = None + + +@dataclass +class Dimension(dbtClassMixin): + name: str + type: DimensionType + description: Optional[str] = None + is_partition: bool = False + type_params: Optional[DimensionTypeParams] = None + expr: Optional[str] = None + metadata: Optional[SourceFileMetadata] = None + + @property + def reference(self) -> DimensionReference: + return DimensionReference(element_name=self.name) + + @property + def time_dimension_reference(self) -> Optional[TimeDimensionReference]: + if self.type == DimensionType.TIME: + return TimeDimensionReference(element_name=self.name) + else: + return None + + @property + def validity_params(self) -> Optional[DimensionValidityParams]: + if self.type_params: + return self.type_params.validity_params + else: + return None + + +# ==================================== +# Entity objects +# ==================================== + + +@dataclass +class Entity(dbtClassMixin): + name: str + type: EntityType + description: Optional[str] = None + role: Optional[str] = None + expr: Optional[str] = None + + @property + def reference(self) -> EntityReference: + return EntityReference(element_name=self.name) + + @property + def is_linkable_entity_type(self) -> bool: + return self.type in (EntityType.PRIMARY, EntityType.UNIQUE, EntityType.NATURAL) + + +# ==================================== +# Measure objects +# ==================================== + + +@dataclass +class MeasureAggregationParameters(dbtClassMixin): + percentile: Optional[float] = None + use_discrete_percentile: Optional[bool] = None + use_approximate_percentile: Optional[bool] = None + + +@dataclass +class NonAdditiveDimension(dbtClassMixin): + name: str + window_choice: AggregationType + window_grouples: List[str] + + +@dataclass +class Measure(dbtClassMixin): + name: str + agg: AggregationType + description: Optional[str] = None + create_metric: bool = False + expr: Optional[str] = None + agg_params: Optional[MeasureAggregationParameters] = None + non_additive_dimension: Optional[NonAdditiveDimension] = None + agg_time_dimension: Optional[str] = None + + @property + def checked_agg_time_dimension(self) -> TimeDimensionReference: + if self.agg_time_dimension is not None: + return TimeDimensionReference(element_name=self.agg_time_dimension) + else: + raise Exception("Measure is missing agg_time_dimension!") + + @property + def reference(self) -> MeasureReference: + return MeasureReference(element_name=self.name) diff --git a/core/dbt/contracts/graph/unparsed.py b/core/dbt/contracts/graph/unparsed.py index eaa9c75e46a..593fd4c5fc1 100644 --- a/core/dbt/contracts/graph/unparsed.py +++ b/core/dbt/contracts/graph/unparsed.py @@ -3,6 +3,11 @@ from dbt import deprecations from dbt.node_types import NodeType +from dbt.contracts.graph.semantic_models import ( + Defaults, + DimensionValidityParams, + MeasureAggregationParameters, +) from dbt.contracts.util import ( AdditionalPropertiesMixin, Mergeable, @@ -673,52 +678,58 @@ def validate(cls, data): @dataclass -class Entity(dbtClassMixin): +class UnparsedEntity(dbtClassMixin): name: str - type: str # actually an enum + type: str # EntityType enum description: Optional[str] = None role: Optional[str] = None expr: Optional[str] = None @dataclass -class MeasureAggregationParameters(dbtClassMixin): - percentile: Optional[float] = None - use_discrete_percentile: bool = False - use_approximate_percentile: bool = False +class UnparsedNonAdditiveDimension(dbtClassMixin): + name: str + window_choice: str # AggregationType enum + window_grouples: List[str] @dataclass -class Measure(dbtClassMixin): +class UnparsedMeasure(dbtClassMixin): name: str agg: str # actually an enum description: Optional[str] = None - create_metric: Optional[bool] = None + create_metric: bool = False expr: Optional[str] = None agg_params: Optional[MeasureAggregationParameters] = None - non_additive_dimension: Optional[Dict[str, Any]] = None + non_additive_dimension: Optional[UnparsedNonAdditiveDimension] = None agg_time_dimension: Optional[str] = None @dataclass -class Dimension(dbtClassMixin): +class UnparsedDimensionTypeParams(dbtClassMixin): + time_granularity: str # TimeGranularity enum + validity_params: Optional[DimensionValidityParams] = None + + +@dataclass +class UnparsedDimension(dbtClassMixin): name: str type: str # actually an enum description: Optional[str] = None - is_partition: Optional[bool] = False - type_params: Optional[Dict[str, Any]] = None + is_partition: bool = False + type_params: Optional[UnparsedDimensionTypeParams] = None expr: Optional[str] = None - # TODO metadata: Optional[Metadata] (this would actually be the YML for the dimension) @dataclass class UnparsedSemanticModel(dbtClassMixin): name: str - description: Optional[str] model: str # looks like "ref(...)" - entities: List[Entity] = field(default_factory=list) - measures: List[Measure] = field(default_factory=list) - dimensions: List[Dimension] = field(default_factory=list) + description: Optional[str] = None + defaults: Optional[Defaults] = None + entities: List[UnparsedEntity] = field(default_factory=list) + measures: List[UnparsedMeasure] = field(default_factory=list) + dimensions: List[UnparsedDimension] = field(default_factory=list) def normalize_date(d: Optional[datetime.date]) -> Optional[datetime.datetime]: diff --git a/core/dbt/parser/schema_yaml_readers.py b/core/dbt/parser/schema_yaml_readers.py index 4a343fc9256..2815f83b450 100644 --- a/core/dbt/parser/schema_yaml_readers.py +++ b/core/dbt/parser/schema_yaml_readers.py @@ -2,12 +2,17 @@ from dbt.parser.common import YamlBlock from dbt.node_types import NodeType from dbt.contracts.graph.unparsed import ( + UnparsedDimension, + UnparsedDimensionTypeParams, + UnparsedEntity, UnparsedExposure, UnparsedGroup, + UnparsedMeasure, UnparsedMetric, UnparsedMetricInput, UnparsedMetricInputMeasure, UnparsedMetricTypeParams, + UnparsedNonAdditiveDimension, UnparsedSemanticModel, ) from dbt.contracts.graph.nodes import ( @@ -21,6 +26,13 @@ SemanticModel, WhereFilter, ) +from dbt.contracts.graph.semantic_models import ( + Dimension, + DimensionTypeParams, + Entity, + Measure, + NonAdditiveDimension, +) from dbt.exceptions import DbtInternalError, YamlParseDictError, JSONValidationError from dbt.context.providers import generate_parse_exposure from dbt.contracts.graph.model_config import MetricConfig, ExposureConfig @@ -31,6 +43,9 @@ ) from dbt.clients.jinja import get_rendered from dbt.dataclass_schema import ValidationError +from dbt_semantic_interfaces.type_enums.aggregation_type import AggregationType +from dbt_semantic_interfaces.type_enums.dimension_type import DimensionType +from dbt_semantic_interfaces.type_enums.entity_type import EntityType from dbt_semantic_interfaces.type_enums.metric_type import MetricType from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity from typing import List, Optional, Union @@ -408,6 +423,79 @@ def __init__(self, schema_parser: SchemaParser, yaml: YamlBlock): self.schema_parser = schema_parser self.yaml = yaml + def _get_dimension_type_params( + self, unparsed: Optional[UnparsedDimensionTypeParams] + ) -> Optional[DimensionTypeParams]: + if unparsed is not None: + return DimensionTypeParams( + time_granularity=TimeGranularity(unparsed.time_granularity), + validity_params=unparsed.validity_params, + ) + else: + return None + + def _get_dimensions(self, unparsed_dimensions: List[UnparsedDimension]) -> List[Dimension]: + dimensions: List[Dimension] = [] + for unparsed in unparsed_dimensions: + dimensions.append( + Dimension( + name=unparsed.name, + type=DimensionType(unparsed.type), + description=unparsed.description, + is_partition=unparsed.is_partition, + type_params=self._get_dimension_type_params(unparsed=unparsed.type_params), + expr=unparsed.expr, + metadata=None, # TODO: requires a fair bit of parsing context + ) + ) + return dimensions + + def _get_entities(self, unparsed_entities: List[UnparsedEntity]) -> List[Entity]: + entities: List[Entity] = [] + for unparsed in unparsed_entities: + entities.append( + Entity( + name=unparsed.name, + type=EntityType(unparsed.type), + description=unparsed.description, + role=unparsed.role, + expr=unparsed.expr, + ) + ) + + return entities + + def _get_non_additive_dimension( + self, unparsed: Optional[UnparsedNonAdditiveDimension] + ) -> Optional[NonAdditiveDimension]: + if unparsed is not None: + return NonAdditiveDimension( + name=unparsed.name, + window_choice=AggregationType(unparsed.window_choice), + window_grouples=unparsed.window_grouples, + ) + else: + return None + + def _get_measures(self, unparsed_measures: List[UnparsedMeasure]) -> List[Measure]: + measures: List[Measure] = [] + for unparsed in unparsed_measures: + measures.append( + Measure( + name=unparsed.name, + agg=AggregationType(unparsed.agg), + description=unparsed.description, + create_metric=unparsed.create_metric, + expr=unparsed.expr, + agg_params=unparsed.agg_params, + non_additive_dimension=self._get_non_additive_dimension( + unparsed.non_additive_dimension + ), + agg_time_dimension=unparsed.agg_time_dimension, + ) + ) + return measures + def parse_semantic_model(self, unparsed: UnparsedSemanticModel): package_name = self.project.project_name unique_id = f"{NodeType.SemanticModel}.{package_name}.{unparsed.name}" @@ -427,9 +515,10 @@ def parse_semantic_model(self, unparsed: UnparsedSemanticModel): path=path, resource_type=NodeType.SemanticModel, unique_id=unique_id, - entities=unparsed.entities, - measures=unparsed.measures, - dimensions=unparsed.dimensions, + entities=self._get_entities(unparsed.entities), + measures=self._get_measures(unparsed.measures), + dimensions=self._get_dimensions(unparsed.dimensions), + defaults=unparsed.defaults, ) self.manifest.add_semantic_model(self.yaml.file, parsed) diff --git a/tests/functional/semantic_models/test_semantic_model_parsing.py b/tests/functional/semantic_models/test_semantic_model_parsing.py index 9a422f69a10..e0fc2cd72a7 100644 --- a/tests/functional/semantic_models/test_semantic_model_parsing.py +++ b/tests/functional/semantic_models/test_semantic_model_parsing.py @@ -12,6 +12,9 @@ description: This is the revenue semantic model. It should be able to use doc blocks model: ref('fct_revenue') + defaults: + agg_time_dimension: ds + measures: - name: txn_revenue expr: revenue @@ -22,7 +25,6 @@ type: time expr: created_at type_params: - is_primary: True time_granularity: day entities: diff --git a/tests/unit/test_semantic_layer_nodes_satisfy_protocols.py b/tests/unit/test_semantic_layer_nodes_satisfy_protocols.py new file mode 100644 index 00000000000..68a062433af --- /dev/null +++ b/tests/unit/test_semantic_layer_nodes_satisfy_protocols.py @@ -0,0 +1,123 @@ +from dbt.contracts.graph.nodes import ( + Metric, + MetricInputMeasure, + MetricTypeParams, + NodeRelation, + SemanticModel, + WhereFilter, +) +from dbt.contracts.graph.semantic_models import Dimension, DimensionTypeParams, Entity, Measure +from dbt.node_types import NodeType +from dbt_semantic_interfaces.protocols.dimension import Dimension as DSIDimension +from dbt_semantic_interfaces.protocols.entity import Entity as DSIEntitiy +from dbt_semantic_interfaces.protocols.measure import Measure as DSIMeasure +from dbt_semantic_interfaces.protocols.metric import Metric as DSIMetric +from dbt_semantic_interfaces.protocols.semantic_model import SemanticModel as DSISemanticModel +from dbt_semantic_interfaces.type_enums.dimension_type import DimensionType +from dbt_semantic_interfaces.type_enums.entity_type import EntityType +from dbt_semantic_interfaces.type_enums.metric_type import MetricType +from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity +from typing import Protocol, runtime_checkable + + +@runtime_checkable +class RuntimeCheckableSemanticModel(DSISemanticModel, Protocol): + pass + + +@runtime_checkable +class RuntimeCheckableDimension(DSIDimension, Protocol): + pass + + +@runtime_checkable +class RuntimeCheckableEntity(DSIEntitiy, Protocol): + pass + + +@runtime_checkable +class RuntimeCheckableMeasure(DSIMeasure, Protocol): + pass + + +@runtime_checkable +class RuntimeCheckableMetric(DSIMetric, Protocol): + pass + + +def test_semantic_model_node_satisfies_protocol(): + test_semantic_model = SemanticModel( + name="test_semantic_model", + description="a test semantic_model", + resource_type=NodeType.SemanticModel, + package_name="package_name", + path="path.to.semantic_model", + original_file_path="path/to/file", + unique_id="not_like_the_other_semantic_models", + fqn=["fully", "qualified", "name"], + model="ref('a_model')", + node_relation=NodeRelation( + alias="test_alias", + schema_name="test_schema_name", + ), + entities=[], + measures=[], + dimensions=[], + ) + assert isinstance(test_semantic_model, RuntimeCheckableSemanticModel) + + +def test_dimension_satisfies_protocol(): + dimension = Dimension( + name="test_dimension", + description="a test dimension", + type=DimensionType.TIME, + type_params=DimensionTypeParams( + time_granularity=TimeGranularity.DAY, + ), + ) + assert isinstance(dimension, RuntimeCheckableDimension) + + +def test_entity_satisfies_protocol(): + entity = Entity( + name="test_entity", + description="a test entity", + type=EntityType.PRIMARY, + expr="id", + role="a_role", + ) + assert isinstance(entity, RuntimeCheckableEntity) + + +def test_measure_satisfies_protocol(): + measure = Measure( + name="test_measure", + description="a test measure", + agg="sum", + create_metric=True, + expr="amount", + agg_time_dimension="a_time_dimension", + ) + assert isinstance(measure, RuntimeCheckableMeasure) + + +def test_metric_node_satisfies_protocol(): + metric = Metric( + name="a_metric", + resource_type=NodeType.Metric, + package_name="package_name", + path="path.to.semantic_model", + original_file_path="path/to/file", + unique_id="not_like_the_other_semantic_models", + fqn=["fully", "qualified", "name"], + description="a test metric", + label="A test metric", + type=MetricType.SIMPLE, + type_params=MetricTypeParams( + measure=MetricInputMeasure( + name="a_test_measure", filter=WhereFilter(where_sql_template="a_dimension is true") + ) + ), + ) + assert isinstance(metric, RuntimeCheckableMetric) From 7068688181fd765cc5a248561fa54d24395a3a10 Mon Sep 17 00:00:00 2001 From: Github Build Bot Date: Tue, 13 Jun 2023 20:54:08 +0000 Subject: [PATCH 64/67] Bumping version to 1.6.0b4 and generate changelog --- .bumpversion.cfg | 2 +- .changes/1.6.0-b4.md | 21 ++++++++++++++++ .../Breaking Changes-20230612-161159.yaml | 0 .../Docs-20230531-115419.yaml | 0 .../Fixes-20230506-191813.yaml | 0 .../Fixes-20230608-135952.yaml | 0 .../Fixes-20230609-121930.yaml | 0 .../Fixes-20230612-175854.yaml | 0 .../Under the Hood-20230612-070827.yaml | 0 CHANGELOG.md | 24 ++++++++++++++++++- core/dbt/version.py | 2 +- core/setup.py | 2 +- docker/Dockerfile | 12 +++++----- .../dbt/adapters/postgres/__version__.py | 2 +- plugins/postgres/setup.py | 2 +- .../adapter/dbt/tests/adapter/__version__.py | 2 +- tests/adapter/setup.py | 2 +- 17 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 .changes/1.6.0-b4.md rename .changes/{unreleased => 1.6.0}/Breaking Changes-20230612-161159.yaml (100%) rename .changes/{unreleased => 1.6.0}/Docs-20230531-115419.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230506-191813.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230608-135952.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230609-121930.yaml (100%) rename .changes/{unreleased => 1.6.0}/Fixes-20230612-175854.yaml (100%) rename .changes/{unreleased => 1.6.0}/Under the Hood-20230612-070827.yaml (100%) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 98ac244eba2..215f5b78d6c 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.6.0b3 +current_version = 1.6.0b4 parse = (?P[\d]+) # major version number \.(?P[\d]+) # minor version number \.(?P[\d]+) # patch version number diff --git a/.changes/1.6.0-b4.md b/.changes/1.6.0-b4.md new file mode 100644 index 00000000000..89e0f4e3d4f --- /dev/null +++ b/.changes/1.6.0-b4.md @@ -0,0 +1,21 @@ +## dbt-core 1.6.0-b4 - June 13, 2023 + +### Fixes + +- Respect column 'quote' config in model contracts ([#7370](https://github.com/dbt-labs/dbt-core/issues/7370)) +- Fix path selector when using project-dir ([#7819](https://github.com/dbt-labs/dbt-core/issues/7819)) +- Allow project dependencies to use miscellaneous keys ([#7497](https://github.com/dbt-labs/dbt-core/issues/7497)) +- Updating this error message to point to the correct URL ([#7789](https://github.com/dbt-labs/dbt-core/issues/7789)) +- Update SemanticModel node to properly impelment the DSI 0.1.0dev3 SemanticModel protocol spec ([#7833](https://github.com/dbt-labs/dbt-core/issues/7833), [#7827](https://github.com/dbt-labs/dbt-core/issues/7827)) + +### Docs + +- Fix for column tests not rendering on quoted columns ([dbt-docs/#201](https://github.com/dbt-labs/dbt-docs/issues/201)) + +### Under the Hood + +- Rm space from NodeType strings ([#7841](https://github.com/dbt-labs/dbt-core/issues/7841)) + +### Contributors +- [@drewbanin](https://github.com/drewbanin) ([#201](https://github.com/dbt-labs/dbt-core/issues/201)) +- [@mirnawong1](https://github.com/mirnawong1) ([#7789](https://github.com/dbt-labs/dbt-core/issues/7789)) diff --git a/.changes/unreleased/Breaking Changes-20230612-161159.yaml b/.changes/1.6.0/Breaking Changes-20230612-161159.yaml similarity index 100% rename from .changes/unreleased/Breaking Changes-20230612-161159.yaml rename to .changes/1.6.0/Breaking Changes-20230612-161159.yaml diff --git a/.changes/unreleased/Docs-20230531-115419.yaml b/.changes/1.6.0/Docs-20230531-115419.yaml similarity index 100% rename from .changes/unreleased/Docs-20230531-115419.yaml rename to .changes/1.6.0/Docs-20230531-115419.yaml diff --git a/.changes/unreleased/Fixes-20230506-191813.yaml b/.changes/1.6.0/Fixes-20230506-191813.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230506-191813.yaml rename to .changes/1.6.0/Fixes-20230506-191813.yaml diff --git a/.changes/unreleased/Fixes-20230608-135952.yaml b/.changes/1.6.0/Fixes-20230608-135952.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230608-135952.yaml rename to .changes/1.6.0/Fixes-20230608-135952.yaml diff --git a/.changes/unreleased/Fixes-20230609-121930.yaml b/.changes/1.6.0/Fixes-20230609-121930.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230609-121930.yaml rename to .changes/1.6.0/Fixes-20230609-121930.yaml diff --git a/.changes/unreleased/Fixes-20230612-175854.yaml b/.changes/1.6.0/Fixes-20230612-175854.yaml similarity index 100% rename from .changes/unreleased/Fixes-20230612-175854.yaml rename to .changes/1.6.0/Fixes-20230612-175854.yaml diff --git a/.changes/unreleased/Under the Hood-20230612-070827.yaml b/.changes/1.6.0/Under the Hood-20230612-070827.yaml similarity index 100% rename from .changes/unreleased/Under the Hood-20230612-070827.yaml rename to .changes/1.6.0/Under the Hood-20230612-070827.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index e2a6443b4ed..07b0214d0b3 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,29 @@ - "Breaking changes" listed under a version may require action from end users or external maintainers when upgrading to that version. - Do not edit this file directly. This file is auto-generated using [changie](https://github.com/miniscruff/changie). For details on how to document a change, see [the contributing guide](https://github.com/dbt-labs/dbt-core/blob/main/CONTRIBUTING.md#adding-changelog-entry) +## dbt-core 1.6.0-b4 - June 13, 2023 + +### Fixes + +- Respect column 'quote' config in model contracts ([#7370](https://github.com/dbt-labs/dbt-core/issues/7370)) +- Fix path selector when using project-dir ([#7819](https://github.com/dbt-labs/dbt-core/issues/7819)) +- Allow project dependencies to use miscellaneous keys ([#7497](https://github.com/dbt-labs/dbt-core/issues/7497)) +- Updating this error message to point to the correct URL ([#7789](https://github.com/dbt-labs/dbt-core/issues/7789)) +- Update SemanticModel node to properly impelment the DSI 0.1.0dev3 SemanticModel protocol spec ([#7833](https://github.com/dbt-labs/dbt-core/issues/7833), [#7827](https://github.com/dbt-labs/dbt-core/issues/7827)) + +### Docs + +- Fix for column tests not rendering on quoted columns ([dbt-docs/#201](https://github.com/dbt-labs/dbt-docs/issues/201)) + +### Under the Hood + +- Rm space from NodeType strings ([#7841](https://github.com/dbt-labs/dbt-core/issues/7841)) + +### Contributors +- [@drewbanin](https://github.com/drewbanin) ([#201](https://github.com/dbt-labs/dbt-core/issues/201)) +- [@mirnawong1](https://github.com/mirnawong1) ([#7789](https://github.com/dbt-labs/dbt-core/issues/7789)) + + ## dbt-core 1.6.0-b3 - June 08, 2023 ### Breaking Changes @@ -52,7 +75,6 @@ - [@sdebruyn](https://github.com/sdebruyn) ([#7082](https://github.com/dbt-labs/dbt-core/issues/7082)) - [@stu-k](https://github.com/stu-k) ([#7299](https://github.com/dbt-labs/dbt-core/issues/7299), [#7551](https://github.com/dbt-labs/dbt-core/issues/7551)) - ## dbt-core 1.6.0-b2 - May 25, 2023 ### Features diff --git a/core/dbt/version.py b/core/dbt/version.py index de20632d60e..782a058b202 100644 --- a/core/dbt/version.py +++ b/core/dbt/version.py @@ -232,5 +232,5 @@ def _get_adapter_plugin_names() -> Iterator[str]: yield plugin_name -__version__ = "1.6.0b3" +__version__ = "1.6.0b4" installed = get_installed_version() diff --git a/core/setup.py b/core/setup.py index 6da8e0ef8b1..d8b8384283f 100644 --- a/core/setup.py +++ b/core/setup.py @@ -25,7 +25,7 @@ package_name = "dbt-core" -package_version = "1.6.0b3" +package_version = "1.6.0b4" description = """With dbt, data analysts and engineers can build analytics \ the way engineers build applications.""" diff --git a/docker/Dockerfile b/docker/Dockerfile index a38e857d8bf..d900158888a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,12 +14,12 @@ FROM --platform=$build_for python:3.11.2-slim-bullseye as base # N.B. The refs updated automagically every release via bumpversion # N.B. dbt-postgres is currently found in the core codebase so a value of dbt-core@ is correct -ARG dbt_core_ref=dbt-core@v1.6.0b3 -ARG dbt_postgres_ref=dbt-core@v1.6.0b3 -ARG dbt_redshift_ref=dbt-redshift@v1.6.0b3 -ARG dbt_bigquery_ref=dbt-bigquery@v1.6.0b3 -ARG dbt_snowflake_ref=dbt-snowflake@v1.6.0b3 -ARG dbt_spark_ref=dbt-spark@v1.6.0b3 +ARG dbt_core_ref=dbt-core@v1.6.0b4 +ARG dbt_postgres_ref=dbt-core@v1.6.0b4 +ARG dbt_redshift_ref=dbt-redshift@v1.6.0b4 +ARG dbt_bigquery_ref=dbt-bigquery@v1.6.0b4 +ARG dbt_snowflake_ref=dbt-snowflake@v1.6.0b4 +ARG dbt_spark_ref=dbt-spark@v1.6.0b4 # special case args ARG dbt_spark_version=all ARG dbt_third_party diff --git a/plugins/postgres/dbt/adapters/postgres/__version__.py b/plugins/postgres/dbt/adapters/postgres/__version__.py index 0c2870f87d7..09185249665 100644 --- a/plugins/postgres/dbt/adapters/postgres/__version__.py +++ b/plugins/postgres/dbt/adapters/postgres/__version__.py @@ -1 +1 @@ -version = "1.6.0b3" +version = "1.6.0b4" diff --git a/plugins/postgres/setup.py b/plugins/postgres/setup.py index 657ccba11fa..98fe08e3edd 100644 --- a/plugins/postgres/setup.py +++ b/plugins/postgres/setup.py @@ -41,7 +41,7 @@ def _dbt_psycopg2_name(): package_name = "dbt-postgres" -package_version = "1.6.0b3" +package_version = "1.6.0b4" description = """The postgres adapter plugin for dbt (data build tool)""" this_directory = os.path.abspath(os.path.dirname(__file__)) diff --git a/tests/adapter/dbt/tests/adapter/__version__.py b/tests/adapter/dbt/tests/adapter/__version__.py index 0c2870f87d7..09185249665 100644 --- a/tests/adapter/dbt/tests/adapter/__version__.py +++ b/tests/adapter/dbt/tests/adapter/__version__.py @@ -1 +1 @@ -version = "1.6.0b3" +version = "1.6.0b4" diff --git a/tests/adapter/setup.py b/tests/adapter/setup.py index 4003fdea981..7e0a487ec9c 100644 --- a/tests/adapter/setup.py +++ b/tests/adapter/setup.py @@ -20,7 +20,7 @@ package_name = "dbt-tests-adapter" -package_version = "1.6.0b3" +package_version = "1.6.0b4" description = """The dbt adapter tests for adapter plugins""" this_directory = os.path.abspath(os.path.dirname(__file__)) From f16bae0ab96dfd8a277726f1a97ea9eb5f3c5c9e Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Wed, 14 Jun 2023 12:23:20 -0400 Subject: [PATCH 65/67] Fix: `dbt show --inline` with `private` models (#7838) * Add functional test * Check resource_type before DbtReferenceError * Changelog entry --- .changes/unreleased/Fixes-20230609-191546.yaml | 6 ++++++ core/dbt/context/providers.py | 3 +++ core/dbt/parser/manifest.py | 9 +++++++-- tests/functional/show/fixtures.py | 12 ++++++++++++ tests/functional/show/test_show.py | 18 ++++++++++++++++++ 5 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 .changes/unreleased/Fixes-20230609-191546.yaml diff --git a/.changes/unreleased/Fixes-20230609-191546.yaml b/.changes/unreleased/Fixes-20230609-191546.yaml new file mode 100644 index 00000000000..147d52b2c58 --- /dev/null +++ b/.changes/unreleased/Fixes-20230609-191546.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Allow dbt show --inline preview of private models +time: 2023-06-09T19:15:46.716379-04:00 +custom: + Author: jtcohen6 + Issue: "7837" diff --git a/core/dbt/context/providers.py b/core/dbt/context/providers.py index fe279a7fd3f..c4df007e806 100644 --- a/core/dbt/context/providers.py +++ b/core/dbt/context/providers.py @@ -502,6 +502,9 @@ def resolve( elif ( target_model.resource_type == NodeType.Model and target_model.access == AccessType.Private + # don't raise this reference error for ad hoc 'preview' queries + and self.model.resource_type != NodeType.SqlOperation + and self.model.resource_type != NodeType.RPCCall # TODO: rm ): if not self.model.group or self.model.group != target_model.group: raise DbtReferenceError( diff --git a/core/dbt/parser/manifest.py b/core/dbt/parser/manifest.py index 1dbf39e01ad..e11acfddaa3 100644 --- a/core/dbt/parser/manifest.py +++ b/core/dbt/parser/manifest.py @@ -1683,8 +1683,13 @@ def _process_refs_for_node(manifest: Manifest, current_project: str, node: Manif ) continue - # Handle references to models that are private - elif isinstance(target_model, ModelNode) and target_model.access == AccessType.Private: + # Handle references to models that are private, unless this is an 'ad hoc' query (SqlOperation, RPCCall) + elif ( + isinstance(target_model, ModelNode) + and target_model.access == AccessType.Private + and node.resource_type != NodeType.SqlOperation + and node.resource_type != NodeType.RPCCall # TODO: rm + ): if not node.group or node.group != target_model.group: raise dbt.exceptions.DbtReferenceError( unique_id=node.unique_id, diff --git a/tests/functional/show/fixtures.py b/tests/functional/show/fixtures.py index d3d8c57e96c..85bfcd26c29 100644 --- a/tests/functional/show/fixtures.py +++ b/tests/functional/show/fixtures.py @@ -17,6 +17,18 @@ select current_setting('timezone') as timezone """ +private_model_yml = """ +groups: + - name: my_cool_group + owner: {name: me} + +models: + - name: private_model + access: private + config: + group: my_cool_group +""" + schema_yml = """ models: diff --git a/tests/functional/show/test_show.py b/tests/functional/show/test_show.py index 69686ebb09b..838b65e4254 100644 --- a/tests/functional/show/test_show.py +++ b/tests/functional/show/test_show.py @@ -10,6 +10,7 @@ models__ephemeral_model, schema_yml, models__sql_header, + private_model_yml, ) @@ -137,3 +138,20 @@ def test_none(self, project): (results, log_output) = run_dbt_and_capture(["show", "--select", "sample_model.v2"]) assert "Previewing node 'sample_model.v1'" not in log_output assert "Previewing node 'sample_model.v2'" in log_output + + +class TestShowPrivateModel: + @pytest.fixture(scope="class") + def models(self): + return { + "schema.yml": private_model_yml, + "private_model.sql": models__sample_model, + } + + @pytest.fixture(scope="class") + def seeds(self): + return {"sample_seed.csv": seeds__sample_seed} + + def test_version_unspecified(self, project): + run_dbt(["build"]) + run_dbt(["show", "--inline", "select * from {{ ref('private_model') }}"]) From ae97831ebfeac1fb7092d1712f7a1bea2080f1f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:31:57 -0500 Subject: [PATCH 66/67] Bump mypy from 0.981 to 1.0.1 (#7027) * Bump mypy from 0.981 to 1.0.1 Bumps [mypy](https://github.com/python/mypy) from 0.981 to 1.0.1. - [Release notes](https://github.com/python/mypy/releases) - [Commits](https://github.com/python/mypy/compare/v0.981...v1.0.1) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Add automated changelog yaml from template for bot PR * upgrade mypy and fix all errors * fixing some duplicate imports from conflict resolution * fix mypy errors from merging in main --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Github Build Bot Co-authored-by: Emily Rockman --- .../unreleased/Dependencies-20230222-162807.yaml | 6 ++++++ .pre-commit-config.yaml | 2 +- core/dbt/adapters/base/impl.py | 6 +++--- core/dbt/cli/flags.py | 4 +++- core/dbt/cli/main.py | 4 ++-- core/dbt/context/configured.py | 4 +++- core/dbt/context/context_config.py | 16 ++++++++++------ core/dbt/context/providers.py | 1 + core/dbt/events/base_types.py | 3 ++- core/dbt/events/eventmgr.py | 2 +- core/dbt/events/functions.py | 8 +++++--- core/dbt/exceptions.py | 4 ++-- core/dbt/logger.py | 2 +- core/dbt/parser/generic_test_builders.py | 2 +- core/dbt/parser/schema_generic_tests.py | 2 +- core/dbt/parser/schemas.py | 2 +- core/dbt/task/runnable.py | 4 +++- core/dbt/tests/util.py | 10 +++++----- dev-requirements.txt | 2 +- 19 files changed, 52 insertions(+), 32 deletions(-) create mode 100644 .changes/unreleased/Dependencies-20230222-162807.yaml diff --git a/.changes/unreleased/Dependencies-20230222-162807.yaml b/.changes/unreleased/Dependencies-20230222-162807.yaml new file mode 100644 index 00000000000..0ab179931ac --- /dev/null +++ b/.changes/unreleased/Dependencies-20230222-162807.yaml @@ -0,0 +1,6 @@ +kind: "Dependencies" +body: "Bump mypy from 0.981 to 1.0.1" +time: 2023-02-22T16:28:07.00000Z +custom: + Author: dependabot[bot] + PR: 7027 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2c01d584893..040cf1051a3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: alias: flake8-check stages: [manual] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v0.981 + rev: v1.3.0 hooks: - id: mypy # N.B.: Mypy is... a bit fragile. diff --git a/core/dbt/adapters/base/impl.py b/core/dbt/adapters/base/impl.py index 1fa2ce903f6..0ab265b43c8 100644 --- a/core/dbt/adapters/base/impl.py +++ b/core/dbt/adapters/base/impl.py @@ -415,7 +415,7 @@ def _get_catalog_schemas(self, manifest: Manifest) -> SchemaSearchMap: return info_schema_name_map def _relations_cache_for_schemas( - self, manifest: Manifest, cache_schemas: Set[BaseRelation] = None + self, manifest: Manifest, cache_schemas: Optional[Set[BaseRelation]] = None ) -> None: """Populate the relations cache for the given schemas. Returns an iterable of the schemas populated, as strings. @@ -451,7 +451,7 @@ def set_relations_cache( self, manifest: Manifest, clear: bool = False, - required_schemas: Set[BaseRelation] = None, + required_schemas: Optional[Set[BaseRelation]] = None, ) -> None: """Run a query that gets a populated cache of the relations in the database and set the cache on this adapter. @@ -986,7 +986,7 @@ def execute_macro( manifest: Optional[Manifest] = None, project: Optional[str] = None, context_override: Optional[Dict[str, Any]] = None, - kwargs: Dict[str, Any] = None, + kwargs: Optional[Dict[str, Any]] = None, text_only_columns: Optional[Iterable[str]] = None, ) -> AttrDict: """Look macro_name up in the manifest and execute its results. diff --git a/core/dbt/cli/flags.py b/core/dbt/cli/flags.py index d7178c0dedd..a16829fc79f 100644 --- a/core/dbt/cli/flags.py +++ b/core/dbt/cli/flags.py @@ -76,7 +76,9 @@ def args_to_context(args: List[str]) -> Context: class Flags: """Primary configuration artifact for running dbt""" - def __init__(self, ctx: Context = None, user_config: UserConfig = None) -> None: + def __init__( + self, ctx: Optional[Context] = None, user_config: Optional[UserConfig] = None + ) -> None: # Set the default flags. for key, value in FLAGS_DEFAULTS.items(): diff --git a/core/dbt/cli/main.py b/core/dbt/cli/main.py index f91fbc29e3e..bd8d92a4d62 100644 --- a/core/dbt/cli/main.py +++ b/core/dbt/cli/main.py @@ -61,8 +61,8 @@ class dbtRunnerResult: class dbtRunner: def __init__( self, - manifest: Manifest = None, - callbacks: List[Callable[[EventMsg], None]] = None, + manifest: Optional[Manifest] = None, + callbacks: Optional[List[Callable[[EventMsg], None]]] = None, ): self.manifest = manifest diff --git a/core/dbt/context/configured.py b/core/dbt/context/configured.py index ddbfb60e91b..bb292a19565 100644 --- a/core/dbt/context/configured.py +++ b/core/dbt/context/configured.py @@ -119,7 +119,9 @@ def var(self) -> ConfiguredVar: def generate_schema_yml_context( - config: AdapterRequiredConfig, project_name: str, schema_yaml_vars: SchemaYamlVars = None + config: AdapterRequiredConfig, + project_name: str, + schema_yaml_vars: Optional[SchemaYamlVars] = None, ) -> Dict[str, Any]: ctx = SchemaYamlContext(config, project_name, schema_yaml_vars) return ctx.to_dict() diff --git a/core/dbt/context/context_config.py b/core/dbt/context/context_config.py index b497887ab45..437b47eb4b3 100644 --- a/core/dbt/context/context_config.py +++ b/core/dbt/context/context_config.py @@ -1,7 +1,7 @@ from abc import abstractmethod from copy import deepcopy from dataclasses import dataclass -from typing import List, Iterator, Dict, Any, TypeVar, Generic +from typing import List, Iterator, Dict, Any, TypeVar, Generic, Optional from dbt.config import RuntimeConfig, Project, IsFQNResource from dbt.contracts.graph.model_config import BaseConfig, get_config_for, _listify @@ -130,7 +130,7 @@ def calculate_node_config( resource_type: NodeType, project_name: str, base: bool, - patch_config_dict: Dict[str, Any] = None, + patch_config_dict: Optional[Dict[str, Any]] = None, ) -> BaseConfig: own_config = self.get_node_project(project_name) @@ -166,7 +166,7 @@ def calculate_node_config_dict( resource_type: NodeType, project_name: str, base: bool, - patch_config_dict: Dict[str, Any], + patch_config_dict: Optional[Dict[str, Any]] = None, ) -> Dict[str, Any]: ... @@ -200,7 +200,7 @@ def calculate_node_config_dict( resource_type: NodeType, project_name: str, base: bool, - patch_config_dict: dict = None, + patch_config_dict: Optional[dict] = None, ) -> Dict[str, Any]: config = self.calculate_node_config( config_call_dict=config_call_dict, @@ -225,7 +225,7 @@ def calculate_node_config_dict( resource_type: NodeType, project_name: str, base: bool, - patch_config_dict: dict = None, + patch_config_dict: Optional[dict] = None, ) -> Dict[str, Any]: # TODO CT-211 return self.calculate_node_config( @@ -318,7 +318,11 @@ def _add_config_call(cls, config_call_dict, opts: Dict[str, Any]) -> None: config_call_dict[k] = v def build_config_dict( - self, base: bool = False, *, rendered: bool = True, patch_config_dict: dict = None + self, + base: bool = False, + *, + rendered: bool = True, + patch_config_dict: Optional[dict] = None, ) -> Dict[str, Any]: if rendered: # TODO CT-211 diff --git a/core/dbt/context/providers.py b/core/dbt/context/providers.py index c4df007e806..e4bc2cde06a 100644 --- a/core/dbt/context/providers.py +++ b/core/dbt/context/providers.py @@ -285,6 +285,7 @@ def __call__(self, *args: str) -> RelationProxy: class BaseMetricResolver(BaseResolver): + @abc.abstractmethod def resolve(self, name: str, package: Optional[str] = None) -> MetricReference: ... diff --git a/core/dbt/events/base_types.py b/core/dbt/events/base_types.py index 94083c6dcb7..711a0bfad72 100644 --- a/core/dbt/events/base_types.py +++ b/core/dbt/events/base_types.py @@ -6,6 +6,7 @@ from google.protobuf.json_format import ParseDict, MessageToDict, MessageToJson from google.protobuf.message import Message from dbt.events.helpers import get_json_string_utcnow +from typing import Optional if sys.version_info >= (3, 8): from typing import Protocol @@ -126,7 +127,7 @@ class EventMsg(Protocol): data: Message -def msg_from_base_event(event: BaseEvent, level: EventLevel = None): +def msg_from_base_event(event: BaseEvent, level: Optional[EventLevel] = None): msg_class_name = f"{type(event).__name__}Msg" msg_cls = getattr(types_pb2, msg_class_name) diff --git a/core/dbt/events/eventmgr.py b/core/dbt/events/eventmgr.py index 03d490d5ab8..55dfbd203f0 100644 --- a/core/dbt/events/eventmgr.py +++ b/core/dbt/events/eventmgr.py @@ -185,7 +185,7 @@ def __init__(self) -> None: self.callbacks: List[Callable[[EventMsg], None]] = [] self.invocation_id: str = str(uuid4()) - def fire_event(self, e: BaseEvent, level: EventLevel = None) -> None: + def fire_event(self, e: BaseEvent, level: Optional[EventLevel] = None) -> None: msg = msg_from_base_event(e, level=level) if os.environ.get("DBT_TEST_BINARY_SERIALIZATION"): diff --git a/core/dbt/events/functions.py b/core/dbt/events/functions.py index a56fb24006a..21bc4d3c0b3 100644 --- a/core/dbt/events/functions.py +++ b/core/dbt/events/functions.py @@ -247,14 +247,16 @@ def warn_or_error(event, node=None): # an alternative to fire_event which only creates and logs the event value # if the condition is met. Does nothing otherwise. def fire_event_if( - conditional: bool, lazy_e: Callable[[], BaseEvent], level: EventLevel = None + conditional: bool, lazy_e: Callable[[], BaseEvent], level: Optional[EventLevel] = None ) -> None: if conditional: fire_event(lazy_e(), level=level) # a special case of fire_event_if, to only fire events in our unit/functional tests -def fire_event_if_test(lazy_e: Callable[[], BaseEvent], level: EventLevel = None) -> None: +def fire_event_if_test( + lazy_e: Callable[[], BaseEvent], level: Optional[EventLevel] = None +) -> None: fire_event_if(conditional=("pytest" in sys.modules), lazy_e=lazy_e, level=level) @@ -262,7 +264,7 @@ def fire_event_if_test(lazy_e: Callable[[], BaseEvent], level: EventLevel = None # this is where all the side effects happen branched by event type # (i.e. - mutating the event history, printing to stdout, logging # to files, etc.) -def fire_event(e: BaseEvent, level: EventLevel = None) -> None: +def fire_event(e: BaseEvent, level: Optional[EventLevel] = None) -> None: EVENT_MANAGER.fire_event(e, level=level) diff --git a/core/dbt/exceptions.py b/core/dbt/exceptions.py index b336776761d..21ed6c10720 100644 --- a/core/dbt/exceptions.py +++ b/core/dbt/exceptions.py @@ -419,7 +419,7 @@ def message(self): class SemverError(Exception): - def __init__(self, msg: str = None): + def __init__(self, msg: Optional[str] = None): self.msg = msg if msg is not None: super().__init__(msg) @@ -2419,7 +2419,7 @@ class RPCCompiling(DbtRuntimeError): CODE = 10010 MESSAGE = 'RPC server is compiling the project, call the "status" method for' " compile status" - def __init__(self, msg: str = None, node=None): + def __init__(self, msg: Optional[str] = None, node=None): if msg is None: msg = "compile in progress" super().__init__(msg, node) diff --git a/core/dbt/logger.py b/core/dbt/logger.py index 81e0e8871e7..d4095fb73bf 100644 --- a/core/dbt/logger.py +++ b/core/dbt/logger.py @@ -469,7 +469,7 @@ class ListLogHandler(LogMessageHandler): def __init__( self, level: int = logbook.NOTSET, - filter: Callable = None, + filter: Optional[Callable] = None, bubble: bool = False, lst: Optional[List[LogMessage]] = None, ) -> None: diff --git a/core/dbt/parser/generic_test_builders.py b/core/dbt/parser/generic_test_builders.py index 847f2b29f3c..69c86853162 100644 --- a/core/dbt/parser/generic_test_builders.py +++ b/core/dbt/parser/generic_test_builders.py @@ -113,7 +113,7 @@ def __init__( target: Testable, package_name: str, render_ctx: Dict[str, Any], - column_name: str = None, + column_name: Optional[str] = None, version: Optional[NodeVersion] = None, ) -> None: test_name, test_args = self.extract_test_args(test, column_name) diff --git a/core/dbt/parser/schema_generic_tests.py b/core/dbt/parser/schema_generic_tests.py index 590f946bbc7..29b71c21e92 100644 --- a/core/dbt/parser/schema_generic_tests.py +++ b/core/dbt/parser/schema_generic_tests.py @@ -61,7 +61,7 @@ def resource_type(self) -> NodeType: def get_compiled_path(cls, block: FileBlock) -> str: return block.path.relative_path - def parse_file(self, block: FileBlock, dct: Dict = None) -> None: + def parse_file(self, block: FileBlock, dct: Optional[Dict] = None) -> None: pass def parse_from_dict(self, dct, validate=True) -> GenericTestNode: diff --git a/core/dbt/parser/schemas.py b/core/dbt/parser/schemas.py index adf29b2a091..233b1da950c 100644 --- a/core/dbt/parser/schemas.py +++ b/core/dbt/parser/schemas.py @@ -147,7 +147,7 @@ def get_compiled_path(cls, block: FileBlock) -> str: def resource_type(self) -> NodeType: return NodeType.Test - def parse_file(self, block: FileBlock, dct: Dict = None) -> None: + def parse_file(self, block: FileBlock, dct: Optional[Dict] = None) -> None: assert isinstance(block.file, SchemaSourceFile) # If partially parsing, dct should be from pp_dict, otherwise diff --git a/core/dbt/task/runnable.py b/core/dbt/task/runnable.py index e3de59df771..b1a74fd1126 100644 --- a/core/dbt/task/runnable.py +++ b/core/dbt/task/runnable.py @@ -381,7 +381,9 @@ def _mark_dependent_errors(self, node_id, result, cause): for dep_node_id in self.graph.get_dependent_nodes(node_id): self._skipped_children[dep_node_id] = cause - def populate_adapter_cache(self, adapter, required_schemas: Set[BaseRelation] = None): + def populate_adapter_cache( + self, adapter, required_schemas: Optional[Set[BaseRelation]] = None + ): if not self.args.populate_cache: return diff --git a/core/dbt/tests/util.py b/core/dbt/tests/util.py index f770c8a28e9..e901d8b9d82 100644 --- a/core/dbt/tests/util.py +++ b/core/dbt/tests/util.py @@ -5,7 +5,7 @@ import json import warnings from datetime import datetime -from typing import Dict, List +from typing import Dict, List, Optional from contextlib import contextmanager from dbt.adapters.factory import Adapter @@ -71,9 +71,9 @@ # If the command is expected to fail, pass in "expect_pass=False"): # run_dbt("test"], expect_pass=False) def run_dbt( - args: List[str] = None, + args: Optional[List[str]] = None, expect_pass: bool = True, - publications: List[PublicationArtifact] = None, + publications: Optional[List[PublicationArtifact]] = None, ): # Ignore logbook warnings warnings.filterwarnings("ignore", category=DeprecationWarning, module="logbook") @@ -117,9 +117,9 @@ def run_dbt( # start with the "--debug" flag. The structured schema log CI test # will turn the logs into json, so you have to be prepared for that. def run_dbt_and_capture( - args: List[str] = None, + args: Optional[List[str]] = None, expect_pass: bool = True, - publications: List[PublicationArtifact] = None, + publications: Optional[List[PublicationArtifact]] = None, ): try: stringbuf = StringIO() diff --git a/dev-requirements.txt b/dev-requirements.txt index 033d798205b..2f1ed983f19 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -5,7 +5,7 @@ flake8 flaky freezegun==0.3.12 ipdb -mypy==0.981 +mypy==1.3.0 pip-tools pre-commit protobuf>=4.0.0 From f767943fb22b493a762ff76c4d942eec7b781b2c Mon Sep 17 00:00:00 2001 From: colin-rogers-dbt <111200756+colin-rogers-dbt@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:56:47 -0700 Subject: [PATCH 67/67] Add AdapterRegistered event log message (#7862) * Add AdapterRegistered event log message * Add AdapterRegistered to unit test * make versioning and logging consistent * make versioning and logging consistent * add to_version_string * remove extra equals * format fire_event --- .../unreleased/Features-20230613-151507.yaml | 6 + core/dbt/adapters/factory.py | 11 +- core/dbt/events/types.proto | 13 + core/dbt/events/types.py | 8 + core/dbt/events/types_pb2.py | 1737 +++++++++-------- tests/unit/test_events.py | 1 + 6 files changed, 908 insertions(+), 868 deletions(-) create mode 100644 .changes/unreleased/Features-20230613-151507.yaml diff --git a/.changes/unreleased/Features-20230613-151507.yaml b/.changes/unreleased/Features-20230613-151507.yaml new file mode 100644 index 00000000000..88b6adb66b3 --- /dev/null +++ b/.changes/unreleased/Features-20230613-151507.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Add AdapterRegistered event log message +time: 2023-06-13T15:15:07.367371-07:00 +custom: + Author: colin-rogers-dbt + Issue: "7038" diff --git a/core/dbt/adapters/factory.py b/core/dbt/adapters/factory.py index fffde6b487f..c5e94c27466 100644 --- a/core/dbt/adapters/factory.py +++ b/core/dbt/adapters/factory.py @@ -9,10 +9,11 @@ from dbt.adapters.protocol import AdapterConfig, AdapterProtocol, RelationProtocol from dbt.contracts.connection import AdapterRequiredConfig, Credentials from dbt.events.functions import fire_event -from dbt.events.types import AdapterImportError, PluginLoadError +from dbt.events.types import AdapterImportError, PluginLoadError, AdapterRegistered from dbt.exceptions import DbtInternalError, DbtRuntimeError from dbt.include.global_project import PACKAGE_PATH as GLOBAL_PROJECT_PATH from dbt.include.global_project import PROJECT_NAME as GLOBAL_PROJECT_NAME +from dbt.semver import VersionSpecifier Adapter = AdapterProtocol @@ -89,7 +90,13 @@ def load_plugin(self, name: str) -> Type[Credentials]: def register_adapter(self, config: AdapterRequiredConfig) -> None: adapter_name = config.credentials.type adapter_type = self.get_adapter_class_by_name(adapter_name) - + adapter_version = import_module(f".{adapter_name}.__version__", "dbt.adapters").version + adapter_version_specifier = VersionSpecifier.from_version_string( + adapter_version + ).to_version_string() + fire_event( + AdapterRegistered(adapter_name=adapter_name, adapter_version=adapter_version_specifier) + ) with self.lock: if adapter_name in self.adapters: # this shouldn't really happen... diff --git a/core/dbt/events/types.proto b/core/dbt/events/types.proto index 5f12eee1d87..82cbf592262 100644 --- a/core/dbt/events/types.proto +++ b/core/dbt/events/types.proto @@ -671,6 +671,19 @@ message CacheDumpGraphMsg { // Skipping E032, E033, E034 + + +// E034 +message AdapterRegistered { + string adapter_name = 1; + string adapter_version = 2; +} + +message AdapterRegisteredMsg { + EventInfo info = 1; + AdapterRegistered data = 2; +} + // E035 message AdapterImportError { string exc = 1; diff --git a/core/dbt/events/types.py b/core/dbt/events/types.py index 89a00d86b3c..a5c13a11717 100644 --- a/core/dbt/events/types.py +++ b/core/dbt/events/types.py @@ -655,6 +655,14 @@ def message(self) -> str: # Skipping E032, E033, E034 +class AdapterRegistered(InfoLevel): + def code(self): + return "E034" + + def message(self) -> str: + return f"Registered adapter: {self.adapter_name}{self.adapter_version}" + + class AdapterImportError(InfoLevel): def code(self): return "E035" diff --git a/core/dbt/events/types_pb2.py b/core/dbt/events/types_pb2.py index a91c8543d78..5e201a8ef24 100644 --- a/core/dbt/events/types_pb2.py +++ b/core/dbt/events/types_pb2.py @@ -2,10 +2,10 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: types.proto """Generated protocol buffer code.""" -from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -15,10 +15,11 @@ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btypes.proto\x12\x0bproto_types\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x02\n\tEventInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\t\x12\x15\n\rinvocation_id\x18\x05 \x01(\t\x12\x0b\n\x03pid\x18\x06 \x01(\x05\x12\x0e\n\x06thread\x18\x07 \x01(\t\x12&\n\x02ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x05\x65xtra\x18\t \x03(\x0b\x32!.proto_types.EventInfo.ExtraEntry\x12\x10\n\x08\x63\x61tegory\x18\n \x01(\t\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x7f\n\rTimingInfoMsg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x0cNodeRelation\x12\x10\n\x08\x64\x61tabase\x18\n \x01(\t\x12\x0e\n\x06schema\x18\x0b \x01(\t\x12\r\n\x05\x61lias\x18\x0c \x01(\t\x12\x15\n\rrelation_name\x18\r \x01(\t\"\x91\x02\n\x08NodeInfo\x12\x11\n\tnode_path\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x11\n\tunique_id\x18\x03 \x01(\t\x12\x15\n\rresource_type\x18\x04 \x01(\t\x12\x14\n\x0cmaterialized\x18\x05 \x01(\t\x12\x13\n\x0bnode_status\x18\x06 \x01(\t\x12\x17\n\x0fnode_started_at\x18\x07 \x01(\t\x12\x18\n\x10node_finished_at\x18\x08 \x01(\t\x12%\n\x04meta\x18\t \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x30\n\rnode_relation\x18\n \x01(\x0b\x32\x19.proto_types.NodeRelation\"\xd1\x01\n\x0cRunResultMsg\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12/\n\x0btiming_info\x18\x03 \x03(\x0b\x32\x1a.proto_types.TimingInfoMsg\x12\x0e\n\x06thread\x18\x04 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x31\n\x10\x61\x64\x61pter_response\x18\x06 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"G\n\x0fReferenceKeyMsg\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x12\n\nidentifier\x18\x03 \x01(\t\"6\n\x0eGenericMessage\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\"9\n\x11MainReportVersion\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0blog_version\x18\x02 \x01(\x05\"j\n\x14MainReportVersionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.MainReportVersion\"r\n\x0eMainReportArgs\x12\x33\n\x04\x61rgs\x18\x01 \x03(\x0b\x32%.proto_types.MainReportArgs.ArgsEntry\x1a+\n\tArgsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11MainReportArgsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainReportArgs\"+\n\x15MainTrackingUserState\x12\x12\n\nuser_state\x18\x01 \x01(\t\"r\n\x18MainTrackingUserStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainTrackingUserState\"5\n\x0fMergedFromState\x12\x12\n\nnum_merged\x18\x01 \x01(\x05\x12\x0e\n\x06sample\x18\x02 \x03(\t\"f\n\x12MergedFromStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.MergedFromState\"A\n\x14MissingProfileTarget\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\"p\n\x17MissingProfileTargetMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MissingProfileTarget\"(\n\x11InvalidOptionYAML\x12\x13\n\x0boption_name\x18\x01 \x01(\t\"j\n\x14InvalidOptionYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.InvalidOptionYAML\"!\n\x12LogDbtProjectError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15LogDbtProjectErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProjectError\"3\n\x12LogDbtProfileError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08profiles\x18\x02 \x03(\t\"l\n\x15LogDbtProfileErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProfileError\"!\n\x12StarterProjectPath\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"l\n\x15StarterProjectPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StarterProjectPath\"$\n\x15\x43onfigFolderDirectory\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"r\n\x18\x43onfigFolderDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConfigFolderDirectory\"\'\n\x14NoSampleProfileFound\x12\x0f\n\x07\x61\x64\x61pter\x18\x01 \x01(\t\"p\n\x17NoSampleProfileFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NoSampleProfileFound\"6\n\x18ProfileWrittenWithSample\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"x\n\x1bProfileWrittenWithSampleMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProfileWrittenWithSample\"B\n$ProfileWrittenWithTargetTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x90\x01\n\'ProfileWrittenWithTargetTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.ProfileWrittenWithTargetTemplateYAML\"C\n%ProfileWrittenWithProjectTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x92\x01\n(ProfileWrittenWithProjectTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.ProfileWrittenWithProjectTemplateYAML\"\x12\n\x10SettingUpProfile\"h\n\x13SettingUpProfileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SettingUpProfile\"\x1c\n\x1aInvalidProfileTemplateYAML\"|\n\x1dInvalidProfileTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.InvalidProfileTemplateYAML\"(\n\x18ProjectNameAlreadyExists\x12\x0c\n\x04name\x18\x01 \x01(\t\"x\n\x1bProjectNameAlreadyExistsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProjectNameAlreadyExists\"K\n\x0eProjectCreated\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocs_url\x18\x02 \x01(\t\x12\x11\n\tslack_url\x18\x03 \x01(\t\"d\n\x11ProjectCreatedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ProjectCreated\"@\n\x1aPackageRedirectDeprecation\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1dPackageRedirectDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PackageRedirectDeprecation\"\x1f\n\x1dPackageInstallPathDeprecation\"\x82\x01\n PackageInstallPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.PackageInstallPathDeprecation\"H\n\x1b\x43onfigSourcePathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"~\n\x1e\x43onfigSourcePathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigSourcePathDeprecation\"F\n\x19\x43onfigDataPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"z\n\x1c\x43onfigDataPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConfigDataPathDeprecation\"?\n\x19\x41\x64\x61pterDeprecationWarning\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"z\n\x1c\x41\x64\x61pterDeprecationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.AdapterDeprecationWarning\".\n\x17MetricAttributesRenamed\x12\x13\n\x0bmetric_name\x18\x01 \x01(\t\"v\n\x1aMetricAttributesRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.MetricAttributesRenamed\"+\n\x17\x45xposureNameDeprecation\x12\x10\n\x08\x65xposure\x18\x01 \x01(\t\"v\n\x1a\x45xposureNameDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.ExposureNameDeprecation\"^\n\x13InternalDeprecation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x18\n\x10suggested_action\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\"n\n\x16InternalDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.InternalDeprecation\"@\n\x1a\x45nvironmentVariableRenamed\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1d\x45nvironmentVariableRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.EnvironmentVariableRenamed\"3\n\x18\x43onfigLogPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"x\n\x1b\x43onfigLogPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ConfigLogPathDeprecation\"6\n\x1b\x43onfigTargetPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"~\n\x1e\x43onfigTargetPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigTargetPathDeprecation\"!\n\x1f\x43ollectFreshnessReturnSignature\"\x86\x01\n\"CollectFreshnessReturnSignatureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.CollectFreshnessReturnSignature\"\x87\x01\n\x11\x41\x64\x61pterEventDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"j\n\x14\x41\x64\x61pterEventDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventDebug\"\x86\x01\n\x10\x41\x64\x61pterEventInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"h\n\x13\x41\x64\x61pterEventInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.AdapterEventInfo\"\x89\x01\n\x13\x41\x64\x61pterEventWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"n\n\x16\x41\x64\x61pterEventWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.AdapterEventWarning\"\x99\x01\n\x11\x41\x64\x61pterEventError\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\x12\x10\n\x08\x65xc_info\x18\x05 \x01(\t\"j\n\x14\x41\x64\x61pterEventErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventError\"_\n\rNewConnection\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"b\n\x10NewConnectionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NewConnection\"=\n\x10\x43onnectionReused\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x16\n\x0eorig_conn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionReusedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionReused\"0\n\x1b\x43onnectionLeftOpenInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"~\n\x1e\x43onnectionLeftOpenInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConnectionLeftOpenInCleanup\".\n\x19\x43onnectionClosedInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"z\n\x1c\x43onnectionClosedInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConnectionClosedInCleanup\"_\n\x0eRollbackFailed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"d\n\x11RollbackFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RollbackFailed\"O\n\x10\x43onnectionClosed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionClosedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionClosed\"Q\n\x12\x43onnectionLeftOpen\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"l\n\x15\x43onnectionLeftOpenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ConnectionLeftOpen\"G\n\x08Rollback\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"X\n\x0bRollbackMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.Rollback\"@\n\tCacheMiss\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\"Z\n\x0c\x43\x61\x63heMissMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.CacheMiss\"b\n\rListRelations\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12/\n\trelations\x18\x03 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10ListRelationsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ListRelations\"`\n\x0e\x43onnectionUsed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"d\n\x11\x43onnectionUsedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ConnectionUsed\"T\n\x08SQLQuery\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x0b\n\x03sql\x18\x03 \x01(\t\"X\n\x0bSQLQueryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.SQLQuery\"[\n\x0eSQLQueryStatus\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x03 \x01(\x02\"d\n\x11SQLQueryStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SQLQueryStatus\"H\n\tSQLCommit\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"Z\n\x0cSQLCommitMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.SQLCommit\"a\n\rColTypeChange\x12\x11\n\torig_type\x18\x01 \x01(\t\x12\x10\n\x08new_type\x18\x02 \x01(\t\x12+\n\x05table\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10\x43olTypeChangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ColTypeChange\"@\n\x0eSchemaCreation\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"d\n\x11SchemaCreationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SchemaCreation\"<\n\nSchemaDrop\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"\\\n\rSchemaDropMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SchemaDrop\"\xde\x01\n\x0b\x43\x61\x63heAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12-\n\x07ref_key\x18\x02 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_2\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_3\x18\x04 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12.\n\x08ref_list\x18\x05 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"^\n\x0e\x43\x61\x63heActionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.CacheAction\"\x98\x01\n\x0e\x43\x61\x63heDumpGraph\x12\x33\n\x04\x64ump\x18\x01 \x03(\x0b\x32%.proto_types.CacheDumpGraph.DumpEntry\x12\x14\n\x0c\x62\x65\x66ore_after\x18\x02 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\t\x1a+\n\tDumpEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11\x43\x61\x63heDumpGraphMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CacheDumpGraph\"!\n\x12\x41\x64\x61pterImportError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15\x41\x64\x61pterImportErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.AdapterImportError\"#\n\x0fPluginLoadError\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"f\n\x12PluginLoadErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.PluginLoadError\"Z\n\x14NewConnectionOpening\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x18\n\x10\x63onnection_state\x18\x02 \x01(\t\"p\n\x17NewConnectionOpeningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NewConnectionOpening\"8\n\rCodeExecution\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ode_content\x18\x02 \x01(\t\"b\n\x10\x43odeExecutionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.CodeExecution\"6\n\x13\x43odeExecutionStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x02 \x01(\x02\"n\n\x16\x43odeExecutionStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.CodeExecutionStatus\"%\n\x16\x43\x61talogGenerationError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"t\n\x19\x43\x61talogGenerationErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.CatalogGenerationError\"-\n\x13WriteCatalogFailure\x12\x16\n\x0enum_exceptions\x18\x01 \x01(\x05\"n\n\x16WriteCatalogFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.WriteCatalogFailure\"\x1e\n\x0e\x43\x61talogWritten\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43\x61talogWrittenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CatalogWritten\"\x14\n\x12\x43\x61nnotGenerateDocs\"l\n\x15\x43\x61nnotGenerateDocsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.CannotGenerateDocs\"\x11\n\x0f\x42uildingCatalog\"f\n\x12\x42uildingCatalogMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.BuildingCatalog\"-\n\x18\x44\x61tabaseErrorRunningHook\x12\x11\n\thook_type\x18\x01 \x01(\t\"x\n\x1b\x44\x61tabaseErrorRunningHookMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DatabaseErrorRunningHook\"4\n\x0cHooksRunning\x12\x11\n\tnum_hooks\x18\x01 \x01(\x05\x12\x11\n\thook_type\x18\x02 \x01(\t\"`\n\x0fHooksRunningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.HooksRunning\"T\n\x14\x46inishedRunningStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\x12\x11\n\texecution\x18\x02 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x03 \x01(\x02\"p\n\x17\x46inishedRunningStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.FinishedRunningStats\"<\n\x15\x43onstraintNotEnforced\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"r\n\x18\x43onstraintNotEnforcedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConstraintNotEnforced\"=\n\x16\x43onstraintNotSupported\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"t\n\x19\x43onstraintNotSupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.ConstraintNotSupported\"7\n\x12InputFileDiffError\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x02 \x01(\t\"l\n\x15InputFileDiffErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InputFileDiffError\"t\n\x1aPublicationArtifactChanged\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"|\n\x1dPublicationArtifactChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PublicationArtifactChanged\"?\n\x14InvalidValueForField\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x13\n\x0b\x66ield_value\x18\x02 \x01(\t\"p\n\x17InvalidValueForFieldMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.InvalidValueForField\"Q\n\x11ValidationWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x11\n\tnode_name\x18\x03 \x01(\t\"j\n\x14ValidationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ValidationWarning\"!\n\x11ParsePerfInfoPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"j\n\x14ParsePerfInfoPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ParsePerfInfoPath\"1\n!PartialParsingErrorProcessingFile\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\"\x8a\x01\n$PartialParsingErrorProcessingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.PartialParsingErrorProcessingFile\"\x86\x01\n\x13PartialParsingError\x12?\n\x08\x65xc_info\x18\x01 \x03(\x0b\x32-.proto_types.PartialParsingError.ExcInfoEntry\x1a.\n\x0c\x45xcInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"n\n\x16PartialParsingErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.PartialParsingError\"\x1b\n\x19PartialParsingSkipParsing\"z\n\x1cPartialParsingSkipParsingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.PartialParsingSkipParsing\"&\n\x14UnableToPartialParse\x12\x0e\n\x06reason\x18\x01 \x01(\t\"p\n\x17UnableToPartialParseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.UnableToPartialParse\"f\n\x12StateCheckVarsHash\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\x12\x0c\n\x04vars\x18\x02 \x01(\t\x12\x0f\n\x07profile\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\"l\n\x15StateCheckVarsHashMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StateCheckVarsHash\"\x1a\n\x18PartialParsingNotEnabled\"x\n\x1bPartialParsingNotEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.PartialParsingNotEnabled\"C\n\x14ParsedFileLoadFailed\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"p\n\x17ParsedFileLoadFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.ParsedFileLoadFailed\"H\n\x15PartialParsingEnabled\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x05\x12\r\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x05\x12\x0f\n\x07\x63hanged\x18\x03 \x01(\x05\"r\n\x18PartialParsingEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.PartialParsingEnabled\"8\n\x12PartialParsingFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\"l\n\x15PartialParsingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.PartialParsingFile\"\xaf\x01\n\x1fInvalidDisabledTargetInTestNode\x12\x1b\n\x13resource_type_title\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1a\n\x12original_file_path\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\x12\x13\n\x0btarget_name\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\"\x86\x01\n\"InvalidDisabledTargetInTestNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.InvalidDisabledTargetInTestNode\"7\n\x18UnusedResourceConfigPath\x12\x1b\n\x13unused_config_paths\x18\x01 \x03(\t\"x\n\x1bUnusedResourceConfigPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.UnusedResourceConfigPath\"3\n\rSeedIncreased\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"b\n\x10SeedIncreasedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.SeedIncreased\">\n\x18SeedExceedsLimitSamePath\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"x\n\x1bSeedExceedsLimitSamePathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.SeedExceedsLimitSamePath\"D\n\x1eSeedExceedsLimitAndPathChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x84\x01\n!SeedExceedsLimitAndPathChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.SeedExceedsLimitAndPathChanged\"\\\n\x1fSeedExceedsLimitChecksumChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rchecksum_name\x18\x03 \x01(\t\"\x86\x01\n\"SeedExceedsLimitChecksumChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.SeedExceedsLimitChecksumChanged\"%\n\x0cUnusedTables\x12\x15\n\runused_tables\x18\x01 \x03(\t\"`\n\x0fUnusedTablesMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.UnusedTables\"\x87\x01\n\x17WrongResourceSchemaFile\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x1c\n\x14plural_resource_type\x18\x03 \x01(\t\x12\x10\n\x08yaml_key\x18\x04 \x01(\t\x12\x11\n\tfile_path\x18\x05 \x01(\t\"v\n\x1aWrongResourceSchemaFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.WrongResourceSchemaFile\"K\n\x10NoNodeForYamlKey\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x10\n\x08yaml_key\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x03 \x01(\t\"h\n\x13NoNodeForYamlKeyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.NoNodeForYamlKey\"+\n\x15MacroNotFoundForPatch\x12\x12\n\npatch_name\x18\x01 \x01(\t\"r\n\x18MacroNotFoundForPatchMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MacroNotFoundForPatch\"\xb8\x01\n\x16NodeNotFoundOrDisabled\x12\x1a\n\x12original_file_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1b\n\x13resource_type_title\x18\x03 \x01(\t\x12\x13\n\x0btarget_name\x18\x04 \x01(\t\x12\x13\n\x0btarget_kind\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\x12\x10\n\x08\x64isabled\x18\x07 \x01(\t\"t\n\x19NodeNotFoundOrDisabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.NodeNotFoundOrDisabled\"H\n\x0fJinjaLogWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"f\n\x12JinjaLogWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.JinjaLogWarning\"E\n\x0cJinjaLogInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"`\n\x0fJinjaLogInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.JinjaLogInfo\"F\n\rJinjaLogDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"b\n\x10JinjaLogDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.JinjaLogDebug\"\xae\x01\n\x1eUnpinnedRefNewVersionAvailable\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rref_node_name\x18\x02 \x01(\t\x12\x18\n\x10ref_node_package\x18\x03 \x01(\t\x12\x18\n\x10ref_node_version\x18\x04 \x01(\t\x12\x17\n\x0fref_max_version\x18\x05 \x01(\t\"\x84\x01\n!UnpinnedRefNewVersionAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.UnpinnedRefNewVersionAvailable\"V\n\x0f\x44\x65precatedModel\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\x18\n\x10\x64\x65precation_date\x18\x03 \x01(\t\"f\n\x12\x44\x65precatedModelMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DeprecatedModel\"\xc6\x01\n\x1cUpcomingReferenceDeprecation\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"\x80\x01\n\x1fUpcomingReferenceDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.UpcomingReferenceDeprecation\"\xbd\x01\n\x13\x44\x65precatedReference\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"n\n\x16\x44\x65precatedReferenceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DeprecatedReference\"<\n$UnsupportedConstraintMaterialization\x12\x14\n\x0cmaterialized\x18\x01 \x01(\t\"\x90\x01\n\'UnsupportedConstraintMaterializationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.UnsupportedConstraintMaterialization\"/\n\x1dGitSparseCheckoutSubdirectory\x12\x0e\n\x06subdir\x18\x01 \x01(\t\"\x82\x01\n GitSparseCheckoutSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.GitSparseCheckoutSubdirectory\"/\n\x1bGitProgressCheckoutRevision\x12\x10\n\x08revision\x18\x01 \x01(\t\"~\n\x1eGitProgressCheckoutRevisionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.GitProgressCheckoutRevision\"4\n%GitProgressUpdatingExistingDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x92\x01\n(GitProgressUpdatingExistingDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.GitProgressUpdatingExistingDependency\".\n\x1fGitProgressPullingNewDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x86\x01\n\"GitProgressPullingNewDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressPullingNewDependency\"\x1d\n\x0eGitNothingToDo\x12\x0b\n\x03sha\x18\x01 \x01(\t\"d\n\x11GitNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.GitNothingToDo\"E\n\x1fGitProgressUpdatedCheckoutRange\x12\x11\n\tstart_sha\x18\x01 \x01(\t\x12\x0f\n\x07\x65nd_sha\x18\x02 \x01(\t\"\x86\x01\n\"GitProgressUpdatedCheckoutRangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressUpdatedCheckoutRange\"*\n\x17GitProgressCheckedOutAt\x12\x0f\n\x07\x65nd_sha\x18\x01 \x01(\t\"v\n\x1aGitProgressCheckedOutAtMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.GitProgressCheckedOutAt\")\n\x1aRegistryProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"|\n\x1dRegistryProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.RegistryProgressGETRequest\"=\n\x1bRegistryProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"~\n\x1eRegistryProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RegistryProgressGETResponse\"_\n\x1dSelectorReportInvalidSelector\x12\x17\n\x0fvalid_selectors\x18\x01 \x01(\t\x12\x13\n\x0bspec_method\x18\x02 \x01(\t\x12\x10\n\x08raw_spec\x18\x03 \x01(\t\"\x82\x01\n SelectorReportInvalidSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.SelectorReportInvalidSelector\"\x15\n\x13\x44\x65psNoPackagesFound\"n\n\x16\x44\x65psNoPackagesFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsNoPackagesFound\"/\n\x17\x44\x65psStartPackageInstall\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\"v\n\x1a\x44\x65psStartPackageInstallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsStartPackageInstall\"\'\n\x0f\x44\x65psInstallInfo\x12\x14\n\x0cversion_name\x18\x01 \x01(\t\"f\n\x12\x44\x65psInstallInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DepsInstallInfo\"-\n\x13\x44\x65psUpdateAvailable\x12\x16\n\x0eversion_latest\x18\x01 \x01(\t\"n\n\x16\x44\x65psUpdateAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsUpdateAvailable\"\x0e\n\x0c\x44\x65psUpToDate\"`\n\x0f\x44\x65psUpToDateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUpToDate\",\n\x14\x44\x65psListSubdirectory\x12\x14\n\x0csubdirectory\x18\x01 \x01(\t\"p\n\x17\x44\x65psListSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.DepsListSubdirectory\".\n\x1a\x44\x65psNotifyUpdatesAvailable\x12\x10\n\x08packages\x18\x01 \x03(\t\"|\n\x1d\x44\x65psNotifyUpdatesAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.DepsNotifyUpdatesAvailable\"1\n\x11RetryExternalCall\x12\x0f\n\x07\x61ttempt\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"j\n\x14RetryExternalCallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.RetryExternalCall\"#\n\x14RecordRetryException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17RecordRetryExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.RecordRetryException\".\n\x1fRegistryIndexProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"\x86\x01\n\"RegistryIndexProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryIndexProgressGETRequest\"B\n RegistryIndexProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"\x88\x01\n#RegistryIndexProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12;\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32-.proto_types.RegistryIndexProgressGETResponse\"2\n\x1eRegistryResponseUnexpectedType\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseUnexpectedTypeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseUnexpectedType\"2\n\x1eRegistryResponseMissingTopKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseMissingTopKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseMissingTopKeys\"5\n!RegistryResponseMissingNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x8a\x01\n$RegistryResponseMissingNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.RegistryResponseMissingNestedKeys\"3\n\x1fRegistryResponseExtraNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x86\x01\n\"RegistryResponseExtraNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryResponseExtraNestedKeys\"(\n\x18\x44\x65psSetDownloadDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\"x\n\x1b\x44\x65psSetDownloadDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsSetDownloadDirectory\"-\n\x0c\x44\x65psUnpinned\x12\x10\n\x08revision\x18\x01 \x01(\t\x12\x0b\n\x03git\x18\x02 \x01(\t\"`\n\x0f\x44\x65psUnpinnedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUnpinned\"/\n\x1bNoNodesForSelectionCriteria\x12\x10\n\x08spec_raw\x18\x01 \x01(\t\"~\n\x1eNoNodesForSelectionCriteriaMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.NoNodesForSelectionCriteria\"M\n\x1cPublicationArtifactAvailable\x12-\n\x0cpub_artifact\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\"\x80\x01\n\x1fPublicationArtifactAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.PublicationArtifactAvailable\"*\n\x1bRunningOperationCaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"~\n\x1eRunningOperationCaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RunningOperationCaughtError\"\x11\n\x0f\x43ompileComplete\"f\n\x12\x43ompileCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.CompileComplete\"\x18\n\x16\x46reshnessCheckComplete\"t\n\x19\x46reshnessCheckCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.FreshnessCheckComplete\"\x1c\n\nSeedHeader\x12\x0e\n\x06header\x18\x01 \x01(\t\"\\\n\rSeedHeaderMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SeedHeader\"3\n\x12SQLRunnerException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x02 \x01(\t\"l\n\x15SQLRunnerExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SQLRunnerException\"\xa8\x01\n\rLogTestResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x12\n\nnum_models\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"b\n\x10LogTestResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogTestResult\"k\n\x0cLogStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"`\n\x0fLogStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.LogStartLine\"\x95\x01\n\x0eLogModelResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogModelResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogModelResult\"\xfa\x01\n\x11LogSnapshotResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x34\n\x03\x63\x66g\x18\x07 \x03(\x0b\x32\'.proto_types.LogSnapshotResult.CfgEntry\x1a*\n\x08\x43\x66gEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"j\n\x14LogSnapshotResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.LogSnapshotResult\"\xb9\x01\n\rLogSeedResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x16\n\x0eresult_message\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x10\n\x08relation\x18\x08 \x01(\t\"b\n\x10LogSeedResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogSeedResult\"\xad\x01\n\x12LogFreshnessResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12(\n\tnode_info\x18\x02 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x13\n\x0bsource_name\x18\x06 \x01(\t\x12\x12\n\ntable_name\x18\x07 \x01(\t\"l\n\x15LogFreshnessResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogFreshnessResult\"\"\n\rLogCancelLine\x12\x11\n\tconn_name\x18\x01 \x01(\t\"b\n\x10LogCancelLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogCancelLine\"\x1f\n\x0f\x44\x65\x66\x61ultSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"f\n\x12\x44\x65\x66\x61ultSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DefaultSelector\"5\n\tNodeStart\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"Z\n\x0cNodeStartMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.NodeStart\"g\n\x0cNodeFinished\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12-\n\nrun_result\x18\x02 \x01(\x0b\x32\x19.proto_types.RunResultMsg\"`\n\x0fNodeFinishedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.NodeFinished\"+\n\x1bQueryCancelationUnsupported\x12\x0c\n\x04type\x18\x01 \x01(\t\"~\n\x1eQueryCancelationUnsupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.QueryCancelationUnsupported\"O\n\x0f\x43oncurrencyLine\x12\x13\n\x0bnum_threads\x18\x01 \x01(\x05\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\x12\x12\n\nnode_count\x18\x03 \x01(\x05\"f\n\x12\x43oncurrencyLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ConcurrencyLine\"E\n\x19WritingInjectedSQLForNode\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"z\n\x1cWritingInjectedSQLForNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.WritingInjectedSQLForNode\"9\n\rNodeCompiling\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeCompilingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeCompiling\"9\n\rNodeExecuting\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeExecutingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeExecuting\"m\n\x10LogHookStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"h\n\x13LogHookStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.LogHookStartLine\"\x93\x01\n\x0eLogHookEndLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogHookEndLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogHookEndLine\"\x93\x01\n\x0fSkippingDetails\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\x12\x11\n\tnode_name\x18\x04 \x01(\t\x12\r\n\x05index\x18\x05 \x01(\x05\x12\r\n\x05total\x18\x06 \x01(\x05\"f\n\x12SkippingDetailsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SkippingDetails\"\r\n\x0bNothingToDo\"^\n\x0eNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.NothingToDo\",\n\x1dRunningOperationUncaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"\x82\x01\n RunningOperationUncaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.RunningOperationUncaughtError\"\x93\x01\n\x0c\x45ndRunResult\x12*\n\x07results\x18\x01 \x03(\x0b\x32\x19.proto_types.RunResultMsg\x12\x14\n\x0c\x65lapsed_time\x18\x02 \x01(\x02\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07success\x18\x04 \x01(\x08\"`\n\x0f\x45ndRunResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.EndRunResult\"\x11\n\x0fNoNodesSelected\"f\n\x12NoNodesSelectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.NoNodesSelected\"w\n\x10\x43ommandCompleted\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x65lapsed\x18\x04 \x01(\x02\"h\n\x13\x43ommandCompletedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.CommandCompleted\"k\n\x08ShowNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0f\n\x07preview\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"X\n\x0bShowNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.ShowNode\"p\n\x0c\x43ompiledNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x10\n\x08\x63ompiled\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"`\n\x0f\x43ompiledNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.CompiledNode\"b\n\x17\x43\x61tchableExceptionOnRun\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"v\n\x1a\x43\x61tchableExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.CatchableExceptionOnRun\"5\n\x12InternalErrorOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\"l\n\x15InternalErrorOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InternalErrorOnRun\"K\n\x15GenericExceptionOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"r\n\x18GenericExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.GenericExceptionOnRun\"N\n\x1aNodeConnectionReleaseError\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"|\n\x1dNodeConnectionReleaseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.NodeConnectionReleaseError\"\x1f\n\nFoundStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\"\\\n\rFoundStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.FoundStats\"\x17\n\x15MainKeyboardInterrupt\"r\n\x18MainKeyboardInterruptMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainKeyboardInterrupt\"#\n\x14MainEncounteredError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17MainEncounteredErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MainEncounteredError\"%\n\x0eMainStackTrace\x12\x13\n\x0bstack_trace\x18\x01 \x01(\t\"d\n\x11MainStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainStackTrace\"@\n\x13SystemCouldNotWrite\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"n\n\x16SystemCouldNotWriteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.SystemCouldNotWrite\"!\n\x12SystemExecutingCmd\x12\x0b\n\x03\x63md\x18\x01 \x03(\t\"l\n\x15SystemExecutingCmdMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SystemExecutingCmd\"\x1c\n\x0cSystemStdOut\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdOut\"\x1c\n\x0cSystemStdErr\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdErrMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdErr\",\n\x16SystemReportReturnCode\x12\x12\n\nreturncode\x18\x01 \x01(\x05\"t\n\x19SystemReportReturnCodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.SystemReportReturnCode\"p\n\x13TimingInfoCollected\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12/\n\x0btiming_info\x18\x02 \x01(\x0b\x32\x1a.proto_types.TimingInfoMsg\"n\n\x16TimingInfoCollectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.TimingInfoCollected\"&\n\x12LogDebugStackTrace\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"l\n\x15LogDebugStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDebugStackTrace\"\x1e\n\x0e\x43heckCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43heckCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CheckCleanPath\" \n\x10\x43onfirmCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"h\n\x13\x43onfirmCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConfirmCleanPath\"\"\n\x12ProtectedCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"l\n\x15ProtectedCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ProtectedCleanPath\"\x14\n\x12\x46inishedCleanPaths\"l\n\x15\x46inishedCleanPathsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FinishedCleanPaths\"5\n\x0bOpenCommand\x12\x10\n\x08open_cmd\x18\x01 \x01(\t\x12\x14\n\x0cprofiles_dir\x18\x02 \x01(\t\"^\n\x0eOpenCommandMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.OpenCommand\"\x19\n\nFormatting\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rFormattingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.Formatting\"0\n\x0fServingDocsPort\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"f\n\x12ServingDocsPortMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ServingDocsPort\"%\n\x15ServingDocsAccessInfo\x12\x0c\n\x04port\x18\x01 \x01(\t\"r\n\x18ServingDocsAccessInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ServingDocsAccessInfo\"\x15\n\x13ServingDocsExitInfo\"n\n\x16ServingDocsExitInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.ServingDocsExitInfo\"J\n\x10RunResultWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultWarning\"J\n\x10RunResultFailure\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultFailure\"k\n\tStatsLine\x12\x30\n\x05stats\x18\x01 \x03(\x0b\x32!.proto_types.StatsLine.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"Z\n\x0cStatsLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.StatsLine\"\x1d\n\x0eRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11RunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RunResultError\")\n\x17RunResultErrorNoMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"v\n\x1aRunResultErrorNoMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultErrorNoMessage\"\x1f\n\x0fSQLCompiledPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"f\n\x12SQLCompiledPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SQLCompiledPath\"-\n\x14\x43heckNodeTestFailure\x12\x15\n\rrelation_name\x18\x01 \x01(\t\"p\n\x17\x43heckNodeTestFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.CheckNodeTestFailure\"\"\n\x13\x46irstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"n\n\x16\x46irstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.FirstRunResultError\"\'\n\x18\x41\x66terFirstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"x\n\x1b\x41\x66terFirstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.AfterFirstRunResultError\"W\n\x0f\x45ndOfRunSummary\x12\x12\n\nnum_errors\x18\x01 \x01(\x05\x12\x14\n\x0cnum_warnings\x18\x02 \x01(\x05\x12\x1a\n\x12keyboard_interrupt\x18\x03 \x01(\x08\"f\n\x12\x45ndOfRunSummaryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.EndOfRunSummary\"U\n\x13LogSkipBecauseError\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12\x10\n\x08relation\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"n\n\x16LogSkipBecauseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.LogSkipBecauseError\"\x14\n\x12\x45nsureGitInstalled\"l\n\x15\x45nsureGitInstalledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.EnsureGitInstalled\"\x1a\n\x18\x44\x65psCreatingLocalSymlink\"x\n\x1b\x44\x65psCreatingLocalSymlinkMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsCreatingLocalSymlink\"\x19\n\x17\x44\x65psSymlinkNotAvailable\"v\n\x1a\x44\x65psSymlinkNotAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsSymlinkNotAvailable\"\x11\n\x0f\x44isableTracking\"f\n\x12\x44isableTrackingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DisableTracking\"\x1e\n\x0cSendingEvent\x12\x0e\n\x06kwargs\x18\x01 \x01(\t\"`\n\x0fSendingEventMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SendingEvent\"\x12\n\x10SendEventFailure\"h\n\x13SendEventFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SendEventFailure\"\r\n\x0b\x46lushEvents\"^\n\x0e\x46lushEventsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.FlushEvents\"\x14\n\x12\x46lushEventsFailure\"l\n\x15\x46lushEventsFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FlushEventsFailure\"-\n\x19TrackingInitializeFailure\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"z\n\x1cTrackingInitializeFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.TrackingInitializeFailure\"&\n\x17RunResultWarningMessage\x12\x0b\n\x03msg\x18\x01 \x01(\t\"v\n\x1aRunResultWarningMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultWarningMessage\"\x1a\n\x0b\x44\x65\x62ugCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"^\n\x0e\x44\x65\x62ugCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.DebugCmdOut\"\x1d\n\x0e\x44\x65\x62ugCmdResult\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11\x44\x65\x62ugCmdResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.DebugCmdResult\"\x19\n\nListCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rListCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.ListCmdOut\"\x13\n\x04Note\x12\x0b\n\x03msg\x18\x01 \x01(\t\"P\n\x07NoteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x1f\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x11.proto_types.Noteb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btypes.proto\x12\x0bproto_types\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x02\n\tEventInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\t\x12\x15\n\rinvocation_id\x18\x05 \x01(\t\x12\x0b\n\x03pid\x18\x06 \x01(\x05\x12\x0e\n\x06thread\x18\x07 \x01(\t\x12&\n\x02ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x05\x65xtra\x18\t \x03(\x0b\x32!.proto_types.EventInfo.ExtraEntry\x12\x10\n\x08\x63\x61tegory\x18\n \x01(\t\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x7f\n\rTimingInfoMsg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"V\n\x0cNodeRelation\x12\x10\n\x08\x64\x61tabase\x18\n \x01(\t\x12\x0e\n\x06schema\x18\x0b \x01(\t\x12\r\n\x05\x61lias\x18\x0c \x01(\t\x12\x15\n\rrelation_name\x18\r \x01(\t\"\x91\x02\n\x08NodeInfo\x12\x11\n\tnode_path\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x11\n\tunique_id\x18\x03 \x01(\t\x12\x15\n\rresource_type\x18\x04 \x01(\t\x12\x14\n\x0cmaterialized\x18\x05 \x01(\t\x12\x13\n\x0bnode_status\x18\x06 \x01(\t\x12\x17\n\x0fnode_started_at\x18\x07 \x01(\t\x12\x18\n\x10node_finished_at\x18\x08 \x01(\t\x12%\n\x04meta\x18\t \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x30\n\rnode_relation\x18\n \x01(\x0b\x32\x19.proto_types.NodeRelation\"\xd1\x01\n\x0cRunResultMsg\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12/\n\x0btiming_info\x18\x03 \x03(\x0b\x32\x1a.proto_types.TimingInfoMsg\x12\x0e\n\x06thread\x18\x04 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x31\n\x10\x61\x64\x61pter_response\x18\x06 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"G\n\x0fReferenceKeyMsg\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x12\n\nidentifier\x18\x03 \x01(\t\"6\n\x0eGenericMessage\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\"9\n\x11MainReportVersion\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0blog_version\x18\x02 \x01(\x05\"j\n\x14MainReportVersionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.MainReportVersion\"r\n\x0eMainReportArgs\x12\x33\n\x04\x61rgs\x18\x01 \x03(\x0b\x32%.proto_types.MainReportArgs.ArgsEntry\x1a+\n\tArgsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11MainReportArgsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainReportArgs\"+\n\x15MainTrackingUserState\x12\x12\n\nuser_state\x18\x01 \x01(\t\"r\n\x18MainTrackingUserStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainTrackingUserState\"5\n\x0fMergedFromState\x12\x12\n\nnum_merged\x18\x01 \x01(\x05\x12\x0e\n\x06sample\x18\x02 \x03(\t\"f\n\x12MergedFromStateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.MergedFromState\"A\n\x14MissingProfileTarget\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\"p\n\x17MissingProfileTargetMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MissingProfileTarget\"(\n\x11InvalidOptionYAML\x12\x13\n\x0boption_name\x18\x01 \x01(\t\"j\n\x14InvalidOptionYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.InvalidOptionYAML\"!\n\x12LogDbtProjectError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15LogDbtProjectErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProjectError\"3\n\x12LogDbtProfileError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08profiles\x18\x02 \x03(\t\"l\n\x15LogDbtProfileErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDbtProfileError\"!\n\x12StarterProjectPath\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"l\n\x15StarterProjectPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StarterProjectPath\"$\n\x15\x43onfigFolderDirectory\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"r\n\x18\x43onfigFolderDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConfigFolderDirectory\"\'\n\x14NoSampleProfileFound\x12\x0f\n\x07\x61\x64\x61pter\x18\x01 \x01(\t\"p\n\x17NoSampleProfileFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NoSampleProfileFound\"6\n\x18ProfileWrittenWithSample\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"x\n\x1bProfileWrittenWithSampleMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProfileWrittenWithSample\"B\n$ProfileWrittenWithTargetTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x90\x01\n\'ProfileWrittenWithTargetTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.ProfileWrittenWithTargetTemplateYAML\"C\n%ProfileWrittenWithProjectTemplateYAML\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x92\x01\n(ProfileWrittenWithProjectTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.ProfileWrittenWithProjectTemplateYAML\"\x12\n\x10SettingUpProfile\"h\n\x13SettingUpProfileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SettingUpProfile\"\x1c\n\x1aInvalidProfileTemplateYAML\"|\n\x1dInvalidProfileTemplateYAMLMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.InvalidProfileTemplateYAML\"(\n\x18ProjectNameAlreadyExists\x12\x0c\n\x04name\x18\x01 \x01(\t\"x\n\x1bProjectNameAlreadyExistsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ProjectNameAlreadyExists\"K\n\x0eProjectCreated\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocs_url\x18\x02 \x01(\t\x12\x11\n\tslack_url\x18\x03 \x01(\t\"d\n\x11ProjectCreatedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ProjectCreated\"@\n\x1aPackageRedirectDeprecation\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1dPackageRedirectDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PackageRedirectDeprecation\"\x1f\n\x1dPackageInstallPathDeprecation\"\x82\x01\n PackageInstallPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.PackageInstallPathDeprecation\"H\n\x1b\x43onfigSourcePathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"~\n\x1e\x43onfigSourcePathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigSourcePathDeprecation\"F\n\x19\x43onfigDataPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\x12\x10\n\x08\x65xp_path\x18\x02 \x01(\t\"z\n\x1c\x43onfigDataPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConfigDataPathDeprecation\"?\n\x19\x41\x64\x61pterDeprecationWarning\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"z\n\x1c\x41\x64\x61pterDeprecationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.AdapterDeprecationWarning\".\n\x17MetricAttributesRenamed\x12\x13\n\x0bmetric_name\x18\x01 \x01(\t\"v\n\x1aMetricAttributesRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.MetricAttributesRenamed\"+\n\x17\x45xposureNameDeprecation\x12\x10\n\x08\x65xposure\x18\x01 \x01(\t\"v\n\x1a\x45xposureNameDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.ExposureNameDeprecation\"^\n\x13InternalDeprecation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x18\n\x10suggested_action\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\"n\n\x16InternalDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.InternalDeprecation\"@\n\x1a\x45nvironmentVariableRenamed\x12\x10\n\x08old_name\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"|\n\x1d\x45nvironmentVariableRenamedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.EnvironmentVariableRenamed\"3\n\x18\x43onfigLogPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"x\n\x1b\x43onfigLogPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.ConfigLogPathDeprecation\"6\n\x1b\x43onfigTargetPathDeprecation\x12\x17\n\x0f\x64\x65precated_path\x18\x01 \x01(\t\"~\n\x1e\x43onfigTargetPathDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConfigTargetPathDeprecation\"!\n\x1f\x43ollectFreshnessReturnSignature\"\x86\x01\n\"CollectFreshnessReturnSignatureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.CollectFreshnessReturnSignature\"\x87\x01\n\x11\x41\x64\x61pterEventDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"j\n\x14\x41\x64\x61pterEventDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventDebug\"\x86\x01\n\x10\x41\x64\x61pterEventInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"h\n\x13\x41\x64\x61pterEventInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.AdapterEventInfo\"\x89\x01\n\x13\x41\x64\x61pterEventWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\"n\n\x16\x41\x64\x61pterEventWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.AdapterEventWarning\"\x99\x01\n\x11\x41\x64\x61pterEventError\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x61se_msg\x18\x03 \x01(\t\x12(\n\x04\x61rgs\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.ListValue\x12\x10\n\x08\x65xc_info\x18\x05 \x01(\t\"j\n\x14\x41\x64\x61pterEventErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterEventError\"_\n\rNewConnection\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"b\n\x10NewConnectionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NewConnection\"=\n\x10\x43onnectionReused\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x16\n\x0eorig_conn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionReusedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionReused\"0\n\x1b\x43onnectionLeftOpenInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"~\n\x1e\x43onnectionLeftOpenInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.ConnectionLeftOpenInCleanup\".\n\x19\x43onnectionClosedInCleanup\x12\x11\n\tconn_name\x18\x01 \x01(\t\"z\n\x1c\x43onnectionClosedInCleanupMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.ConnectionClosedInCleanup\"_\n\x0eRollbackFailed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"d\n\x11RollbackFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RollbackFailed\"O\n\x10\x43onnectionClosed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"h\n\x13\x43onnectionClosedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConnectionClosed\"Q\n\x12\x43onnectionLeftOpen\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"l\n\x15\x43onnectionLeftOpenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ConnectionLeftOpen\"G\n\x08Rollback\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"X\n\x0bRollbackMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.Rollback\"@\n\tCacheMiss\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\"Z\n\x0c\x43\x61\x63heMissMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.CacheMiss\"b\n\rListRelations\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12/\n\trelations\x18\x03 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10ListRelationsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ListRelations\"`\n\x0e\x43onnectionUsed\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_type\x18\x02 \x01(\t\x12\x11\n\tconn_name\x18\x03 \x01(\t\"d\n\x11\x43onnectionUsedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.ConnectionUsed\"T\n\x08SQLQuery\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\x12\x0b\n\x03sql\x18\x03 \x01(\t\"X\n\x0bSQLQueryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.SQLQuery\"[\n\x0eSQLQueryStatus\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x03 \x01(\x02\"d\n\x11SQLQueryStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SQLQueryStatus\"H\n\tSQLCommit\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tconn_name\x18\x02 \x01(\t\"Z\n\x0cSQLCommitMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.SQLCommit\"a\n\rColTypeChange\x12\x11\n\torig_type\x18\x01 \x01(\t\x12\x10\n\x08new_type\x18\x02 \x01(\t\x12+\n\x05table\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"b\n\x10\x43olTypeChangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.ColTypeChange\"@\n\x0eSchemaCreation\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"d\n\x11SchemaCreationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.SchemaCreation\"<\n\nSchemaDrop\x12.\n\x08relation\x18\x01 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"\\\n\rSchemaDropMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SchemaDrop\"\xde\x01\n\x0b\x43\x61\x63heAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12-\n\x07ref_key\x18\x02 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_2\x18\x03 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12/\n\tref_key_3\x18\x04 \x01(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\x12.\n\x08ref_list\x18\x05 \x03(\x0b\x32\x1c.proto_types.ReferenceKeyMsg\"^\n\x0e\x43\x61\x63heActionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.CacheAction\"\x98\x01\n\x0e\x43\x61\x63heDumpGraph\x12\x33\n\x04\x64ump\x18\x01 \x03(\x0b\x32%.proto_types.CacheDumpGraph.DumpEntry\x12\x14\n\x0c\x62\x65\x66ore_after\x18\x02 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\t\x1a+\n\tDumpEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"d\n\x11\x43\x61\x63heDumpGraphMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CacheDumpGraph\"B\n\x11\x41\x64\x61pterRegistered\x12\x14\n\x0c\x61\x64\x61pter_name\x18\x01 \x01(\t\x12\x17\n\x0f\x61\x64\x61pter_version\x18\x02 \x01(\t\"j\n\x14\x41\x64\x61pterRegisteredMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.AdapterRegistered\"!\n\x12\x41\x64\x61pterImportError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"l\n\x15\x41\x64\x61pterImportErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.AdapterImportError\"#\n\x0fPluginLoadError\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"f\n\x12PluginLoadErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.PluginLoadError\"Z\n\x14NewConnectionOpening\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x18\n\x10\x63onnection_state\x18\x02 \x01(\t\"p\n\x17NewConnectionOpeningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.NewConnectionOpening\"8\n\rCodeExecution\x12\x11\n\tconn_name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ode_content\x18\x02 \x01(\t\"b\n\x10\x43odeExecutionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.CodeExecution\"6\n\x13\x43odeExecutionStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07\x65lapsed\x18\x02 \x01(\x02\"n\n\x16\x43odeExecutionStatusMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.CodeExecutionStatus\"%\n\x16\x43\x61talogGenerationError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"t\n\x19\x43\x61talogGenerationErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.CatalogGenerationError\"-\n\x13WriteCatalogFailure\x12\x16\n\x0enum_exceptions\x18\x01 \x01(\x05\"n\n\x16WriteCatalogFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.WriteCatalogFailure\"\x1e\n\x0e\x43\x61talogWritten\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43\x61talogWrittenMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CatalogWritten\"\x14\n\x12\x43\x61nnotGenerateDocs\"l\n\x15\x43\x61nnotGenerateDocsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.CannotGenerateDocs\"\x11\n\x0f\x42uildingCatalog\"f\n\x12\x42uildingCatalogMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.BuildingCatalog\"-\n\x18\x44\x61tabaseErrorRunningHook\x12\x11\n\thook_type\x18\x01 \x01(\t\"x\n\x1b\x44\x61tabaseErrorRunningHookMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DatabaseErrorRunningHook\"4\n\x0cHooksRunning\x12\x11\n\tnum_hooks\x18\x01 \x01(\x05\x12\x11\n\thook_type\x18\x02 \x01(\t\"`\n\x0fHooksRunningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.HooksRunning\"T\n\x14\x46inishedRunningStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\x12\x11\n\texecution\x18\x02 \x01(\t\x12\x16\n\x0e\x65xecution_time\x18\x03 \x01(\x02\"p\n\x17\x46inishedRunningStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.FinishedRunningStats\"<\n\x15\x43onstraintNotEnforced\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"r\n\x18\x43onstraintNotEnforcedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ConstraintNotEnforced\"=\n\x16\x43onstraintNotSupported\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x61pter\x18\x02 \x01(\t\"t\n\x19\x43onstraintNotSupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.ConstraintNotSupported\"7\n\x12InputFileDiffError\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x02 \x01(\t\"l\n\x15InputFileDiffErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InputFileDiffError\"t\n\x1aPublicationArtifactChanged\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"|\n\x1dPublicationArtifactChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.PublicationArtifactChanged\"?\n\x14InvalidValueForField\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x13\n\x0b\x66ield_value\x18\x02 \x01(\t\"p\n\x17InvalidValueForFieldMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.InvalidValueForField\"Q\n\x11ValidationWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x11\n\tnode_name\x18\x03 \x01(\t\"j\n\x14ValidationWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ValidationWarning\"!\n\x11ParsePerfInfoPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"j\n\x14ParsePerfInfoPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.ParsePerfInfoPath\"1\n!PartialParsingErrorProcessingFile\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\"\x8a\x01\n$PartialParsingErrorProcessingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.PartialParsingErrorProcessingFile\"\x86\x01\n\x13PartialParsingError\x12?\n\x08\x65xc_info\x18\x01 \x03(\x0b\x32-.proto_types.PartialParsingError.ExcInfoEntry\x1a.\n\x0c\x45xcInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"n\n\x16PartialParsingErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.PartialParsingError\"\x1b\n\x19PartialParsingSkipParsing\"z\n\x1cPartialParsingSkipParsingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.PartialParsingSkipParsing\"&\n\x14UnableToPartialParse\x12\x0e\n\x06reason\x18\x01 \x01(\t\"p\n\x17UnableToPartialParseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.UnableToPartialParse\"f\n\x12StateCheckVarsHash\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\x12\x0c\n\x04vars\x18\x02 \x01(\t\x12\x0f\n\x07profile\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\"l\n\x15StateCheckVarsHashMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.StateCheckVarsHash\"\x1a\n\x18PartialParsingNotEnabled\"x\n\x1bPartialParsingNotEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.PartialParsingNotEnabled\"C\n\x14ParsedFileLoadFailed\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"p\n\x17ParsedFileLoadFailedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.ParsedFileLoadFailed\"H\n\x15PartialParsingEnabled\x12\x0f\n\x07\x64\x65leted\x18\x01 \x01(\x05\x12\r\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x05\x12\x0f\n\x07\x63hanged\x18\x03 \x01(\x05\"r\n\x18PartialParsingEnabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.PartialParsingEnabled\"8\n\x12PartialParsingFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\"l\n\x15PartialParsingFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.PartialParsingFile\"\xaf\x01\n\x1fInvalidDisabledTargetInTestNode\x12\x1b\n\x13resource_type_title\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1a\n\x12original_file_path\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\x12\x13\n\x0btarget_name\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\"\x86\x01\n\"InvalidDisabledTargetInTestNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.InvalidDisabledTargetInTestNode\"7\n\x18UnusedResourceConfigPath\x12\x1b\n\x13unused_config_paths\x18\x01 \x03(\t\"x\n\x1bUnusedResourceConfigPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.UnusedResourceConfigPath\"3\n\rSeedIncreased\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"b\n\x10SeedIncreasedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.SeedIncreased\">\n\x18SeedExceedsLimitSamePath\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"x\n\x1bSeedExceedsLimitSamePathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.SeedExceedsLimitSamePath\"D\n\x1eSeedExceedsLimitAndPathChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x84\x01\n!SeedExceedsLimitAndPathChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.SeedExceedsLimitAndPathChanged\"\\\n\x1fSeedExceedsLimitChecksumChanged\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rchecksum_name\x18\x03 \x01(\t\"\x86\x01\n\"SeedExceedsLimitChecksumChangedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.SeedExceedsLimitChecksumChanged\"%\n\x0cUnusedTables\x12\x15\n\runused_tables\x18\x01 \x03(\t\"`\n\x0fUnusedTablesMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.UnusedTables\"\x87\x01\n\x17WrongResourceSchemaFile\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x1c\n\x14plural_resource_type\x18\x03 \x01(\t\x12\x10\n\x08yaml_key\x18\x04 \x01(\t\x12\x11\n\tfile_path\x18\x05 \x01(\t\"v\n\x1aWrongResourceSchemaFileMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.WrongResourceSchemaFile\"K\n\x10NoNodeForYamlKey\x12\x12\n\npatch_name\x18\x01 \x01(\t\x12\x10\n\x08yaml_key\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x03 \x01(\t\"h\n\x13NoNodeForYamlKeyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.NoNodeForYamlKey\"+\n\x15MacroNotFoundForPatch\x12\x12\n\npatch_name\x18\x01 \x01(\t\"r\n\x18MacroNotFoundForPatchMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MacroNotFoundForPatch\"\xb8\x01\n\x16NodeNotFoundOrDisabled\x12\x1a\n\x12original_file_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x1b\n\x13resource_type_title\x18\x03 \x01(\t\x12\x13\n\x0btarget_name\x18\x04 \x01(\t\x12\x13\n\x0btarget_kind\x18\x05 \x01(\t\x12\x16\n\x0etarget_package\x18\x06 \x01(\t\x12\x10\n\x08\x64isabled\x18\x07 \x01(\t\"t\n\x19NodeNotFoundOrDisabledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.NodeNotFoundOrDisabled\"H\n\x0fJinjaLogWarning\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"f\n\x12JinjaLogWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.JinjaLogWarning\"E\n\x0cJinjaLogInfo\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"`\n\x0fJinjaLogInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.JinjaLogInfo\"F\n\rJinjaLogDebug\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03msg\x18\x02 \x01(\t\"b\n\x10JinjaLogDebugMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.JinjaLogDebug\"\xae\x01\n\x1eUnpinnedRefNewVersionAvailable\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rref_node_name\x18\x02 \x01(\t\x12\x18\n\x10ref_node_package\x18\x03 \x01(\t\x12\x18\n\x10ref_node_version\x18\x04 \x01(\t\x12\x17\n\x0fref_max_version\x18\x05 \x01(\t\"\x84\x01\n!UnpinnedRefNewVersionAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.UnpinnedRefNewVersionAvailable\"V\n\x0f\x44\x65precatedModel\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\x18\n\x10\x64\x65precation_date\x18\x03 \x01(\t\"f\n\x12\x44\x65precatedModelMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DeprecatedModel\"\xc6\x01\n\x1cUpcomingReferenceDeprecation\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"\x80\x01\n\x1fUpcomingReferenceDeprecationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.UpcomingReferenceDeprecation\"\xbd\x01\n\x13\x44\x65precatedReference\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x19\n\x11ref_model_package\x18\x02 \x01(\t\x12\x16\n\x0eref_model_name\x18\x03 \x01(\t\x12\x19\n\x11ref_model_version\x18\x04 \x01(\t\x12 \n\x18ref_model_latest_version\x18\x05 \x01(\t\x12\"\n\x1aref_model_deprecation_date\x18\x06 \x01(\t\"n\n\x16\x44\x65precatedReferenceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DeprecatedReference\"<\n$UnsupportedConstraintMaterialization\x12\x14\n\x0cmaterialized\x18\x01 \x01(\t\"\x90\x01\n\'UnsupportedConstraintMaterializationMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12?\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x31.proto_types.UnsupportedConstraintMaterialization\"/\n\x1dGitSparseCheckoutSubdirectory\x12\x0e\n\x06subdir\x18\x01 \x01(\t\"\x82\x01\n GitSparseCheckoutSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.GitSparseCheckoutSubdirectory\"/\n\x1bGitProgressCheckoutRevision\x12\x10\n\x08revision\x18\x01 \x01(\t\"~\n\x1eGitProgressCheckoutRevisionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.GitProgressCheckoutRevision\"4\n%GitProgressUpdatingExistingDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x92\x01\n(GitProgressUpdatingExistingDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12@\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x32.proto_types.GitProgressUpdatingExistingDependency\".\n\x1fGitProgressPullingNewDependency\x12\x0b\n\x03\x64ir\x18\x01 \x01(\t\"\x86\x01\n\"GitProgressPullingNewDependencyMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressPullingNewDependency\"\x1d\n\x0eGitNothingToDo\x12\x0b\n\x03sha\x18\x01 \x01(\t\"d\n\x11GitNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.GitNothingToDo\"E\n\x1fGitProgressUpdatedCheckoutRange\x12\x11\n\tstart_sha\x18\x01 \x01(\t\x12\x0f\n\x07\x65nd_sha\x18\x02 \x01(\t\"\x86\x01\n\"GitProgressUpdatedCheckoutRangeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.GitProgressUpdatedCheckoutRange\"*\n\x17GitProgressCheckedOutAt\x12\x0f\n\x07\x65nd_sha\x18\x01 \x01(\t\"v\n\x1aGitProgressCheckedOutAtMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.GitProgressCheckedOutAt\")\n\x1aRegistryProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"|\n\x1dRegistryProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.RegistryProgressGETRequest\"=\n\x1bRegistryProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"~\n\x1eRegistryProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RegistryProgressGETResponse\"_\n\x1dSelectorReportInvalidSelector\x12\x17\n\x0fvalid_selectors\x18\x01 \x01(\t\x12\x13\n\x0bspec_method\x18\x02 \x01(\t\x12\x10\n\x08raw_spec\x18\x03 \x01(\t\"\x82\x01\n SelectorReportInvalidSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.SelectorReportInvalidSelector\"\x15\n\x13\x44\x65psNoPackagesFound\"n\n\x16\x44\x65psNoPackagesFoundMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsNoPackagesFound\"/\n\x17\x44\x65psStartPackageInstall\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\"v\n\x1a\x44\x65psStartPackageInstallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsStartPackageInstall\"\'\n\x0f\x44\x65psInstallInfo\x12\x14\n\x0cversion_name\x18\x01 \x01(\t\"f\n\x12\x44\x65psInstallInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DepsInstallInfo\"-\n\x13\x44\x65psUpdateAvailable\x12\x16\n\x0eversion_latest\x18\x01 \x01(\t\"n\n\x16\x44\x65psUpdateAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.DepsUpdateAvailable\"\x0e\n\x0c\x44\x65psUpToDate\"`\n\x0f\x44\x65psUpToDateMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUpToDate\",\n\x14\x44\x65psListSubdirectory\x12\x14\n\x0csubdirectory\x18\x01 \x01(\t\"p\n\x17\x44\x65psListSubdirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.DepsListSubdirectory\".\n\x1a\x44\x65psNotifyUpdatesAvailable\x12\x10\n\x08packages\x18\x01 \x03(\t\"|\n\x1d\x44\x65psNotifyUpdatesAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.DepsNotifyUpdatesAvailable\"1\n\x11RetryExternalCall\x12\x0f\n\x07\x61ttempt\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"j\n\x14RetryExternalCallMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.RetryExternalCall\"#\n\x14RecordRetryException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17RecordRetryExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.RecordRetryException\".\n\x1fRegistryIndexProgressGETRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\"\x86\x01\n\"RegistryIndexProgressGETRequestMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryIndexProgressGETRequest\"B\n RegistryIndexProgressGETResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tresp_code\x18\x02 \x01(\x05\"\x88\x01\n#RegistryIndexProgressGETResponseMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12;\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32-.proto_types.RegistryIndexProgressGETResponse\"2\n\x1eRegistryResponseUnexpectedType\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseUnexpectedTypeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseUnexpectedType\"2\n\x1eRegistryResponseMissingTopKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x84\x01\n!RegistryResponseMissingTopKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x39\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32+.proto_types.RegistryResponseMissingTopKeys\"5\n!RegistryResponseMissingNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x8a\x01\n$RegistryResponseMissingNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12<\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32..proto_types.RegistryResponseMissingNestedKeys\"3\n\x1fRegistryResponseExtraNestedKeys\x12\x10\n\x08response\x18\x01 \x01(\t\"\x86\x01\n\"RegistryResponseExtraNestedKeysMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12:\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32,.proto_types.RegistryResponseExtraNestedKeys\"(\n\x18\x44\x65psSetDownloadDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\"x\n\x1b\x44\x65psSetDownloadDirectoryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsSetDownloadDirectory\"-\n\x0c\x44\x65psUnpinned\x12\x10\n\x08revision\x18\x01 \x01(\t\x12\x0b\n\x03git\x18\x02 \x01(\t\"`\n\x0f\x44\x65psUnpinnedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.DepsUnpinned\"/\n\x1bNoNodesForSelectionCriteria\x12\x10\n\x08spec_raw\x18\x01 \x01(\t\"~\n\x1eNoNodesForSelectionCriteriaMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.NoNodesForSelectionCriteria\"M\n\x1cPublicationArtifactAvailable\x12-\n\x0cpub_artifact\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\"\x80\x01\n\x1fPublicationArtifactAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x37\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32).proto_types.PublicationArtifactAvailable\"*\n\x1bRunningOperationCaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"~\n\x1eRunningOperationCaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.RunningOperationCaughtError\"\x11\n\x0f\x43ompileComplete\"f\n\x12\x43ompileCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.CompileComplete\"\x18\n\x16\x46reshnessCheckComplete\"t\n\x19\x46reshnessCheckCompleteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.FreshnessCheckComplete\"\x1c\n\nSeedHeader\x12\x0e\n\x06header\x18\x01 \x01(\t\"\\\n\rSeedHeaderMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.SeedHeader\"3\n\x12SQLRunnerException\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x02 \x01(\t\"l\n\x15SQLRunnerExceptionMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SQLRunnerException\"\xa8\x01\n\rLogTestResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x12\n\nnum_models\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x14\n\x0cnum_failures\x18\x07 \x01(\x05\"b\n\x10LogTestResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogTestResult\"k\n\x0cLogStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"`\n\x0fLogStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.LogStartLine\"\x95\x01\n\x0eLogModelResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogModelResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogModelResult\"\xfa\x01\n\x11LogSnapshotResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x34\n\x03\x63\x66g\x18\x07 \x03(\x0b\x32\'.proto_types.LogSnapshotResult.CfgEntry\x1a*\n\x08\x43\x66gEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"j\n\x14LogSnapshotResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12,\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1e.proto_types.LogSnapshotResult\"\xb9\x01\n\rLogSeedResult\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x16\n\x0eresult_message\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x10\n\x08relation\x18\x08 \x01(\t\"b\n\x10LogSeedResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogSeedResult\"\xad\x01\n\x12LogFreshnessResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12(\n\tnode_info\x18\x02 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x05 \x01(\x02\x12\x13\n\x0bsource_name\x18\x06 \x01(\t\x12\x12\n\ntable_name\x18\x07 \x01(\t\"l\n\x15LogFreshnessResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogFreshnessResult\"\"\n\rLogCancelLine\x12\x11\n\tconn_name\x18\x01 \x01(\t\"b\n\x10LogCancelLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.LogCancelLine\"\x1f\n\x0f\x44\x65\x66\x61ultSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"f\n\x12\x44\x65\x66\x61ultSelectorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DefaultSelector\"5\n\tNodeStart\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"Z\n\x0cNodeStartMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.NodeStart\"g\n\x0cNodeFinished\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12-\n\nrun_result\x18\x02 \x01(\x0b\x32\x19.proto_types.RunResultMsg\"`\n\x0fNodeFinishedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.NodeFinished\"+\n\x1bQueryCancelationUnsupported\x12\x0c\n\x04type\x18\x01 \x01(\t\"~\n\x1eQueryCancelationUnsupportedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x36\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32(.proto_types.QueryCancelationUnsupported\"O\n\x0f\x43oncurrencyLine\x12\x13\n\x0bnum_threads\x18\x01 \x01(\x05\x12\x13\n\x0btarget_name\x18\x02 \x01(\t\x12\x12\n\nnode_count\x18\x03 \x01(\x05\"f\n\x12\x43oncurrencyLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ConcurrencyLine\"E\n\x19WritingInjectedSQLForNode\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"z\n\x1cWritingInjectedSQLForNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.WritingInjectedSQLForNode\"9\n\rNodeCompiling\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeCompilingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeCompiling\"9\n\rNodeExecuting\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\"b\n\x10NodeExecutingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12(\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1a.proto_types.NodeExecuting\"m\n\x10LogHookStartLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"h\n\x13LogHookStartLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.LogHookStartLine\"\x93\x01\n\x0eLogHookEndLine\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x11\n\tstatement\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\r\n\x05total\x18\x05 \x01(\x05\x12\x16\n\x0e\x65xecution_time\x18\x06 \x01(\x02\"d\n\x11LogHookEndLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.LogHookEndLine\"\x93\x01\n\x0fSkippingDetails\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x0e\n\x06schema\x18\x03 \x01(\t\x12\x11\n\tnode_name\x18\x04 \x01(\t\x12\r\n\x05index\x18\x05 \x01(\x05\x12\r\n\x05total\x18\x06 \x01(\x05\"f\n\x12SkippingDetailsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SkippingDetails\"\r\n\x0bNothingToDo\"^\n\x0eNothingToDoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.NothingToDo\",\n\x1dRunningOperationUncaughtError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"\x82\x01\n RunningOperationUncaughtErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x38\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32*.proto_types.RunningOperationUncaughtError\"\x93\x01\n\x0c\x45ndRunResult\x12*\n\x07results\x18\x01 \x03(\x0b\x32\x19.proto_types.RunResultMsg\x12\x14\n\x0c\x65lapsed_time\x18\x02 \x01(\x02\x12\x30\n\x0cgenerated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07success\x18\x04 \x01(\x08\"`\n\x0f\x45ndRunResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.EndRunResult\"\x11\n\x0fNoNodesSelected\"f\n\x12NoNodesSelectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.NoNodesSelected\"w\n\x10\x43ommandCompleted\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x30\n\x0c\x63ompleted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x65lapsed\x18\x04 \x01(\x02\"h\n\x13\x43ommandCompletedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.CommandCompleted\"k\n\x08ShowNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0f\n\x07preview\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"X\n\x0bShowNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12#\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x15.proto_types.ShowNode\"p\n\x0c\x43ompiledNode\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x10\n\x08\x63ompiled\x18\x02 \x01(\t\x12\x11\n\tis_inline\x18\x03 \x01(\x08\x12\x15\n\routput_format\x18\x04 \x01(\t\x12\x11\n\tunique_id\x18\x05 \x01(\t\"`\n\x0f\x43ompiledNodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.CompiledNode\"b\n\x17\x43\x61tchableExceptionOnRun\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"v\n\x1a\x43\x61tchableExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.CatchableExceptionOnRun\"5\n\x12InternalErrorOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\"l\n\x15InternalErrorOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.InternalErrorOnRun\"K\n\x15GenericExceptionOnRun\x12\x12\n\nbuild_path\x18\x01 \x01(\t\x12\x11\n\tunique_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"r\n\x18GenericExceptionOnRunMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.GenericExceptionOnRun\"N\n\x1aNodeConnectionReleaseError\x12\x11\n\tnode_name\x18\x01 \x01(\t\x12\x0b\n\x03\x65xc\x18\x02 \x01(\t\x12\x10\n\x08\x65xc_info\x18\x03 \x01(\t\"|\n\x1dNodeConnectionReleaseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x35\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\'.proto_types.NodeConnectionReleaseError\"\x1f\n\nFoundStats\x12\x11\n\tstat_line\x18\x01 \x01(\t\"\\\n\rFoundStatsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.FoundStats\"\x17\n\x15MainKeyboardInterrupt\"r\n\x18MainKeyboardInterruptMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.MainKeyboardInterrupt\"#\n\x14MainEncounteredError\x12\x0b\n\x03\x65xc\x18\x01 \x01(\t\"p\n\x17MainEncounteredErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.MainEncounteredError\"%\n\x0eMainStackTrace\x12\x13\n\x0bstack_trace\x18\x01 \x01(\t\"d\n\x11MainStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.MainStackTrace\"@\n\x13SystemCouldNotWrite\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x0b\n\x03\x65xc\x18\x03 \x01(\t\"n\n\x16SystemCouldNotWriteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.SystemCouldNotWrite\"!\n\x12SystemExecutingCmd\x12\x0b\n\x03\x63md\x18\x01 \x03(\t\"l\n\x15SystemExecutingCmdMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.SystemExecutingCmd\"\x1c\n\x0cSystemStdOut\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdOut\"\x1c\n\x0cSystemStdErr\x12\x0c\n\x04\x62msg\x18\x01 \x01(\t\"`\n\x0fSystemStdErrMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SystemStdErr\",\n\x16SystemReportReturnCode\x12\x12\n\nreturncode\x18\x01 \x01(\x05\"t\n\x19SystemReportReturnCodeMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x31\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32#.proto_types.SystemReportReturnCode\"p\n\x13TimingInfoCollected\x12(\n\tnode_info\x18\x01 \x01(\x0b\x32\x15.proto_types.NodeInfo\x12/\n\x0btiming_info\x18\x02 \x01(\x0b\x32\x1a.proto_types.TimingInfoMsg\"n\n\x16TimingInfoCollectedMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.TimingInfoCollected\"&\n\x12LogDebugStackTrace\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"l\n\x15LogDebugStackTraceMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.LogDebugStackTrace\"\x1e\n\x0e\x43heckCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"d\n\x11\x43heckCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.CheckCleanPath\" \n\x10\x43onfirmCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"h\n\x13\x43onfirmCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.ConfirmCleanPath\"\"\n\x12ProtectedCleanPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"l\n\x15ProtectedCleanPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.ProtectedCleanPath\"\x14\n\x12\x46inishedCleanPaths\"l\n\x15\x46inishedCleanPathsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FinishedCleanPaths\"5\n\x0bOpenCommand\x12\x10\n\x08open_cmd\x18\x01 \x01(\t\x12\x14\n\x0cprofiles_dir\x18\x02 \x01(\t\"^\n\x0eOpenCommandMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.OpenCommand\"\x19\n\nFormatting\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rFormattingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.Formatting\"0\n\x0fServingDocsPort\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"f\n\x12ServingDocsPortMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.ServingDocsPort\"%\n\x15ServingDocsAccessInfo\x12\x0c\n\x04port\x18\x01 \x01(\t\"r\n\x18ServingDocsAccessInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\".proto_types.ServingDocsAccessInfo\"\x15\n\x13ServingDocsExitInfo\"n\n\x16ServingDocsExitInfoMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.ServingDocsExitInfo\"J\n\x10RunResultWarning\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultWarningMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultWarning\"J\n\x10RunResultFailure\x12\x15\n\rresource_type\x18\x01 \x01(\t\x12\x11\n\tnode_name\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"h\n\x13RunResultFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.RunResultFailure\"k\n\tStatsLine\x12\x30\n\x05stats\x18\x01 \x03(\x0b\x32!.proto_types.StatsLine.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"Z\n\x0cStatsLineMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12$\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x16.proto_types.StatsLine\"\x1d\n\x0eRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11RunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.RunResultError\")\n\x17RunResultErrorNoMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"v\n\x1aRunResultErrorNoMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultErrorNoMessage\"\x1f\n\x0fSQLCompiledPath\x12\x0c\n\x04path\x18\x01 \x01(\t\"f\n\x12SQLCompiledPathMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.SQLCompiledPath\"-\n\x14\x43heckNodeTestFailure\x12\x15\n\rrelation_name\x18\x01 \x01(\t\"p\n\x17\x43heckNodeTestFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12/\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32!.proto_types.CheckNodeTestFailure\"\"\n\x13\x46irstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"n\n\x16\x46irstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.FirstRunResultError\"\'\n\x18\x41\x66terFirstRunResultError\x12\x0b\n\x03msg\x18\x01 \x01(\t\"x\n\x1b\x41\x66terFirstRunResultErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.AfterFirstRunResultError\"W\n\x0f\x45ndOfRunSummary\x12\x12\n\nnum_errors\x18\x01 \x01(\x05\x12\x14\n\x0cnum_warnings\x18\x02 \x01(\x05\x12\x1a\n\x12keyboard_interrupt\x18\x03 \x01(\x08\"f\n\x12\x45ndOfRunSummaryMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.EndOfRunSummary\"U\n\x13LogSkipBecauseError\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12\x10\n\x08relation\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\r\n\x05total\x18\x04 \x01(\x05\"n\n\x16LogSkipBecauseErrorMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12.\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .proto_types.LogSkipBecauseError\"\x14\n\x12\x45nsureGitInstalled\"l\n\x15\x45nsureGitInstalledMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.EnsureGitInstalled\"\x1a\n\x18\x44\x65psCreatingLocalSymlink\"x\n\x1b\x44\x65psCreatingLocalSymlinkMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x33\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32%.proto_types.DepsCreatingLocalSymlink\"\x19\n\x17\x44\x65psSymlinkNotAvailable\"v\n\x1a\x44\x65psSymlinkNotAvailableMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.DepsSymlinkNotAvailable\"\x11\n\x0f\x44isableTracking\"f\n\x12\x44isableTrackingMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12*\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1c.proto_types.DisableTracking\"\x1e\n\x0cSendingEvent\x12\x0e\n\x06kwargs\x18\x01 \x01(\t\"`\n\x0fSendingEventMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\'\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x19.proto_types.SendingEvent\"\x12\n\x10SendEventFailure\"h\n\x13SendEventFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.proto_types.SendEventFailure\"\r\n\x0b\x46lushEvents\"^\n\x0e\x46lushEventsMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.FlushEvents\"\x14\n\x12\x46lushEventsFailure\"l\n\x15\x46lushEventsFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12-\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1f.proto_types.FlushEventsFailure\"-\n\x19TrackingInitializeFailure\x12\x10\n\x08\x65xc_info\x18\x01 \x01(\t\"z\n\x1cTrackingInitializeFailureMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x34\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32&.proto_types.TrackingInitializeFailure\"&\n\x17RunResultWarningMessage\x12\x0b\n\x03msg\x18\x01 \x01(\t\"v\n\x1aRunResultWarningMessageMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x32\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32$.proto_types.RunResultWarningMessage\"\x1a\n\x0b\x44\x65\x62ugCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"^\n\x0e\x44\x65\x62ugCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12&\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x18.proto_types.DebugCmdOut\"\x1d\n\x0e\x44\x65\x62ugCmdResult\x12\x0b\n\x03msg\x18\x01 \x01(\t\"d\n\x11\x44\x65\x62ugCmdResultMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12)\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1b.proto_types.DebugCmdResult\"\x19\n\nListCmdOut\x12\x0b\n\x03msg\x18\x01 \x01(\t\"\\\n\rListCmdOutMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12%\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.proto_types.ListCmdOut\"\x13\n\x04Note\x12\x0b\n\x03msg\x18\x01 \x01(\t\"P\n\x07NoteMsg\x12$\n\x04info\x18\x01 \x01(\x0b\x32\x16.proto_types.EventInfo\x12\x1f\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x11.proto_types.Noteb\x06proto3') -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'types_pb2', globals()) +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'types_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None @@ -34,866 +35,870 @@ _LOGSNAPSHOTRESULT_CFGENTRY._serialized_options = b'8\001' _STATSLINE_STATSENTRY._options = None _STATSLINE_STATSENTRY._serialized_options = b'8\001' - _EVENTINFO._serialized_start=92 - _EVENTINFO._serialized_end=365 - _EVENTINFO_EXTRAENTRY._serialized_start=321 - _EVENTINFO_EXTRAENTRY._serialized_end=365 - _TIMINGINFOMSG._serialized_start=367 - _TIMINGINFOMSG._serialized_end=494 - _NODERELATION._serialized_start=496 - _NODERELATION._serialized_end=582 - _NODEINFO._serialized_start=585 - _NODEINFO._serialized_end=858 - _RUNRESULTMSG._serialized_start=861 - _RUNRESULTMSG._serialized_end=1070 - _REFERENCEKEYMSG._serialized_start=1072 - _REFERENCEKEYMSG._serialized_end=1143 - _GENERICMESSAGE._serialized_start=1145 - _GENERICMESSAGE._serialized_end=1199 - _MAINREPORTVERSION._serialized_start=1201 - _MAINREPORTVERSION._serialized_end=1258 - _MAINREPORTVERSIONMSG._serialized_start=1260 - _MAINREPORTVERSIONMSG._serialized_end=1366 - _MAINREPORTARGS._serialized_start=1368 - _MAINREPORTARGS._serialized_end=1482 - _MAINREPORTARGS_ARGSENTRY._serialized_start=1439 - _MAINREPORTARGS_ARGSENTRY._serialized_end=1482 - _MAINREPORTARGSMSG._serialized_start=1484 - _MAINREPORTARGSMSG._serialized_end=1584 - _MAINTRACKINGUSERSTATE._serialized_start=1586 - _MAINTRACKINGUSERSTATE._serialized_end=1629 - _MAINTRACKINGUSERSTATEMSG._serialized_start=1631 - _MAINTRACKINGUSERSTATEMSG._serialized_end=1745 - _MERGEDFROMSTATE._serialized_start=1747 - _MERGEDFROMSTATE._serialized_end=1800 - _MERGEDFROMSTATEMSG._serialized_start=1802 - _MERGEDFROMSTATEMSG._serialized_end=1904 - _MISSINGPROFILETARGET._serialized_start=1906 - _MISSINGPROFILETARGET._serialized_end=1971 - _MISSINGPROFILETARGETMSG._serialized_start=1973 - _MISSINGPROFILETARGETMSG._serialized_end=2085 - _INVALIDOPTIONYAML._serialized_start=2087 - _INVALIDOPTIONYAML._serialized_end=2127 - _INVALIDOPTIONYAMLMSG._serialized_start=2129 - _INVALIDOPTIONYAMLMSG._serialized_end=2235 - _LOGDBTPROJECTERROR._serialized_start=2237 - _LOGDBTPROJECTERROR._serialized_end=2270 - _LOGDBTPROJECTERRORMSG._serialized_start=2272 - _LOGDBTPROJECTERRORMSG._serialized_end=2380 - _LOGDBTPROFILEERROR._serialized_start=2382 - _LOGDBTPROFILEERROR._serialized_end=2433 - _LOGDBTPROFILEERRORMSG._serialized_start=2435 - _LOGDBTPROFILEERRORMSG._serialized_end=2543 - _STARTERPROJECTPATH._serialized_start=2545 - _STARTERPROJECTPATH._serialized_end=2578 - _STARTERPROJECTPATHMSG._serialized_start=2580 - _STARTERPROJECTPATHMSG._serialized_end=2688 - _CONFIGFOLDERDIRECTORY._serialized_start=2690 - _CONFIGFOLDERDIRECTORY._serialized_end=2726 - _CONFIGFOLDERDIRECTORYMSG._serialized_start=2728 - _CONFIGFOLDERDIRECTORYMSG._serialized_end=2842 - _NOSAMPLEPROFILEFOUND._serialized_start=2844 - _NOSAMPLEPROFILEFOUND._serialized_end=2883 - _NOSAMPLEPROFILEFOUNDMSG._serialized_start=2885 - _NOSAMPLEPROFILEFOUNDMSG._serialized_end=2997 - _PROFILEWRITTENWITHSAMPLE._serialized_start=2999 - _PROFILEWRITTENWITHSAMPLE._serialized_end=3053 - _PROFILEWRITTENWITHSAMPLEMSG._serialized_start=3055 - _PROFILEWRITTENWITHSAMPLEMSG._serialized_end=3175 - _PROFILEWRITTENWITHTARGETTEMPLATEYAML._serialized_start=3177 - _PROFILEWRITTENWITHTARGETTEMPLATEYAML._serialized_end=3243 - _PROFILEWRITTENWITHTARGETTEMPLATEYAMLMSG._serialized_start=3246 - _PROFILEWRITTENWITHTARGETTEMPLATEYAMLMSG._serialized_end=3390 - _PROFILEWRITTENWITHPROJECTTEMPLATEYAML._serialized_start=3392 - _PROFILEWRITTENWITHPROJECTTEMPLATEYAML._serialized_end=3459 - _PROFILEWRITTENWITHPROJECTTEMPLATEYAMLMSG._serialized_start=3462 - _PROFILEWRITTENWITHPROJECTTEMPLATEYAMLMSG._serialized_end=3608 - _SETTINGUPPROFILE._serialized_start=3610 - _SETTINGUPPROFILE._serialized_end=3628 - _SETTINGUPPROFILEMSG._serialized_start=3630 - _SETTINGUPPROFILEMSG._serialized_end=3734 - _INVALIDPROFILETEMPLATEYAML._serialized_start=3736 - _INVALIDPROFILETEMPLATEYAML._serialized_end=3764 - _INVALIDPROFILETEMPLATEYAMLMSG._serialized_start=3766 - _INVALIDPROFILETEMPLATEYAMLMSG._serialized_end=3890 - _PROJECTNAMEALREADYEXISTS._serialized_start=3892 - _PROJECTNAMEALREADYEXISTS._serialized_end=3932 - _PROJECTNAMEALREADYEXISTSMSG._serialized_start=3934 - _PROJECTNAMEALREADYEXISTSMSG._serialized_end=4054 - _PROJECTCREATED._serialized_start=4056 - _PROJECTCREATED._serialized_end=4131 - _PROJECTCREATEDMSG._serialized_start=4133 - _PROJECTCREATEDMSG._serialized_end=4233 - _PACKAGEREDIRECTDEPRECATION._serialized_start=4235 - _PACKAGEREDIRECTDEPRECATION._serialized_end=4299 - _PACKAGEREDIRECTDEPRECATIONMSG._serialized_start=4301 - _PACKAGEREDIRECTDEPRECATIONMSG._serialized_end=4425 - _PACKAGEINSTALLPATHDEPRECATION._serialized_start=4427 - _PACKAGEINSTALLPATHDEPRECATION._serialized_end=4458 - _PACKAGEINSTALLPATHDEPRECATIONMSG._serialized_start=4461 - _PACKAGEINSTALLPATHDEPRECATIONMSG._serialized_end=4591 - _CONFIGSOURCEPATHDEPRECATION._serialized_start=4593 - _CONFIGSOURCEPATHDEPRECATION._serialized_end=4665 - _CONFIGSOURCEPATHDEPRECATIONMSG._serialized_start=4667 - _CONFIGSOURCEPATHDEPRECATIONMSG._serialized_end=4793 - _CONFIGDATAPATHDEPRECATION._serialized_start=4795 - _CONFIGDATAPATHDEPRECATION._serialized_end=4865 - _CONFIGDATAPATHDEPRECATIONMSG._serialized_start=4867 - _CONFIGDATAPATHDEPRECATIONMSG._serialized_end=4989 - _ADAPTERDEPRECATIONWARNING._serialized_start=4991 - _ADAPTERDEPRECATIONWARNING._serialized_end=5054 - _ADAPTERDEPRECATIONWARNINGMSG._serialized_start=5056 - _ADAPTERDEPRECATIONWARNINGMSG._serialized_end=5178 - _METRICATTRIBUTESRENAMED._serialized_start=5180 - _METRICATTRIBUTESRENAMED._serialized_end=5226 - _METRICATTRIBUTESRENAMEDMSG._serialized_start=5228 - _METRICATTRIBUTESRENAMEDMSG._serialized_end=5346 - _EXPOSURENAMEDEPRECATION._serialized_start=5348 - _EXPOSURENAMEDEPRECATION._serialized_end=5391 - _EXPOSURENAMEDEPRECATIONMSG._serialized_start=5393 - _EXPOSURENAMEDEPRECATIONMSG._serialized_end=5511 - _INTERNALDEPRECATION._serialized_start=5513 - _INTERNALDEPRECATION._serialized_end=5607 - _INTERNALDEPRECATIONMSG._serialized_start=5609 - _INTERNALDEPRECATIONMSG._serialized_end=5719 - _ENVIRONMENTVARIABLERENAMED._serialized_start=5721 - _ENVIRONMENTVARIABLERENAMED._serialized_end=5785 - _ENVIRONMENTVARIABLERENAMEDMSG._serialized_start=5787 - _ENVIRONMENTVARIABLERENAMEDMSG._serialized_end=5911 - _CONFIGLOGPATHDEPRECATION._serialized_start=5913 - _CONFIGLOGPATHDEPRECATION._serialized_end=5964 - _CONFIGLOGPATHDEPRECATIONMSG._serialized_start=5966 - _CONFIGLOGPATHDEPRECATIONMSG._serialized_end=6086 - _CONFIGTARGETPATHDEPRECATION._serialized_start=6088 - _CONFIGTARGETPATHDEPRECATION._serialized_end=6142 - _CONFIGTARGETPATHDEPRECATIONMSG._serialized_start=6144 - _CONFIGTARGETPATHDEPRECATIONMSG._serialized_end=6270 - _COLLECTFRESHNESSRETURNSIGNATURE._serialized_start=6272 - _COLLECTFRESHNESSRETURNSIGNATURE._serialized_end=6305 - _COLLECTFRESHNESSRETURNSIGNATUREMSG._serialized_start=6308 - _COLLECTFRESHNESSRETURNSIGNATUREMSG._serialized_end=6442 - _ADAPTEREVENTDEBUG._serialized_start=6445 - _ADAPTEREVENTDEBUG._serialized_end=6580 - _ADAPTEREVENTDEBUGMSG._serialized_start=6582 - _ADAPTEREVENTDEBUGMSG._serialized_end=6688 - _ADAPTEREVENTINFO._serialized_start=6691 - _ADAPTEREVENTINFO._serialized_end=6825 - _ADAPTEREVENTINFOMSG._serialized_start=6827 - _ADAPTEREVENTINFOMSG._serialized_end=6931 - _ADAPTEREVENTWARNING._serialized_start=6934 - _ADAPTEREVENTWARNING._serialized_end=7071 - _ADAPTEREVENTWARNINGMSG._serialized_start=7073 - _ADAPTEREVENTWARNINGMSG._serialized_end=7183 - _ADAPTEREVENTERROR._serialized_start=7186 - _ADAPTEREVENTERROR._serialized_end=7339 - _ADAPTEREVENTERRORMSG._serialized_start=7341 - _ADAPTEREVENTERRORMSG._serialized_end=7447 - _NEWCONNECTION._serialized_start=7449 - _NEWCONNECTION._serialized_end=7544 - _NEWCONNECTIONMSG._serialized_start=7546 - _NEWCONNECTIONMSG._serialized_end=7644 - _CONNECTIONREUSED._serialized_start=7646 - _CONNECTIONREUSED._serialized_end=7707 - _CONNECTIONREUSEDMSG._serialized_start=7709 - _CONNECTIONREUSEDMSG._serialized_end=7813 - _CONNECTIONLEFTOPENINCLEANUP._serialized_start=7815 - _CONNECTIONLEFTOPENINCLEANUP._serialized_end=7863 - _CONNECTIONLEFTOPENINCLEANUPMSG._serialized_start=7865 - _CONNECTIONLEFTOPENINCLEANUPMSG._serialized_end=7991 - _CONNECTIONCLOSEDINCLEANUP._serialized_start=7993 - _CONNECTIONCLOSEDINCLEANUP._serialized_end=8039 - _CONNECTIONCLOSEDINCLEANUPMSG._serialized_start=8041 - _CONNECTIONCLOSEDINCLEANUPMSG._serialized_end=8163 - _ROLLBACKFAILED._serialized_start=8165 - _ROLLBACKFAILED._serialized_end=8260 - _ROLLBACKFAILEDMSG._serialized_start=8262 - _ROLLBACKFAILEDMSG._serialized_end=8362 - _CONNECTIONCLOSED._serialized_start=8364 - _CONNECTIONCLOSED._serialized_end=8443 - _CONNECTIONCLOSEDMSG._serialized_start=8445 - _CONNECTIONCLOSEDMSG._serialized_end=8549 - _CONNECTIONLEFTOPEN._serialized_start=8551 - _CONNECTIONLEFTOPEN._serialized_end=8632 - _CONNECTIONLEFTOPENMSG._serialized_start=8634 - _CONNECTIONLEFTOPENMSG._serialized_end=8742 - _ROLLBACK._serialized_start=8744 - _ROLLBACK._serialized_end=8815 - _ROLLBACKMSG._serialized_start=8817 - _ROLLBACKMSG._serialized_end=8905 - _CACHEMISS._serialized_start=8907 - _CACHEMISS._serialized_end=8971 - _CACHEMISSMSG._serialized_start=8973 - _CACHEMISSMSG._serialized_end=9063 - _LISTRELATIONS._serialized_start=9065 - _LISTRELATIONS._serialized_end=9163 - _LISTRELATIONSMSG._serialized_start=9165 - _LISTRELATIONSMSG._serialized_end=9263 - _CONNECTIONUSED._serialized_start=9265 - _CONNECTIONUSED._serialized_end=9361 - _CONNECTIONUSEDMSG._serialized_start=9363 - _CONNECTIONUSEDMSG._serialized_end=9463 - _SQLQUERY._serialized_start=9465 - _SQLQUERY._serialized_end=9549 - _SQLQUERYMSG._serialized_start=9551 - _SQLQUERYMSG._serialized_end=9639 - _SQLQUERYSTATUS._serialized_start=9641 - _SQLQUERYSTATUS._serialized_end=9732 - _SQLQUERYSTATUSMSG._serialized_start=9734 - _SQLQUERYSTATUSMSG._serialized_end=9834 - _SQLCOMMIT._serialized_start=9836 - _SQLCOMMIT._serialized_end=9908 - _SQLCOMMITMSG._serialized_start=9910 - _SQLCOMMITMSG._serialized_end=10000 - _COLTYPECHANGE._serialized_start=10002 - _COLTYPECHANGE._serialized_end=10099 - _COLTYPECHANGEMSG._serialized_start=10101 - _COLTYPECHANGEMSG._serialized_end=10199 - _SCHEMACREATION._serialized_start=10201 - _SCHEMACREATION._serialized_end=10265 - _SCHEMACREATIONMSG._serialized_start=10267 - _SCHEMACREATIONMSG._serialized_end=10367 - _SCHEMADROP._serialized_start=10369 - _SCHEMADROP._serialized_end=10429 - _SCHEMADROPMSG._serialized_start=10431 - _SCHEMADROPMSG._serialized_end=10523 - _CACHEACTION._serialized_start=10526 - _CACHEACTION._serialized_end=10748 - _CACHEACTIONMSG._serialized_start=10750 - _CACHEACTIONMSG._serialized_end=10844 - _CACHEDUMPGRAPH._serialized_start=10847 - _CACHEDUMPGRAPH._serialized_end=10999 - _CACHEDUMPGRAPH_DUMPENTRY._serialized_start=10956 - _CACHEDUMPGRAPH_DUMPENTRY._serialized_end=10999 - _CACHEDUMPGRAPHMSG._serialized_start=11001 - _CACHEDUMPGRAPHMSG._serialized_end=11101 - _ADAPTERIMPORTERROR._serialized_start=11103 - _ADAPTERIMPORTERROR._serialized_end=11136 - _ADAPTERIMPORTERRORMSG._serialized_start=11138 - _ADAPTERIMPORTERRORMSG._serialized_end=11246 - _PLUGINLOADERROR._serialized_start=11248 - _PLUGINLOADERROR._serialized_end=11283 - _PLUGINLOADERRORMSG._serialized_start=11285 - _PLUGINLOADERRORMSG._serialized_end=11387 - _NEWCONNECTIONOPENING._serialized_start=11389 - _NEWCONNECTIONOPENING._serialized_end=11479 - _NEWCONNECTIONOPENINGMSG._serialized_start=11481 - _NEWCONNECTIONOPENINGMSG._serialized_end=11593 - _CODEEXECUTION._serialized_start=11595 - _CODEEXECUTION._serialized_end=11651 - _CODEEXECUTIONMSG._serialized_start=11653 - _CODEEXECUTIONMSG._serialized_end=11751 - _CODEEXECUTIONSTATUS._serialized_start=11753 - _CODEEXECUTIONSTATUS._serialized_end=11807 - _CODEEXECUTIONSTATUSMSG._serialized_start=11809 - _CODEEXECUTIONSTATUSMSG._serialized_end=11919 - _CATALOGGENERATIONERROR._serialized_start=11921 - _CATALOGGENERATIONERROR._serialized_end=11958 - _CATALOGGENERATIONERRORMSG._serialized_start=11960 - _CATALOGGENERATIONERRORMSG._serialized_end=12076 - _WRITECATALOGFAILURE._serialized_start=12078 - _WRITECATALOGFAILURE._serialized_end=12123 - _WRITECATALOGFAILUREMSG._serialized_start=12125 - _WRITECATALOGFAILUREMSG._serialized_end=12235 - _CATALOGWRITTEN._serialized_start=12237 - _CATALOGWRITTEN._serialized_end=12267 - _CATALOGWRITTENMSG._serialized_start=12269 - _CATALOGWRITTENMSG._serialized_end=12369 - _CANNOTGENERATEDOCS._serialized_start=12371 - _CANNOTGENERATEDOCS._serialized_end=12391 - _CANNOTGENERATEDOCSMSG._serialized_start=12393 - _CANNOTGENERATEDOCSMSG._serialized_end=12501 - _BUILDINGCATALOG._serialized_start=12503 - _BUILDINGCATALOG._serialized_end=12520 - _BUILDINGCATALOGMSG._serialized_start=12522 - _BUILDINGCATALOGMSG._serialized_end=12624 - _DATABASEERRORRUNNINGHOOK._serialized_start=12626 - _DATABASEERRORRUNNINGHOOK._serialized_end=12671 - _DATABASEERRORRUNNINGHOOKMSG._serialized_start=12673 - _DATABASEERRORRUNNINGHOOKMSG._serialized_end=12793 - _HOOKSRUNNING._serialized_start=12795 - _HOOKSRUNNING._serialized_end=12847 - _HOOKSRUNNINGMSG._serialized_start=12849 - _HOOKSRUNNINGMSG._serialized_end=12945 - _FINISHEDRUNNINGSTATS._serialized_start=12947 - _FINISHEDRUNNINGSTATS._serialized_end=13031 - _FINISHEDRUNNINGSTATSMSG._serialized_start=13033 - _FINISHEDRUNNINGSTATSMSG._serialized_end=13145 - _CONSTRAINTNOTENFORCED._serialized_start=13147 - _CONSTRAINTNOTENFORCED._serialized_end=13207 - _CONSTRAINTNOTENFORCEDMSG._serialized_start=13209 - _CONSTRAINTNOTENFORCEDMSG._serialized_end=13323 - _CONSTRAINTNOTSUPPORTED._serialized_start=13325 - _CONSTRAINTNOTSUPPORTED._serialized_end=13386 - _CONSTRAINTNOTSUPPORTEDMSG._serialized_start=13388 - _CONSTRAINTNOTSUPPORTEDMSG._serialized_end=13504 - _INPUTFILEDIFFERROR._serialized_start=13506 - _INPUTFILEDIFFERROR._serialized_end=13561 - _INPUTFILEDIFFERRORMSG._serialized_start=13563 - _INPUTFILEDIFFERRORMSG._serialized_end=13671 - _PUBLICATIONARTIFACTCHANGED._serialized_start=13673 - _PUBLICATIONARTIFACTCHANGED._serialized_end=13789 - _PUBLICATIONARTIFACTCHANGEDMSG._serialized_start=13791 - _PUBLICATIONARTIFACTCHANGEDMSG._serialized_end=13915 - _INVALIDVALUEFORFIELD._serialized_start=13917 - _INVALIDVALUEFORFIELD._serialized_end=13980 - _INVALIDVALUEFORFIELDMSG._serialized_start=13982 - _INVALIDVALUEFORFIELDMSG._serialized_end=14094 - _VALIDATIONWARNING._serialized_start=14096 - _VALIDATIONWARNING._serialized_end=14177 - _VALIDATIONWARNINGMSG._serialized_start=14179 - _VALIDATIONWARNINGMSG._serialized_end=14285 - _PARSEPERFINFOPATH._serialized_start=14287 - _PARSEPERFINFOPATH._serialized_end=14320 - _PARSEPERFINFOPATHMSG._serialized_start=14322 - _PARSEPERFINFOPATHMSG._serialized_end=14428 - _PARTIALPARSINGERRORPROCESSINGFILE._serialized_start=14430 - _PARTIALPARSINGERRORPROCESSINGFILE._serialized_end=14479 - _PARTIALPARSINGERRORPROCESSINGFILEMSG._serialized_start=14482 - _PARTIALPARSINGERRORPROCESSINGFILEMSG._serialized_end=14620 - _PARTIALPARSINGERROR._serialized_start=14623 - _PARTIALPARSINGERROR._serialized_end=14757 - _PARTIALPARSINGERROR_EXCINFOENTRY._serialized_start=14711 - _PARTIALPARSINGERROR_EXCINFOENTRY._serialized_end=14757 - _PARTIALPARSINGERRORMSG._serialized_start=14759 - _PARTIALPARSINGERRORMSG._serialized_end=14869 - _PARTIALPARSINGSKIPPARSING._serialized_start=14871 - _PARTIALPARSINGSKIPPARSING._serialized_end=14898 - _PARTIALPARSINGSKIPPARSINGMSG._serialized_start=14900 - _PARTIALPARSINGSKIPPARSINGMSG._serialized_end=15022 - _UNABLETOPARTIALPARSE._serialized_start=15024 - _UNABLETOPARTIALPARSE._serialized_end=15062 - _UNABLETOPARTIALPARSEMSG._serialized_start=15064 - _UNABLETOPARTIALPARSEMSG._serialized_end=15176 - _STATECHECKVARSHASH._serialized_start=15178 - _STATECHECKVARSHASH._serialized_end=15280 - _STATECHECKVARSHASHMSG._serialized_start=15282 - _STATECHECKVARSHASHMSG._serialized_end=15390 - _PARTIALPARSINGNOTENABLED._serialized_start=15392 - _PARTIALPARSINGNOTENABLED._serialized_end=15418 - _PARTIALPARSINGNOTENABLEDMSG._serialized_start=15420 - _PARTIALPARSINGNOTENABLEDMSG._serialized_end=15540 - _PARSEDFILELOADFAILED._serialized_start=15542 - _PARSEDFILELOADFAILED._serialized_end=15609 - _PARSEDFILELOADFAILEDMSG._serialized_start=15611 - _PARSEDFILELOADFAILEDMSG._serialized_end=15723 - _PARTIALPARSINGENABLED._serialized_start=15725 - _PARTIALPARSINGENABLED._serialized_end=15797 - _PARTIALPARSINGENABLEDMSG._serialized_start=15799 - _PARTIALPARSINGENABLEDMSG._serialized_end=15913 - _PARTIALPARSINGFILE._serialized_start=15915 - _PARTIALPARSINGFILE._serialized_end=15971 - _PARTIALPARSINGFILEMSG._serialized_start=15973 - _PARTIALPARSINGFILEMSG._serialized_end=16081 - _INVALIDDISABLEDTARGETINTESTNODE._serialized_start=16084 - _INVALIDDISABLEDTARGETINTESTNODE._serialized_end=16259 - _INVALIDDISABLEDTARGETINTESTNODEMSG._serialized_start=16262 - _INVALIDDISABLEDTARGETINTESTNODEMSG._serialized_end=16396 - _UNUSEDRESOURCECONFIGPATH._serialized_start=16398 - _UNUSEDRESOURCECONFIGPATH._serialized_end=16453 - _UNUSEDRESOURCECONFIGPATHMSG._serialized_start=16455 - _UNUSEDRESOURCECONFIGPATHMSG._serialized_end=16575 - _SEEDINCREASED._serialized_start=16577 - _SEEDINCREASED._serialized_end=16628 - _SEEDINCREASEDMSG._serialized_start=16630 - _SEEDINCREASEDMSG._serialized_end=16728 - _SEEDEXCEEDSLIMITSAMEPATH._serialized_start=16730 - _SEEDEXCEEDSLIMITSAMEPATH._serialized_end=16792 - _SEEDEXCEEDSLIMITSAMEPATHMSG._serialized_start=16794 - _SEEDEXCEEDSLIMITSAMEPATHMSG._serialized_end=16914 - _SEEDEXCEEDSLIMITANDPATHCHANGED._serialized_start=16916 - _SEEDEXCEEDSLIMITANDPATHCHANGED._serialized_end=16984 - _SEEDEXCEEDSLIMITANDPATHCHANGEDMSG._serialized_start=16987 - _SEEDEXCEEDSLIMITANDPATHCHANGEDMSG._serialized_end=17119 - _SEEDEXCEEDSLIMITCHECKSUMCHANGED._serialized_start=17121 - _SEEDEXCEEDSLIMITCHECKSUMCHANGED._serialized_end=17213 - _SEEDEXCEEDSLIMITCHECKSUMCHANGEDMSG._serialized_start=17216 - _SEEDEXCEEDSLIMITCHECKSUMCHANGEDMSG._serialized_end=17350 - _UNUSEDTABLES._serialized_start=17352 - _UNUSEDTABLES._serialized_end=17389 - _UNUSEDTABLESMSG._serialized_start=17391 - _UNUSEDTABLESMSG._serialized_end=17487 - _WRONGRESOURCESCHEMAFILE._serialized_start=17490 - _WRONGRESOURCESCHEMAFILE._serialized_end=17625 - _WRONGRESOURCESCHEMAFILEMSG._serialized_start=17627 - _WRONGRESOURCESCHEMAFILEMSG._serialized_end=17745 - _NONODEFORYAMLKEY._serialized_start=17747 - _NONODEFORYAMLKEY._serialized_end=17822 - _NONODEFORYAMLKEYMSG._serialized_start=17824 - _NONODEFORYAMLKEYMSG._serialized_end=17928 - _MACRONOTFOUNDFORPATCH._serialized_start=17930 - _MACRONOTFOUNDFORPATCH._serialized_end=17973 - _MACRONOTFOUNDFORPATCHMSG._serialized_start=17975 - _MACRONOTFOUNDFORPATCHMSG._serialized_end=18089 - _NODENOTFOUNDORDISABLED._serialized_start=18092 - _NODENOTFOUNDORDISABLED._serialized_end=18276 - _NODENOTFOUNDORDISABLEDMSG._serialized_start=18278 - _NODENOTFOUNDORDISABLEDMSG._serialized_end=18394 - _JINJALOGWARNING._serialized_start=18396 - _JINJALOGWARNING._serialized_end=18468 - _JINJALOGWARNINGMSG._serialized_start=18470 - _JINJALOGWARNINGMSG._serialized_end=18572 - _JINJALOGINFO._serialized_start=18574 - _JINJALOGINFO._serialized_end=18643 - _JINJALOGINFOMSG._serialized_start=18645 - _JINJALOGINFOMSG._serialized_end=18741 - _JINJALOGDEBUG._serialized_start=18743 - _JINJALOGDEBUG._serialized_end=18813 - _JINJALOGDEBUGMSG._serialized_start=18815 - _JINJALOGDEBUGMSG._serialized_end=18913 - _UNPINNEDREFNEWVERSIONAVAILABLE._serialized_start=18916 - _UNPINNEDREFNEWVERSIONAVAILABLE._serialized_end=19090 - _UNPINNEDREFNEWVERSIONAVAILABLEMSG._serialized_start=19093 - _UNPINNEDREFNEWVERSIONAVAILABLEMSG._serialized_end=19225 - _DEPRECATEDMODEL._serialized_start=19227 - _DEPRECATEDMODEL._serialized_end=19313 - _DEPRECATEDMODELMSG._serialized_start=19315 - _DEPRECATEDMODELMSG._serialized_end=19417 - _UPCOMINGREFERENCEDEPRECATION._serialized_start=19420 - _UPCOMINGREFERENCEDEPRECATION._serialized_end=19618 - _UPCOMINGREFERENCEDEPRECATIONMSG._serialized_start=19621 - _UPCOMINGREFERENCEDEPRECATIONMSG._serialized_end=19749 - _DEPRECATEDREFERENCE._serialized_start=19752 - _DEPRECATEDREFERENCE._serialized_end=19941 - _DEPRECATEDREFERENCEMSG._serialized_start=19943 - _DEPRECATEDREFERENCEMSG._serialized_end=20053 - _UNSUPPORTEDCONSTRAINTMATERIALIZATION._serialized_start=20055 - _UNSUPPORTEDCONSTRAINTMATERIALIZATION._serialized_end=20115 - _UNSUPPORTEDCONSTRAINTMATERIALIZATIONMSG._serialized_start=20118 - _UNSUPPORTEDCONSTRAINTMATERIALIZATIONMSG._serialized_end=20262 - _GITSPARSECHECKOUTSUBDIRECTORY._serialized_start=20264 - _GITSPARSECHECKOUTSUBDIRECTORY._serialized_end=20311 - _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_start=20314 - _GITSPARSECHECKOUTSUBDIRECTORYMSG._serialized_end=20444 - _GITPROGRESSCHECKOUTREVISION._serialized_start=20446 - _GITPROGRESSCHECKOUTREVISION._serialized_end=20493 - _GITPROGRESSCHECKOUTREVISIONMSG._serialized_start=20495 - _GITPROGRESSCHECKOUTREVISIONMSG._serialized_end=20621 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_start=20623 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCY._serialized_end=20675 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_start=20678 - _GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG._serialized_end=20824 - _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_start=20826 - _GITPROGRESSPULLINGNEWDEPENDENCY._serialized_end=20872 - _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_start=20875 - _GITPROGRESSPULLINGNEWDEPENDENCYMSG._serialized_end=21009 - _GITNOTHINGTODO._serialized_start=21011 - _GITNOTHINGTODO._serialized_end=21040 - _GITNOTHINGTODOMSG._serialized_start=21042 - _GITNOTHINGTODOMSG._serialized_end=21142 - _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_start=21144 - _GITPROGRESSUPDATEDCHECKOUTRANGE._serialized_end=21213 - _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_start=21216 - _GITPROGRESSUPDATEDCHECKOUTRANGEMSG._serialized_end=21350 - _GITPROGRESSCHECKEDOUTAT._serialized_start=21352 - _GITPROGRESSCHECKEDOUTAT._serialized_end=21394 - _GITPROGRESSCHECKEDOUTATMSG._serialized_start=21396 - _GITPROGRESSCHECKEDOUTATMSG._serialized_end=21514 - _REGISTRYPROGRESSGETREQUEST._serialized_start=21516 - _REGISTRYPROGRESSGETREQUEST._serialized_end=21557 - _REGISTRYPROGRESSGETREQUESTMSG._serialized_start=21559 - _REGISTRYPROGRESSGETREQUESTMSG._serialized_end=21683 - _REGISTRYPROGRESSGETRESPONSE._serialized_start=21685 - _REGISTRYPROGRESSGETRESPONSE._serialized_end=21746 - _REGISTRYPROGRESSGETRESPONSEMSG._serialized_start=21748 - _REGISTRYPROGRESSGETRESPONSEMSG._serialized_end=21874 - _SELECTORREPORTINVALIDSELECTOR._serialized_start=21876 - _SELECTORREPORTINVALIDSELECTOR._serialized_end=21971 - _SELECTORREPORTINVALIDSELECTORMSG._serialized_start=21974 - _SELECTORREPORTINVALIDSELECTORMSG._serialized_end=22104 - _DEPSNOPACKAGESFOUND._serialized_start=22106 - _DEPSNOPACKAGESFOUND._serialized_end=22127 - _DEPSNOPACKAGESFOUNDMSG._serialized_start=22129 - _DEPSNOPACKAGESFOUNDMSG._serialized_end=22239 - _DEPSSTARTPACKAGEINSTALL._serialized_start=22241 - _DEPSSTARTPACKAGEINSTALL._serialized_end=22288 - _DEPSSTARTPACKAGEINSTALLMSG._serialized_start=22290 - _DEPSSTARTPACKAGEINSTALLMSG._serialized_end=22408 - _DEPSINSTALLINFO._serialized_start=22410 - _DEPSINSTALLINFO._serialized_end=22449 - _DEPSINSTALLINFOMSG._serialized_start=22451 - _DEPSINSTALLINFOMSG._serialized_end=22553 - _DEPSUPDATEAVAILABLE._serialized_start=22555 - _DEPSUPDATEAVAILABLE._serialized_end=22600 - _DEPSUPDATEAVAILABLEMSG._serialized_start=22602 - _DEPSUPDATEAVAILABLEMSG._serialized_end=22712 - _DEPSUPTODATE._serialized_start=22714 - _DEPSUPTODATE._serialized_end=22728 - _DEPSUPTODATEMSG._serialized_start=22730 - _DEPSUPTODATEMSG._serialized_end=22826 - _DEPSLISTSUBDIRECTORY._serialized_start=22828 - _DEPSLISTSUBDIRECTORY._serialized_end=22872 - _DEPSLISTSUBDIRECTORYMSG._serialized_start=22874 - _DEPSLISTSUBDIRECTORYMSG._serialized_end=22986 - _DEPSNOTIFYUPDATESAVAILABLE._serialized_start=22988 - _DEPSNOTIFYUPDATESAVAILABLE._serialized_end=23034 - _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_start=23036 - _DEPSNOTIFYUPDATESAVAILABLEMSG._serialized_end=23160 - _RETRYEXTERNALCALL._serialized_start=23162 - _RETRYEXTERNALCALL._serialized_end=23211 - _RETRYEXTERNALCALLMSG._serialized_start=23213 - _RETRYEXTERNALCALLMSG._serialized_end=23319 - _RECORDRETRYEXCEPTION._serialized_start=23321 - _RECORDRETRYEXCEPTION._serialized_end=23356 - _RECORDRETRYEXCEPTIONMSG._serialized_start=23358 - _RECORDRETRYEXCEPTIONMSG._serialized_end=23470 - _REGISTRYINDEXPROGRESSGETREQUEST._serialized_start=23472 - _REGISTRYINDEXPROGRESSGETREQUEST._serialized_end=23518 - _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_start=23521 - _REGISTRYINDEXPROGRESSGETREQUESTMSG._serialized_end=23655 - _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_start=23657 - _REGISTRYINDEXPROGRESSGETRESPONSE._serialized_end=23723 - _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_start=23726 - _REGISTRYINDEXPROGRESSGETRESPONSEMSG._serialized_end=23862 - _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_start=23864 - _REGISTRYRESPONSEUNEXPECTEDTYPE._serialized_end=23914 - _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_start=23917 - _REGISTRYRESPONSEUNEXPECTEDTYPEMSG._serialized_end=24049 - _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_start=24051 - _REGISTRYRESPONSEMISSINGTOPKEYS._serialized_end=24101 - _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_start=24104 - _REGISTRYRESPONSEMISSINGTOPKEYSMSG._serialized_end=24236 - _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_start=24238 - _REGISTRYRESPONSEMISSINGNESTEDKEYS._serialized_end=24291 - _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_start=24294 - _REGISTRYRESPONSEMISSINGNESTEDKEYSMSG._serialized_end=24432 - _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_start=24434 - _REGISTRYRESPONSEEXTRANESTEDKEYS._serialized_end=24485 - _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_start=24488 - _REGISTRYRESPONSEEXTRANESTEDKEYSMSG._serialized_end=24622 - _DEPSSETDOWNLOADDIRECTORY._serialized_start=24624 - _DEPSSETDOWNLOADDIRECTORY._serialized_end=24664 - _DEPSSETDOWNLOADDIRECTORYMSG._serialized_start=24666 - _DEPSSETDOWNLOADDIRECTORYMSG._serialized_end=24786 - _DEPSUNPINNED._serialized_start=24788 - _DEPSUNPINNED._serialized_end=24833 - _DEPSUNPINNEDMSG._serialized_start=24835 - _DEPSUNPINNEDMSG._serialized_end=24931 - _NONODESFORSELECTIONCRITERIA._serialized_start=24933 - _NONODESFORSELECTIONCRITERIA._serialized_end=24980 - _NONODESFORSELECTIONCRITERIAMSG._serialized_start=24982 - _NONODESFORSELECTIONCRITERIAMSG._serialized_end=25108 - _PUBLICATIONARTIFACTAVAILABLE._serialized_start=25110 - _PUBLICATIONARTIFACTAVAILABLE._serialized_end=25187 - _PUBLICATIONARTIFACTAVAILABLEMSG._serialized_start=25190 - _PUBLICATIONARTIFACTAVAILABLEMSG._serialized_end=25318 - _RUNNINGOPERATIONCAUGHTERROR._serialized_start=25320 - _RUNNINGOPERATIONCAUGHTERROR._serialized_end=25362 - _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_start=25364 - _RUNNINGOPERATIONCAUGHTERRORMSG._serialized_end=25490 - _COMPILECOMPLETE._serialized_start=25492 - _COMPILECOMPLETE._serialized_end=25509 - _COMPILECOMPLETEMSG._serialized_start=25511 - _COMPILECOMPLETEMSG._serialized_end=25613 - _FRESHNESSCHECKCOMPLETE._serialized_start=25615 - _FRESHNESSCHECKCOMPLETE._serialized_end=25639 - _FRESHNESSCHECKCOMPLETEMSG._serialized_start=25641 - _FRESHNESSCHECKCOMPLETEMSG._serialized_end=25757 - _SEEDHEADER._serialized_start=25759 - _SEEDHEADER._serialized_end=25787 - _SEEDHEADERMSG._serialized_start=25789 - _SEEDHEADERMSG._serialized_end=25881 - _SQLRUNNEREXCEPTION._serialized_start=25883 - _SQLRUNNEREXCEPTION._serialized_end=25934 - _SQLRUNNEREXCEPTIONMSG._serialized_start=25936 - _SQLRUNNEREXCEPTIONMSG._serialized_end=26044 - _LOGTESTRESULT._serialized_start=26047 - _LOGTESTRESULT._serialized_end=26215 - _LOGTESTRESULTMSG._serialized_start=26217 - _LOGTESTRESULTMSG._serialized_end=26315 - _LOGSTARTLINE._serialized_start=26317 - _LOGSTARTLINE._serialized_end=26424 - _LOGSTARTLINEMSG._serialized_start=26426 - _LOGSTARTLINEMSG._serialized_end=26522 - _LOGMODELRESULT._serialized_start=26525 - _LOGMODELRESULT._serialized_end=26674 - _LOGMODELRESULTMSG._serialized_start=26676 - _LOGMODELRESULTMSG._serialized_end=26776 - _LOGSNAPSHOTRESULT._serialized_start=26779 - _LOGSNAPSHOTRESULT._serialized_end=27029 - _LOGSNAPSHOTRESULT_CFGENTRY._serialized_start=26987 - _LOGSNAPSHOTRESULT_CFGENTRY._serialized_end=27029 - _LOGSNAPSHOTRESULTMSG._serialized_start=27031 - _LOGSNAPSHOTRESULTMSG._serialized_end=27137 - _LOGSEEDRESULT._serialized_start=27140 - _LOGSEEDRESULT._serialized_end=27325 - _LOGSEEDRESULTMSG._serialized_start=27327 - _LOGSEEDRESULTMSG._serialized_end=27425 - _LOGFRESHNESSRESULT._serialized_start=27428 - _LOGFRESHNESSRESULT._serialized_end=27601 - _LOGFRESHNESSRESULTMSG._serialized_start=27603 - _LOGFRESHNESSRESULTMSG._serialized_end=27711 - _LOGCANCELLINE._serialized_start=27713 - _LOGCANCELLINE._serialized_end=27747 - _LOGCANCELLINEMSG._serialized_start=27749 - _LOGCANCELLINEMSG._serialized_end=27847 - _DEFAULTSELECTOR._serialized_start=27849 - _DEFAULTSELECTOR._serialized_end=27880 - _DEFAULTSELECTORMSG._serialized_start=27882 - _DEFAULTSELECTORMSG._serialized_end=27984 - _NODESTART._serialized_start=27986 - _NODESTART._serialized_end=28039 - _NODESTARTMSG._serialized_start=28041 - _NODESTARTMSG._serialized_end=28131 - _NODEFINISHED._serialized_start=28133 - _NODEFINISHED._serialized_end=28236 - _NODEFINISHEDMSG._serialized_start=28238 - _NODEFINISHEDMSG._serialized_end=28334 - _QUERYCANCELATIONUNSUPPORTED._serialized_start=28336 - _QUERYCANCELATIONUNSUPPORTED._serialized_end=28379 - _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_start=28381 - _QUERYCANCELATIONUNSUPPORTEDMSG._serialized_end=28507 - _CONCURRENCYLINE._serialized_start=28509 - _CONCURRENCYLINE._serialized_end=28588 - _CONCURRENCYLINEMSG._serialized_start=28590 - _CONCURRENCYLINEMSG._serialized_end=28692 - _WRITINGINJECTEDSQLFORNODE._serialized_start=28694 - _WRITINGINJECTEDSQLFORNODE._serialized_end=28763 - _WRITINGINJECTEDSQLFORNODEMSG._serialized_start=28765 - _WRITINGINJECTEDSQLFORNODEMSG._serialized_end=28887 - _NODECOMPILING._serialized_start=28889 - _NODECOMPILING._serialized_end=28946 - _NODECOMPILINGMSG._serialized_start=28948 - _NODECOMPILINGMSG._serialized_end=29046 - _NODEEXECUTING._serialized_start=29048 - _NODEEXECUTING._serialized_end=29105 - _NODEEXECUTINGMSG._serialized_start=29107 - _NODEEXECUTINGMSG._serialized_end=29205 - _LOGHOOKSTARTLINE._serialized_start=29207 - _LOGHOOKSTARTLINE._serialized_end=29316 - _LOGHOOKSTARTLINEMSG._serialized_start=29318 - _LOGHOOKSTARTLINEMSG._serialized_end=29422 - _LOGHOOKENDLINE._serialized_start=29425 - _LOGHOOKENDLINE._serialized_end=29572 - _LOGHOOKENDLINEMSG._serialized_start=29574 - _LOGHOOKENDLINEMSG._serialized_end=29674 - _SKIPPINGDETAILS._serialized_start=29677 - _SKIPPINGDETAILS._serialized_end=29824 - _SKIPPINGDETAILSMSG._serialized_start=29826 - _SKIPPINGDETAILSMSG._serialized_end=29928 - _NOTHINGTODO._serialized_start=29930 - _NOTHINGTODO._serialized_end=29943 - _NOTHINGTODOMSG._serialized_start=29945 - _NOTHINGTODOMSG._serialized_end=30039 - _RUNNINGOPERATIONUNCAUGHTERROR._serialized_start=30041 - _RUNNINGOPERATIONUNCAUGHTERROR._serialized_end=30085 - _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_start=30088 - _RUNNINGOPERATIONUNCAUGHTERRORMSG._serialized_end=30218 - _ENDRUNRESULT._serialized_start=30221 - _ENDRUNRESULT._serialized_end=30368 - _ENDRUNRESULTMSG._serialized_start=30370 - _ENDRUNRESULTMSG._serialized_end=30466 - _NONODESSELECTED._serialized_start=30468 - _NONODESSELECTED._serialized_end=30485 - _NONODESSELECTEDMSG._serialized_start=30487 - _NONODESSELECTEDMSG._serialized_end=30589 - _COMMANDCOMPLETED._serialized_start=30591 - _COMMANDCOMPLETED._serialized_end=30710 - _COMMANDCOMPLETEDMSG._serialized_start=30712 - _COMMANDCOMPLETEDMSG._serialized_end=30816 - _SHOWNODE._serialized_start=30818 - _SHOWNODE._serialized_end=30925 - _SHOWNODEMSG._serialized_start=30927 - _SHOWNODEMSG._serialized_end=31015 - _COMPILEDNODE._serialized_start=31017 - _COMPILEDNODE._serialized_end=31129 - _COMPILEDNODEMSG._serialized_start=31131 - _COMPILEDNODEMSG._serialized_end=31227 - _CATCHABLEEXCEPTIONONRUN._serialized_start=31229 - _CATCHABLEEXCEPTIONONRUN._serialized_end=31327 - _CATCHABLEEXCEPTIONONRUNMSG._serialized_start=31329 - _CATCHABLEEXCEPTIONONRUNMSG._serialized_end=31447 - _INTERNALERRORONRUN._serialized_start=31449 - _INTERNALERRORONRUN._serialized_end=31502 - _INTERNALERRORONRUNMSG._serialized_start=31504 - _INTERNALERRORONRUNMSG._serialized_end=31612 - _GENERICEXCEPTIONONRUN._serialized_start=31614 - _GENERICEXCEPTIONONRUN._serialized_end=31689 - _GENERICEXCEPTIONONRUNMSG._serialized_start=31691 - _GENERICEXCEPTIONONRUNMSG._serialized_end=31805 - _NODECONNECTIONRELEASEERROR._serialized_start=31807 - _NODECONNECTIONRELEASEERROR._serialized_end=31885 - _NODECONNECTIONRELEASEERRORMSG._serialized_start=31887 - _NODECONNECTIONRELEASEERRORMSG._serialized_end=32011 - _FOUNDSTATS._serialized_start=32013 - _FOUNDSTATS._serialized_end=32044 - _FOUNDSTATSMSG._serialized_start=32046 - _FOUNDSTATSMSG._serialized_end=32138 - _MAINKEYBOARDINTERRUPT._serialized_start=32140 - _MAINKEYBOARDINTERRUPT._serialized_end=32163 - _MAINKEYBOARDINTERRUPTMSG._serialized_start=32165 - _MAINKEYBOARDINTERRUPTMSG._serialized_end=32279 - _MAINENCOUNTEREDERROR._serialized_start=32281 - _MAINENCOUNTEREDERROR._serialized_end=32316 - _MAINENCOUNTEREDERRORMSG._serialized_start=32318 - _MAINENCOUNTEREDERRORMSG._serialized_end=32430 - _MAINSTACKTRACE._serialized_start=32432 - _MAINSTACKTRACE._serialized_end=32469 - _MAINSTACKTRACEMSG._serialized_start=32471 - _MAINSTACKTRACEMSG._serialized_end=32571 - _SYSTEMCOULDNOTWRITE._serialized_start=32573 - _SYSTEMCOULDNOTWRITE._serialized_end=32637 - _SYSTEMCOULDNOTWRITEMSG._serialized_start=32639 - _SYSTEMCOULDNOTWRITEMSG._serialized_end=32749 - _SYSTEMEXECUTINGCMD._serialized_start=32751 - _SYSTEMEXECUTINGCMD._serialized_end=32784 - _SYSTEMEXECUTINGCMDMSG._serialized_start=32786 - _SYSTEMEXECUTINGCMDMSG._serialized_end=32894 - _SYSTEMSTDOUT._serialized_start=32896 - _SYSTEMSTDOUT._serialized_end=32924 - _SYSTEMSTDOUTMSG._serialized_start=32926 - _SYSTEMSTDOUTMSG._serialized_end=33022 - _SYSTEMSTDERR._serialized_start=33024 - _SYSTEMSTDERR._serialized_end=33052 - _SYSTEMSTDERRMSG._serialized_start=33054 - _SYSTEMSTDERRMSG._serialized_end=33150 - _SYSTEMREPORTRETURNCODE._serialized_start=33152 - _SYSTEMREPORTRETURNCODE._serialized_end=33196 - _SYSTEMREPORTRETURNCODEMSG._serialized_start=33198 - _SYSTEMREPORTRETURNCODEMSG._serialized_end=33314 - _TIMINGINFOCOLLECTED._serialized_start=33316 - _TIMINGINFOCOLLECTED._serialized_end=33428 - _TIMINGINFOCOLLECTEDMSG._serialized_start=33430 - _TIMINGINFOCOLLECTEDMSG._serialized_end=33540 - _LOGDEBUGSTACKTRACE._serialized_start=33542 - _LOGDEBUGSTACKTRACE._serialized_end=33580 - _LOGDEBUGSTACKTRACEMSG._serialized_start=33582 - _LOGDEBUGSTACKTRACEMSG._serialized_end=33690 - _CHECKCLEANPATH._serialized_start=33692 - _CHECKCLEANPATH._serialized_end=33722 - _CHECKCLEANPATHMSG._serialized_start=33724 - _CHECKCLEANPATHMSG._serialized_end=33824 - _CONFIRMCLEANPATH._serialized_start=33826 - _CONFIRMCLEANPATH._serialized_end=33858 - _CONFIRMCLEANPATHMSG._serialized_start=33860 - _CONFIRMCLEANPATHMSG._serialized_end=33964 - _PROTECTEDCLEANPATH._serialized_start=33966 - _PROTECTEDCLEANPATH._serialized_end=34000 - _PROTECTEDCLEANPATHMSG._serialized_start=34002 - _PROTECTEDCLEANPATHMSG._serialized_end=34110 - _FINISHEDCLEANPATHS._serialized_start=34112 - _FINISHEDCLEANPATHS._serialized_end=34132 - _FINISHEDCLEANPATHSMSG._serialized_start=34134 - _FINISHEDCLEANPATHSMSG._serialized_end=34242 - _OPENCOMMAND._serialized_start=34244 - _OPENCOMMAND._serialized_end=34297 - _OPENCOMMANDMSG._serialized_start=34299 - _OPENCOMMANDMSG._serialized_end=34393 - _FORMATTING._serialized_start=34395 - _FORMATTING._serialized_end=34420 - _FORMATTINGMSG._serialized_start=34422 - _FORMATTINGMSG._serialized_end=34514 - _SERVINGDOCSPORT._serialized_start=34516 - _SERVINGDOCSPORT._serialized_end=34564 - _SERVINGDOCSPORTMSG._serialized_start=34566 - _SERVINGDOCSPORTMSG._serialized_end=34668 - _SERVINGDOCSACCESSINFO._serialized_start=34670 - _SERVINGDOCSACCESSINFO._serialized_end=34707 - _SERVINGDOCSACCESSINFOMSG._serialized_start=34709 - _SERVINGDOCSACCESSINFOMSG._serialized_end=34823 - _SERVINGDOCSEXITINFO._serialized_start=34825 - _SERVINGDOCSEXITINFO._serialized_end=34846 - _SERVINGDOCSEXITINFOMSG._serialized_start=34848 - _SERVINGDOCSEXITINFOMSG._serialized_end=34958 - _RUNRESULTWARNING._serialized_start=34960 - _RUNRESULTWARNING._serialized_end=35034 - _RUNRESULTWARNINGMSG._serialized_start=35036 - _RUNRESULTWARNINGMSG._serialized_end=35140 - _RUNRESULTFAILURE._serialized_start=35142 - _RUNRESULTFAILURE._serialized_end=35216 - _RUNRESULTFAILUREMSG._serialized_start=35218 - _RUNRESULTFAILUREMSG._serialized_end=35322 - _STATSLINE._serialized_start=35324 - _STATSLINE._serialized_end=35431 - _STATSLINE_STATSENTRY._serialized_start=35387 - _STATSLINE_STATSENTRY._serialized_end=35431 - _STATSLINEMSG._serialized_start=35433 - _STATSLINEMSG._serialized_end=35523 - _RUNRESULTERROR._serialized_start=35525 - _RUNRESULTERROR._serialized_end=35554 - _RUNRESULTERRORMSG._serialized_start=35556 - _RUNRESULTERRORMSG._serialized_end=35656 - _RUNRESULTERRORNOMESSAGE._serialized_start=35658 - _RUNRESULTERRORNOMESSAGE._serialized_end=35699 - _RUNRESULTERRORNOMESSAGEMSG._serialized_start=35701 - _RUNRESULTERRORNOMESSAGEMSG._serialized_end=35819 - _SQLCOMPILEDPATH._serialized_start=35821 - _SQLCOMPILEDPATH._serialized_end=35852 - _SQLCOMPILEDPATHMSG._serialized_start=35854 - _SQLCOMPILEDPATHMSG._serialized_end=35956 - _CHECKNODETESTFAILURE._serialized_start=35958 - _CHECKNODETESTFAILURE._serialized_end=36003 - _CHECKNODETESTFAILUREMSG._serialized_start=36005 - _CHECKNODETESTFAILUREMSG._serialized_end=36117 - _FIRSTRUNRESULTERROR._serialized_start=36119 - _FIRSTRUNRESULTERROR._serialized_end=36153 - _FIRSTRUNRESULTERRORMSG._serialized_start=36155 - _FIRSTRUNRESULTERRORMSG._serialized_end=36265 - _AFTERFIRSTRUNRESULTERROR._serialized_start=36267 - _AFTERFIRSTRUNRESULTERROR._serialized_end=36306 - _AFTERFIRSTRUNRESULTERRORMSG._serialized_start=36308 - _AFTERFIRSTRUNRESULTERRORMSG._serialized_end=36428 - _ENDOFRUNSUMMARY._serialized_start=36430 - _ENDOFRUNSUMMARY._serialized_end=36517 - _ENDOFRUNSUMMARYMSG._serialized_start=36519 - _ENDOFRUNSUMMARYMSG._serialized_end=36621 - _LOGSKIPBECAUSEERROR._serialized_start=36623 - _LOGSKIPBECAUSEERROR._serialized_end=36708 - _LOGSKIPBECAUSEERRORMSG._serialized_start=36710 - _LOGSKIPBECAUSEERRORMSG._serialized_end=36820 - _ENSUREGITINSTALLED._serialized_start=36822 - _ENSUREGITINSTALLED._serialized_end=36842 - _ENSUREGITINSTALLEDMSG._serialized_start=36844 - _ENSUREGITINSTALLEDMSG._serialized_end=36952 - _DEPSCREATINGLOCALSYMLINK._serialized_start=36954 - _DEPSCREATINGLOCALSYMLINK._serialized_end=36980 - _DEPSCREATINGLOCALSYMLINKMSG._serialized_start=36982 - _DEPSCREATINGLOCALSYMLINKMSG._serialized_end=37102 - _DEPSSYMLINKNOTAVAILABLE._serialized_start=37104 - _DEPSSYMLINKNOTAVAILABLE._serialized_end=37129 - _DEPSSYMLINKNOTAVAILABLEMSG._serialized_start=37131 - _DEPSSYMLINKNOTAVAILABLEMSG._serialized_end=37249 - _DISABLETRACKING._serialized_start=37251 - _DISABLETRACKING._serialized_end=37268 - _DISABLETRACKINGMSG._serialized_start=37270 - _DISABLETRACKINGMSG._serialized_end=37372 - _SENDINGEVENT._serialized_start=37374 - _SENDINGEVENT._serialized_end=37404 - _SENDINGEVENTMSG._serialized_start=37406 - _SENDINGEVENTMSG._serialized_end=37502 - _SENDEVENTFAILURE._serialized_start=37504 - _SENDEVENTFAILURE._serialized_end=37522 - _SENDEVENTFAILUREMSG._serialized_start=37524 - _SENDEVENTFAILUREMSG._serialized_end=37628 - _FLUSHEVENTS._serialized_start=37630 - _FLUSHEVENTS._serialized_end=37643 - _FLUSHEVENTSMSG._serialized_start=37645 - _FLUSHEVENTSMSG._serialized_end=37739 - _FLUSHEVENTSFAILURE._serialized_start=37741 - _FLUSHEVENTSFAILURE._serialized_end=37761 - _FLUSHEVENTSFAILUREMSG._serialized_start=37763 - _FLUSHEVENTSFAILUREMSG._serialized_end=37871 - _TRACKINGINITIALIZEFAILURE._serialized_start=37873 - _TRACKINGINITIALIZEFAILURE._serialized_end=37918 - _TRACKINGINITIALIZEFAILUREMSG._serialized_start=37920 - _TRACKINGINITIALIZEFAILUREMSG._serialized_end=38042 - _RUNRESULTWARNINGMESSAGE._serialized_start=38044 - _RUNRESULTWARNINGMESSAGE._serialized_end=38082 - _RUNRESULTWARNINGMESSAGEMSG._serialized_start=38084 - _RUNRESULTWARNINGMESSAGEMSG._serialized_end=38202 - _DEBUGCMDOUT._serialized_start=38204 - _DEBUGCMDOUT._serialized_end=38230 - _DEBUGCMDOUTMSG._serialized_start=38232 - _DEBUGCMDOUTMSG._serialized_end=38326 - _DEBUGCMDRESULT._serialized_start=38328 - _DEBUGCMDRESULT._serialized_end=38357 - _DEBUGCMDRESULTMSG._serialized_start=38359 - _DEBUGCMDRESULTMSG._serialized_end=38459 - _LISTCMDOUT._serialized_start=38461 - _LISTCMDOUT._serialized_end=38486 - _LISTCMDOUTMSG._serialized_start=38488 - _LISTCMDOUTMSG._serialized_end=38580 - _NOTE._serialized_start=38582 - _NOTE._serialized_end=38601 - _NOTEMSG._serialized_start=38603 - _NOTEMSG._serialized_end=38683 + _globals['_EVENTINFO']._serialized_start=92 + _globals['_EVENTINFO']._serialized_end=365 + _globals['_EVENTINFO_EXTRAENTRY']._serialized_start=321 + _globals['_EVENTINFO_EXTRAENTRY']._serialized_end=365 + _globals['_TIMINGINFOMSG']._serialized_start=367 + _globals['_TIMINGINFOMSG']._serialized_end=494 + _globals['_NODERELATION']._serialized_start=496 + _globals['_NODERELATION']._serialized_end=582 + _globals['_NODEINFO']._serialized_start=585 + _globals['_NODEINFO']._serialized_end=858 + _globals['_RUNRESULTMSG']._serialized_start=861 + _globals['_RUNRESULTMSG']._serialized_end=1070 + _globals['_REFERENCEKEYMSG']._serialized_start=1072 + _globals['_REFERENCEKEYMSG']._serialized_end=1143 + _globals['_GENERICMESSAGE']._serialized_start=1145 + _globals['_GENERICMESSAGE']._serialized_end=1199 + _globals['_MAINREPORTVERSION']._serialized_start=1201 + _globals['_MAINREPORTVERSION']._serialized_end=1258 + _globals['_MAINREPORTVERSIONMSG']._serialized_start=1260 + _globals['_MAINREPORTVERSIONMSG']._serialized_end=1366 + _globals['_MAINREPORTARGS']._serialized_start=1368 + _globals['_MAINREPORTARGS']._serialized_end=1482 + _globals['_MAINREPORTARGS_ARGSENTRY']._serialized_start=1439 + _globals['_MAINREPORTARGS_ARGSENTRY']._serialized_end=1482 + _globals['_MAINREPORTARGSMSG']._serialized_start=1484 + _globals['_MAINREPORTARGSMSG']._serialized_end=1584 + _globals['_MAINTRACKINGUSERSTATE']._serialized_start=1586 + _globals['_MAINTRACKINGUSERSTATE']._serialized_end=1629 + _globals['_MAINTRACKINGUSERSTATEMSG']._serialized_start=1631 + _globals['_MAINTRACKINGUSERSTATEMSG']._serialized_end=1745 + _globals['_MERGEDFROMSTATE']._serialized_start=1747 + _globals['_MERGEDFROMSTATE']._serialized_end=1800 + _globals['_MERGEDFROMSTATEMSG']._serialized_start=1802 + _globals['_MERGEDFROMSTATEMSG']._serialized_end=1904 + _globals['_MISSINGPROFILETARGET']._serialized_start=1906 + _globals['_MISSINGPROFILETARGET']._serialized_end=1971 + _globals['_MISSINGPROFILETARGETMSG']._serialized_start=1973 + _globals['_MISSINGPROFILETARGETMSG']._serialized_end=2085 + _globals['_INVALIDOPTIONYAML']._serialized_start=2087 + _globals['_INVALIDOPTIONYAML']._serialized_end=2127 + _globals['_INVALIDOPTIONYAMLMSG']._serialized_start=2129 + _globals['_INVALIDOPTIONYAMLMSG']._serialized_end=2235 + _globals['_LOGDBTPROJECTERROR']._serialized_start=2237 + _globals['_LOGDBTPROJECTERROR']._serialized_end=2270 + _globals['_LOGDBTPROJECTERRORMSG']._serialized_start=2272 + _globals['_LOGDBTPROJECTERRORMSG']._serialized_end=2380 + _globals['_LOGDBTPROFILEERROR']._serialized_start=2382 + _globals['_LOGDBTPROFILEERROR']._serialized_end=2433 + _globals['_LOGDBTPROFILEERRORMSG']._serialized_start=2435 + _globals['_LOGDBTPROFILEERRORMSG']._serialized_end=2543 + _globals['_STARTERPROJECTPATH']._serialized_start=2545 + _globals['_STARTERPROJECTPATH']._serialized_end=2578 + _globals['_STARTERPROJECTPATHMSG']._serialized_start=2580 + _globals['_STARTERPROJECTPATHMSG']._serialized_end=2688 + _globals['_CONFIGFOLDERDIRECTORY']._serialized_start=2690 + _globals['_CONFIGFOLDERDIRECTORY']._serialized_end=2726 + _globals['_CONFIGFOLDERDIRECTORYMSG']._serialized_start=2728 + _globals['_CONFIGFOLDERDIRECTORYMSG']._serialized_end=2842 + _globals['_NOSAMPLEPROFILEFOUND']._serialized_start=2844 + _globals['_NOSAMPLEPROFILEFOUND']._serialized_end=2883 + _globals['_NOSAMPLEPROFILEFOUNDMSG']._serialized_start=2885 + _globals['_NOSAMPLEPROFILEFOUNDMSG']._serialized_end=2997 + _globals['_PROFILEWRITTENWITHSAMPLE']._serialized_start=2999 + _globals['_PROFILEWRITTENWITHSAMPLE']._serialized_end=3053 + _globals['_PROFILEWRITTENWITHSAMPLEMSG']._serialized_start=3055 + _globals['_PROFILEWRITTENWITHSAMPLEMSG']._serialized_end=3175 + _globals['_PROFILEWRITTENWITHTARGETTEMPLATEYAML']._serialized_start=3177 + _globals['_PROFILEWRITTENWITHTARGETTEMPLATEYAML']._serialized_end=3243 + _globals['_PROFILEWRITTENWITHTARGETTEMPLATEYAMLMSG']._serialized_start=3246 + _globals['_PROFILEWRITTENWITHTARGETTEMPLATEYAMLMSG']._serialized_end=3390 + _globals['_PROFILEWRITTENWITHPROJECTTEMPLATEYAML']._serialized_start=3392 + _globals['_PROFILEWRITTENWITHPROJECTTEMPLATEYAML']._serialized_end=3459 + _globals['_PROFILEWRITTENWITHPROJECTTEMPLATEYAMLMSG']._serialized_start=3462 + _globals['_PROFILEWRITTENWITHPROJECTTEMPLATEYAMLMSG']._serialized_end=3608 + _globals['_SETTINGUPPROFILE']._serialized_start=3610 + _globals['_SETTINGUPPROFILE']._serialized_end=3628 + _globals['_SETTINGUPPROFILEMSG']._serialized_start=3630 + _globals['_SETTINGUPPROFILEMSG']._serialized_end=3734 + _globals['_INVALIDPROFILETEMPLATEYAML']._serialized_start=3736 + _globals['_INVALIDPROFILETEMPLATEYAML']._serialized_end=3764 + _globals['_INVALIDPROFILETEMPLATEYAMLMSG']._serialized_start=3766 + _globals['_INVALIDPROFILETEMPLATEYAMLMSG']._serialized_end=3890 + _globals['_PROJECTNAMEALREADYEXISTS']._serialized_start=3892 + _globals['_PROJECTNAMEALREADYEXISTS']._serialized_end=3932 + _globals['_PROJECTNAMEALREADYEXISTSMSG']._serialized_start=3934 + _globals['_PROJECTNAMEALREADYEXISTSMSG']._serialized_end=4054 + _globals['_PROJECTCREATED']._serialized_start=4056 + _globals['_PROJECTCREATED']._serialized_end=4131 + _globals['_PROJECTCREATEDMSG']._serialized_start=4133 + _globals['_PROJECTCREATEDMSG']._serialized_end=4233 + _globals['_PACKAGEREDIRECTDEPRECATION']._serialized_start=4235 + _globals['_PACKAGEREDIRECTDEPRECATION']._serialized_end=4299 + _globals['_PACKAGEREDIRECTDEPRECATIONMSG']._serialized_start=4301 + _globals['_PACKAGEREDIRECTDEPRECATIONMSG']._serialized_end=4425 + _globals['_PACKAGEINSTALLPATHDEPRECATION']._serialized_start=4427 + _globals['_PACKAGEINSTALLPATHDEPRECATION']._serialized_end=4458 + _globals['_PACKAGEINSTALLPATHDEPRECATIONMSG']._serialized_start=4461 + _globals['_PACKAGEINSTALLPATHDEPRECATIONMSG']._serialized_end=4591 + _globals['_CONFIGSOURCEPATHDEPRECATION']._serialized_start=4593 + _globals['_CONFIGSOURCEPATHDEPRECATION']._serialized_end=4665 + _globals['_CONFIGSOURCEPATHDEPRECATIONMSG']._serialized_start=4667 + _globals['_CONFIGSOURCEPATHDEPRECATIONMSG']._serialized_end=4793 + _globals['_CONFIGDATAPATHDEPRECATION']._serialized_start=4795 + _globals['_CONFIGDATAPATHDEPRECATION']._serialized_end=4865 + _globals['_CONFIGDATAPATHDEPRECATIONMSG']._serialized_start=4867 + _globals['_CONFIGDATAPATHDEPRECATIONMSG']._serialized_end=4989 + _globals['_ADAPTERDEPRECATIONWARNING']._serialized_start=4991 + _globals['_ADAPTERDEPRECATIONWARNING']._serialized_end=5054 + _globals['_ADAPTERDEPRECATIONWARNINGMSG']._serialized_start=5056 + _globals['_ADAPTERDEPRECATIONWARNINGMSG']._serialized_end=5178 + _globals['_METRICATTRIBUTESRENAMED']._serialized_start=5180 + _globals['_METRICATTRIBUTESRENAMED']._serialized_end=5226 + _globals['_METRICATTRIBUTESRENAMEDMSG']._serialized_start=5228 + _globals['_METRICATTRIBUTESRENAMEDMSG']._serialized_end=5346 + _globals['_EXPOSURENAMEDEPRECATION']._serialized_start=5348 + _globals['_EXPOSURENAMEDEPRECATION']._serialized_end=5391 + _globals['_EXPOSURENAMEDEPRECATIONMSG']._serialized_start=5393 + _globals['_EXPOSURENAMEDEPRECATIONMSG']._serialized_end=5511 + _globals['_INTERNALDEPRECATION']._serialized_start=5513 + _globals['_INTERNALDEPRECATION']._serialized_end=5607 + _globals['_INTERNALDEPRECATIONMSG']._serialized_start=5609 + _globals['_INTERNALDEPRECATIONMSG']._serialized_end=5719 + _globals['_ENVIRONMENTVARIABLERENAMED']._serialized_start=5721 + _globals['_ENVIRONMENTVARIABLERENAMED']._serialized_end=5785 + _globals['_ENVIRONMENTVARIABLERENAMEDMSG']._serialized_start=5787 + _globals['_ENVIRONMENTVARIABLERENAMEDMSG']._serialized_end=5911 + _globals['_CONFIGLOGPATHDEPRECATION']._serialized_start=5913 + _globals['_CONFIGLOGPATHDEPRECATION']._serialized_end=5964 + _globals['_CONFIGLOGPATHDEPRECATIONMSG']._serialized_start=5966 + _globals['_CONFIGLOGPATHDEPRECATIONMSG']._serialized_end=6086 + _globals['_CONFIGTARGETPATHDEPRECATION']._serialized_start=6088 + _globals['_CONFIGTARGETPATHDEPRECATION']._serialized_end=6142 + _globals['_CONFIGTARGETPATHDEPRECATIONMSG']._serialized_start=6144 + _globals['_CONFIGTARGETPATHDEPRECATIONMSG']._serialized_end=6270 + _globals['_COLLECTFRESHNESSRETURNSIGNATURE']._serialized_start=6272 + _globals['_COLLECTFRESHNESSRETURNSIGNATURE']._serialized_end=6305 + _globals['_COLLECTFRESHNESSRETURNSIGNATUREMSG']._serialized_start=6308 + _globals['_COLLECTFRESHNESSRETURNSIGNATUREMSG']._serialized_end=6442 + _globals['_ADAPTEREVENTDEBUG']._serialized_start=6445 + _globals['_ADAPTEREVENTDEBUG']._serialized_end=6580 + _globals['_ADAPTEREVENTDEBUGMSG']._serialized_start=6582 + _globals['_ADAPTEREVENTDEBUGMSG']._serialized_end=6688 + _globals['_ADAPTEREVENTINFO']._serialized_start=6691 + _globals['_ADAPTEREVENTINFO']._serialized_end=6825 + _globals['_ADAPTEREVENTINFOMSG']._serialized_start=6827 + _globals['_ADAPTEREVENTINFOMSG']._serialized_end=6931 + _globals['_ADAPTEREVENTWARNING']._serialized_start=6934 + _globals['_ADAPTEREVENTWARNING']._serialized_end=7071 + _globals['_ADAPTEREVENTWARNINGMSG']._serialized_start=7073 + _globals['_ADAPTEREVENTWARNINGMSG']._serialized_end=7183 + _globals['_ADAPTEREVENTERROR']._serialized_start=7186 + _globals['_ADAPTEREVENTERROR']._serialized_end=7339 + _globals['_ADAPTEREVENTERRORMSG']._serialized_start=7341 + _globals['_ADAPTEREVENTERRORMSG']._serialized_end=7447 + _globals['_NEWCONNECTION']._serialized_start=7449 + _globals['_NEWCONNECTION']._serialized_end=7544 + _globals['_NEWCONNECTIONMSG']._serialized_start=7546 + _globals['_NEWCONNECTIONMSG']._serialized_end=7644 + _globals['_CONNECTIONREUSED']._serialized_start=7646 + _globals['_CONNECTIONREUSED']._serialized_end=7707 + _globals['_CONNECTIONREUSEDMSG']._serialized_start=7709 + _globals['_CONNECTIONREUSEDMSG']._serialized_end=7813 + _globals['_CONNECTIONLEFTOPENINCLEANUP']._serialized_start=7815 + _globals['_CONNECTIONLEFTOPENINCLEANUP']._serialized_end=7863 + _globals['_CONNECTIONLEFTOPENINCLEANUPMSG']._serialized_start=7865 + _globals['_CONNECTIONLEFTOPENINCLEANUPMSG']._serialized_end=7991 + _globals['_CONNECTIONCLOSEDINCLEANUP']._serialized_start=7993 + _globals['_CONNECTIONCLOSEDINCLEANUP']._serialized_end=8039 + _globals['_CONNECTIONCLOSEDINCLEANUPMSG']._serialized_start=8041 + _globals['_CONNECTIONCLOSEDINCLEANUPMSG']._serialized_end=8163 + _globals['_ROLLBACKFAILED']._serialized_start=8165 + _globals['_ROLLBACKFAILED']._serialized_end=8260 + _globals['_ROLLBACKFAILEDMSG']._serialized_start=8262 + _globals['_ROLLBACKFAILEDMSG']._serialized_end=8362 + _globals['_CONNECTIONCLOSED']._serialized_start=8364 + _globals['_CONNECTIONCLOSED']._serialized_end=8443 + _globals['_CONNECTIONCLOSEDMSG']._serialized_start=8445 + _globals['_CONNECTIONCLOSEDMSG']._serialized_end=8549 + _globals['_CONNECTIONLEFTOPEN']._serialized_start=8551 + _globals['_CONNECTIONLEFTOPEN']._serialized_end=8632 + _globals['_CONNECTIONLEFTOPENMSG']._serialized_start=8634 + _globals['_CONNECTIONLEFTOPENMSG']._serialized_end=8742 + _globals['_ROLLBACK']._serialized_start=8744 + _globals['_ROLLBACK']._serialized_end=8815 + _globals['_ROLLBACKMSG']._serialized_start=8817 + _globals['_ROLLBACKMSG']._serialized_end=8905 + _globals['_CACHEMISS']._serialized_start=8907 + _globals['_CACHEMISS']._serialized_end=8971 + _globals['_CACHEMISSMSG']._serialized_start=8973 + _globals['_CACHEMISSMSG']._serialized_end=9063 + _globals['_LISTRELATIONS']._serialized_start=9065 + _globals['_LISTRELATIONS']._serialized_end=9163 + _globals['_LISTRELATIONSMSG']._serialized_start=9165 + _globals['_LISTRELATIONSMSG']._serialized_end=9263 + _globals['_CONNECTIONUSED']._serialized_start=9265 + _globals['_CONNECTIONUSED']._serialized_end=9361 + _globals['_CONNECTIONUSEDMSG']._serialized_start=9363 + _globals['_CONNECTIONUSEDMSG']._serialized_end=9463 + _globals['_SQLQUERY']._serialized_start=9465 + _globals['_SQLQUERY']._serialized_end=9549 + _globals['_SQLQUERYMSG']._serialized_start=9551 + _globals['_SQLQUERYMSG']._serialized_end=9639 + _globals['_SQLQUERYSTATUS']._serialized_start=9641 + _globals['_SQLQUERYSTATUS']._serialized_end=9732 + _globals['_SQLQUERYSTATUSMSG']._serialized_start=9734 + _globals['_SQLQUERYSTATUSMSG']._serialized_end=9834 + _globals['_SQLCOMMIT']._serialized_start=9836 + _globals['_SQLCOMMIT']._serialized_end=9908 + _globals['_SQLCOMMITMSG']._serialized_start=9910 + _globals['_SQLCOMMITMSG']._serialized_end=10000 + _globals['_COLTYPECHANGE']._serialized_start=10002 + _globals['_COLTYPECHANGE']._serialized_end=10099 + _globals['_COLTYPECHANGEMSG']._serialized_start=10101 + _globals['_COLTYPECHANGEMSG']._serialized_end=10199 + _globals['_SCHEMACREATION']._serialized_start=10201 + _globals['_SCHEMACREATION']._serialized_end=10265 + _globals['_SCHEMACREATIONMSG']._serialized_start=10267 + _globals['_SCHEMACREATIONMSG']._serialized_end=10367 + _globals['_SCHEMADROP']._serialized_start=10369 + _globals['_SCHEMADROP']._serialized_end=10429 + _globals['_SCHEMADROPMSG']._serialized_start=10431 + _globals['_SCHEMADROPMSG']._serialized_end=10523 + _globals['_CACHEACTION']._serialized_start=10526 + _globals['_CACHEACTION']._serialized_end=10748 + _globals['_CACHEACTIONMSG']._serialized_start=10750 + _globals['_CACHEACTIONMSG']._serialized_end=10844 + _globals['_CACHEDUMPGRAPH']._serialized_start=10847 + _globals['_CACHEDUMPGRAPH']._serialized_end=10999 + _globals['_CACHEDUMPGRAPH_DUMPENTRY']._serialized_start=10956 + _globals['_CACHEDUMPGRAPH_DUMPENTRY']._serialized_end=10999 + _globals['_CACHEDUMPGRAPHMSG']._serialized_start=11001 + _globals['_CACHEDUMPGRAPHMSG']._serialized_end=11101 + _globals['_ADAPTERREGISTERED']._serialized_start=11103 + _globals['_ADAPTERREGISTERED']._serialized_end=11169 + _globals['_ADAPTERREGISTEREDMSG']._serialized_start=11171 + _globals['_ADAPTERREGISTEREDMSG']._serialized_end=11277 + _globals['_ADAPTERIMPORTERROR']._serialized_start=11279 + _globals['_ADAPTERIMPORTERROR']._serialized_end=11312 + _globals['_ADAPTERIMPORTERRORMSG']._serialized_start=11314 + _globals['_ADAPTERIMPORTERRORMSG']._serialized_end=11422 + _globals['_PLUGINLOADERROR']._serialized_start=11424 + _globals['_PLUGINLOADERROR']._serialized_end=11459 + _globals['_PLUGINLOADERRORMSG']._serialized_start=11461 + _globals['_PLUGINLOADERRORMSG']._serialized_end=11563 + _globals['_NEWCONNECTIONOPENING']._serialized_start=11565 + _globals['_NEWCONNECTIONOPENING']._serialized_end=11655 + _globals['_NEWCONNECTIONOPENINGMSG']._serialized_start=11657 + _globals['_NEWCONNECTIONOPENINGMSG']._serialized_end=11769 + _globals['_CODEEXECUTION']._serialized_start=11771 + _globals['_CODEEXECUTION']._serialized_end=11827 + _globals['_CODEEXECUTIONMSG']._serialized_start=11829 + _globals['_CODEEXECUTIONMSG']._serialized_end=11927 + _globals['_CODEEXECUTIONSTATUS']._serialized_start=11929 + _globals['_CODEEXECUTIONSTATUS']._serialized_end=11983 + _globals['_CODEEXECUTIONSTATUSMSG']._serialized_start=11985 + _globals['_CODEEXECUTIONSTATUSMSG']._serialized_end=12095 + _globals['_CATALOGGENERATIONERROR']._serialized_start=12097 + _globals['_CATALOGGENERATIONERROR']._serialized_end=12134 + _globals['_CATALOGGENERATIONERRORMSG']._serialized_start=12136 + _globals['_CATALOGGENERATIONERRORMSG']._serialized_end=12252 + _globals['_WRITECATALOGFAILURE']._serialized_start=12254 + _globals['_WRITECATALOGFAILURE']._serialized_end=12299 + _globals['_WRITECATALOGFAILUREMSG']._serialized_start=12301 + _globals['_WRITECATALOGFAILUREMSG']._serialized_end=12411 + _globals['_CATALOGWRITTEN']._serialized_start=12413 + _globals['_CATALOGWRITTEN']._serialized_end=12443 + _globals['_CATALOGWRITTENMSG']._serialized_start=12445 + _globals['_CATALOGWRITTENMSG']._serialized_end=12545 + _globals['_CANNOTGENERATEDOCS']._serialized_start=12547 + _globals['_CANNOTGENERATEDOCS']._serialized_end=12567 + _globals['_CANNOTGENERATEDOCSMSG']._serialized_start=12569 + _globals['_CANNOTGENERATEDOCSMSG']._serialized_end=12677 + _globals['_BUILDINGCATALOG']._serialized_start=12679 + _globals['_BUILDINGCATALOG']._serialized_end=12696 + _globals['_BUILDINGCATALOGMSG']._serialized_start=12698 + _globals['_BUILDINGCATALOGMSG']._serialized_end=12800 + _globals['_DATABASEERRORRUNNINGHOOK']._serialized_start=12802 + _globals['_DATABASEERRORRUNNINGHOOK']._serialized_end=12847 + _globals['_DATABASEERRORRUNNINGHOOKMSG']._serialized_start=12849 + _globals['_DATABASEERRORRUNNINGHOOKMSG']._serialized_end=12969 + _globals['_HOOKSRUNNING']._serialized_start=12971 + _globals['_HOOKSRUNNING']._serialized_end=13023 + _globals['_HOOKSRUNNINGMSG']._serialized_start=13025 + _globals['_HOOKSRUNNINGMSG']._serialized_end=13121 + _globals['_FINISHEDRUNNINGSTATS']._serialized_start=13123 + _globals['_FINISHEDRUNNINGSTATS']._serialized_end=13207 + _globals['_FINISHEDRUNNINGSTATSMSG']._serialized_start=13209 + _globals['_FINISHEDRUNNINGSTATSMSG']._serialized_end=13321 + _globals['_CONSTRAINTNOTENFORCED']._serialized_start=13323 + _globals['_CONSTRAINTNOTENFORCED']._serialized_end=13383 + _globals['_CONSTRAINTNOTENFORCEDMSG']._serialized_start=13385 + _globals['_CONSTRAINTNOTENFORCEDMSG']._serialized_end=13499 + _globals['_CONSTRAINTNOTSUPPORTED']._serialized_start=13501 + _globals['_CONSTRAINTNOTSUPPORTED']._serialized_end=13562 + _globals['_CONSTRAINTNOTSUPPORTEDMSG']._serialized_start=13564 + _globals['_CONSTRAINTNOTSUPPORTEDMSG']._serialized_end=13680 + _globals['_INPUTFILEDIFFERROR']._serialized_start=13682 + _globals['_INPUTFILEDIFFERROR']._serialized_end=13737 + _globals['_INPUTFILEDIFFERRORMSG']._serialized_start=13739 + _globals['_INPUTFILEDIFFERRORMSG']._serialized_end=13847 + _globals['_PUBLICATIONARTIFACTCHANGED']._serialized_start=13849 + _globals['_PUBLICATIONARTIFACTCHANGED']._serialized_end=13965 + _globals['_PUBLICATIONARTIFACTCHANGEDMSG']._serialized_start=13967 + _globals['_PUBLICATIONARTIFACTCHANGEDMSG']._serialized_end=14091 + _globals['_INVALIDVALUEFORFIELD']._serialized_start=14093 + _globals['_INVALIDVALUEFORFIELD']._serialized_end=14156 + _globals['_INVALIDVALUEFORFIELDMSG']._serialized_start=14158 + _globals['_INVALIDVALUEFORFIELDMSG']._serialized_end=14270 + _globals['_VALIDATIONWARNING']._serialized_start=14272 + _globals['_VALIDATIONWARNING']._serialized_end=14353 + _globals['_VALIDATIONWARNINGMSG']._serialized_start=14355 + _globals['_VALIDATIONWARNINGMSG']._serialized_end=14461 + _globals['_PARSEPERFINFOPATH']._serialized_start=14463 + _globals['_PARSEPERFINFOPATH']._serialized_end=14496 + _globals['_PARSEPERFINFOPATHMSG']._serialized_start=14498 + _globals['_PARSEPERFINFOPATHMSG']._serialized_end=14604 + _globals['_PARTIALPARSINGERRORPROCESSINGFILE']._serialized_start=14606 + _globals['_PARTIALPARSINGERRORPROCESSINGFILE']._serialized_end=14655 + _globals['_PARTIALPARSINGERRORPROCESSINGFILEMSG']._serialized_start=14658 + _globals['_PARTIALPARSINGERRORPROCESSINGFILEMSG']._serialized_end=14796 + _globals['_PARTIALPARSINGERROR']._serialized_start=14799 + _globals['_PARTIALPARSINGERROR']._serialized_end=14933 + _globals['_PARTIALPARSINGERROR_EXCINFOENTRY']._serialized_start=14887 + _globals['_PARTIALPARSINGERROR_EXCINFOENTRY']._serialized_end=14933 + _globals['_PARTIALPARSINGERRORMSG']._serialized_start=14935 + _globals['_PARTIALPARSINGERRORMSG']._serialized_end=15045 + _globals['_PARTIALPARSINGSKIPPARSING']._serialized_start=15047 + _globals['_PARTIALPARSINGSKIPPARSING']._serialized_end=15074 + _globals['_PARTIALPARSINGSKIPPARSINGMSG']._serialized_start=15076 + _globals['_PARTIALPARSINGSKIPPARSINGMSG']._serialized_end=15198 + _globals['_UNABLETOPARTIALPARSE']._serialized_start=15200 + _globals['_UNABLETOPARTIALPARSE']._serialized_end=15238 + _globals['_UNABLETOPARTIALPARSEMSG']._serialized_start=15240 + _globals['_UNABLETOPARTIALPARSEMSG']._serialized_end=15352 + _globals['_STATECHECKVARSHASH']._serialized_start=15354 + _globals['_STATECHECKVARSHASH']._serialized_end=15456 + _globals['_STATECHECKVARSHASHMSG']._serialized_start=15458 + _globals['_STATECHECKVARSHASHMSG']._serialized_end=15566 + _globals['_PARTIALPARSINGNOTENABLED']._serialized_start=15568 + _globals['_PARTIALPARSINGNOTENABLED']._serialized_end=15594 + _globals['_PARTIALPARSINGNOTENABLEDMSG']._serialized_start=15596 + _globals['_PARTIALPARSINGNOTENABLEDMSG']._serialized_end=15716 + _globals['_PARSEDFILELOADFAILED']._serialized_start=15718 + _globals['_PARSEDFILELOADFAILED']._serialized_end=15785 + _globals['_PARSEDFILELOADFAILEDMSG']._serialized_start=15787 + _globals['_PARSEDFILELOADFAILEDMSG']._serialized_end=15899 + _globals['_PARTIALPARSINGENABLED']._serialized_start=15901 + _globals['_PARTIALPARSINGENABLED']._serialized_end=15973 + _globals['_PARTIALPARSINGENABLEDMSG']._serialized_start=15975 + _globals['_PARTIALPARSINGENABLEDMSG']._serialized_end=16089 + _globals['_PARTIALPARSINGFILE']._serialized_start=16091 + _globals['_PARTIALPARSINGFILE']._serialized_end=16147 + _globals['_PARTIALPARSINGFILEMSG']._serialized_start=16149 + _globals['_PARTIALPARSINGFILEMSG']._serialized_end=16257 + _globals['_INVALIDDISABLEDTARGETINTESTNODE']._serialized_start=16260 + _globals['_INVALIDDISABLEDTARGETINTESTNODE']._serialized_end=16435 + _globals['_INVALIDDISABLEDTARGETINTESTNODEMSG']._serialized_start=16438 + _globals['_INVALIDDISABLEDTARGETINTESTNODEMSG']._serialized_end=16572 + _globals['_UNUSEDRESOURCECONFIGPATH']._serialized_start=16574 + _globals['_UNUSEDRESOURCECONFIGPATH']._serialized_end=16629 + _globals['_UNUSEDRESOURCECONFIGPATHMSG']._serialized_start=16631 + _globals['_UNUSEDRESOURCECONFIGPATHMSG']._serialized_end=16751 + _globals['_SEEDINCREASED']._serialized_start=16753 + _globals['_SEEDINCREASED']._serialized_end=16804 + _globals['_SEEDINCREASEDMSG']._serialized_start=16806 + _globals['_SEEDINCREASEDMSG']._serialized_end=16904 + _globals['_SEEDEXCEEDSLIMITSAMEPATH']._serialized_start=16906 + _globals['_SEEDEXCEEDSLIMITSAMEPATH']._serialized_end=16968 + _globals['_SEEDEXCEEDSLIMITSAMEPATHMSG']._serialized_start=16970 + _globals['_SEEDEXCEEDSLIMITSAMEPATHMSG']._serialized_end=17090 + _globals['_SEEDEXCEEDSLIMITANDPATHCHANGED']._serialized_start=17092 + _globals['_SEEDEXCEEDSLIMITANDPATHCHANGED']._serialized_end=17160 + _globals['_SEEDEXCEEDSLIMITANDPATHCHANGEDMSG']._serialized_start=17163 + _globals['_SEEDEXCEEDSLIMITANDPATHCHANGEDMSG']._serialized_end=17295 + _globals['_SEEDEXCEEDSLIMITCHECKSUMCHANGED']._serialized_start=17297 + _globals['_SEEDEXCEEDSLIMITCHECKSUMCHANGED']._serialized_end=17389 + _globals['_SEEDEXCEEDSLIMITCHECKSUMCHANGEDMSG']._serialized_start=17392 + _globals['_SEEDEXCEEDSLIMITCHECKSUMCHANGEDMSG']._serialized_end=17526 + _globals['_UNUSEDTABLES']._serialized_start=17528 + _globals['_UNUSEDTABLES']._serialized_end=17565 + _globals['_UNUSEDTABLESMSG']._serialized_start=17567 + _globals['_UNUSEDTABLESMSG']._serialized_end=17663 + _globals['_WRONGRESOURCESCHEMAFILE']._serialized_start=17666 + _globals['_WRONGRESOURCESCHEMAFILE']._serialized_end=17801 + _globals['_WRONGRESOURCESCHEMAFILEMSG']._serialized_start=17803 + _globals['_WRONGRESOURCESCHEMAFILEMSG']._serialized_end=17921 + _globals['_NONODEFORYAMLKEY']._serialized_start=17923 + _globals['_NONODEFORYAMLKEY']._serialized_end=17998 + _globals['_NONODEFORYAMLKEYMSG']._serialized_start=18000 + _globals['_NONODEFORYAMLKEYMSG']._serialized_end=18104 + _globals['_MACRONOTFOUNDFORPATCH']._serialized_start=18106 + _globals['_MACRONOTFOUNDFORPATCH']._serialized_end=18149 + _globals['_MACRONOTFOUNDFORPATCHMSG']._serialized_start=18151 + _globals['_MACRONOTFOUNDFORPATCHMSG']._serialized_end=18265 + _globals['_NODENOTFOUNDORDISABLED']._serialized_start=18268 + _globals['_NODENOTFOUNDORDISABLED']._serialized_end=18452 + _globals['_NODENOTFOUNDORDISABLEDMSG']._serialized_start=18454 + _globals['_NODENOTFOUNDORDISABLEDMSG']._serialized_end=18570 + _globals['_JINJALOGWARNING']._serialized_start=18572 + _globals['_JINJALOGWARNING']._serialized_end=18644 + _globals['_JINJALOGWARNINGMSG']._serialized_start=18646 + _globals['_JINJALOGWARNINGMSG']._serialized_end=18748 + _globals['_JINJALOGINFO']._serialized_start=18750 + _globals['_JINJALOGINFO']._serialized_end=18819 + _globals['_JINJALOGINFOMSG']._serialized_start=18821 + _globals['_JINJALOGINFOMSG']._serialized_end=18917 + _globals['_JINJALOGDEBUG']._serialized_start=18919 + _globals['_JINJALOGDEBUG']._serialized_end=18989 + _globals['_JINJALOGDEBUGMSG']._serialized_start=18991 + _globals['_JINJALOGDEBUGMSG']._serialized_end=19089 + _globals['_UNPINNEDREFNEWVERSIONAVAILABLE']._serialized_start=19092 + _globals['_UNPINNEDREFNEWVERSIONAVAILABLE']._serialized_end=19266 + _globals['_UNPINNEDREFNEWVERSIONAVAILABLEMSG']._serialized_start=19269 + _globals['_UNPINNEDREFNEWVERSIONAVAILABLEMSG']._serialized_end=19401 + _globals['_DEPRECATEDMODEL']._serialized_start=19403 + _globals['_DEPRECATEDMODEL']._serialized_end=19489 + _globals['_DEPRECATEDMODELMSG']._serialized_start=19491 + _globals['_DEPRECATEDMODELMSG']._serialized_end=19593 + _globals['_UPCOMINGREFERENCEDEPRECATION']._serialized_start=19596 + _globals['_UPCOMINGREFERENCEDEPRECATION']._serialized_end=19794 + _globals['_UPCOMINGREFERENCEDEPRECATIONMSG']._serialized_start=19797 + _globals['_UPCOMINGREFERENCEDEPRECATIONMSG']._serialized_end=19925 + _globals['_DEPRECATEDREFERENCE']._serialized_start=19928 + _globals['_DEPRECATEDREFERENCE']._serialized_end=20117 + _globals['_DEPRECATEDREFERENCEMSG']._serialized_start=20119 + _globals['_DEPRECATEDREFERENCEMSG']._serialized_end=20229 + _globals['_UNSUPPORTEDCONSTRAINTMATERIALIZATION']._serialized_start=20231 + _globals['_UNSUPPORTEDCONSTRAINTMATERIALIZATION']._serialized_end=20291 + _globals['_UNSUPPORTEDCONSTRAINTMATERIALIZATIONMSG']._serialized_start=20294 + _globals['_UNSUPPORTEDCONSTRAINTMATERIALIZATIONMSG']._serialized_end=20438 + _globals['_GITSPARSECHECKOUTSUBDIRECTORY']._serialized_start=20440 + _globals['_GITSPARSECHECKOUTSUBDIRECTORY']._serialized_end=20487 + _globals['_GITSPARSECHECKOUTSUBDIRECTORYMSG']._serialized_start=20490 + _globals['_GITSPARSECHECKOUTSUBDIRECTORYMSG']._serialized_end=20620 + _globals['_GITPROGRESSCHECKOUTREVISION']._serialized_start=20622 + _globals['_GITPROGRESSCHECKOUTREVISION']._serialized_end=20669 + _globals['_GITPROGRESSCHECKOUTREVISIONMSG']._serialized_start=20671 + _globals['_GITPROGRESSCHECKOUTREVISIONMSG']._serialized_end=20797 + _globals['_GITPROGRESSUPDATINGEXISTINGDEPENDENCY']._serialized_start=20799 + _globals['_GITPROGRESSUPDATINGEXISTINGDEPENDENCY']._serialized_end=20851 + _globals['_GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG']._serialized_start=20854 + _globals['_GITPROGRESSUPDATINGEXISTINGDEPENDENCYMSG']._serialized_end=21000 + _globals['_GITPROGRESSPULLINGNEWDEPENDENCY']._serialized_start=21002 + _globals['_GITPROGRESSPULLINGNEWDEPENDENCY']._serialized_end=21048 + _globals['_GITPROGRESSPULLINGNEWDEPENDENCYMSG']._serialized_start=21051 + _globals['_GITPROGRESSPULLINGNEWDEPENDENCYMSG']._serialized_end=21185 + _globals['_GITNOTHINGTODO']._serialized_start=21187 + _globals['_GITNOTHINGTODO']._serialized_end=21216 + _globals['_GITNOTHINGTODOMSG']._serialized_start=21218 + _globals['_GITNOTHINGTODOMSG']._serialized_end=21318 + _globals['_GITPROGRESSUPDATEDCHECKOUTRANGE']._serialized_start=21320 + _globals['_GITPROGRESSUPDATEDCHECKOUTRANGE']._serialized_end=21389 + _globals['_GITPROGRESSUPDATEDCHECKOUTRANGEMSG']._serialized_start=21392 + _globals['_GITPROGRESSUPDATEDCHECKOUTRANGEMSG']._serialized_end=21526 + _globals['_GITPROGRESSCHECKEDOUTAT']._serialized_start=21528 + _globals['_GITPROGRESSCHECKEDOUTAT']._serialized_end=21570 + _globals['_GITPROGRESSCHECKEDOUTATMSG']._serialized_start=21572 + _globals['_GITPROGRESSCHECKEDOUTATMSG']._serialized_end=21690 + _globals['_REGISTRYPROGRESSGETREQUEST']._serialized_start=21692 + _globals['_REGISTRYPROGRESSGETREQUEST']._serialized_end=21733 + _globals['_REGISTRYPROGRESSGETREQUESTMSG']._serialized_start=21735 + _globals['_REGISTRYPROGRESSGETREQUESTMSG']._serialized_end=21859 + _globals['_REGISTRYPROGRESSGETRESPONSE']._serialized_start=21861 + _globals['_REGISTRYPROGRESSGETRESPONSE']._serialized_end=21922 + _globals['_REGISTRYPROGRESSGETRESPONSEMSG']._serialized_start=21924 + _globals['_REGISTRYPROGRESSGETRESPONSEMSG']._serialized_end=22050 + _globals['_SELECTORREPORTINVALIDSELECTOR']._serialized_start=22052 + _globals['_SELECTORREPORTINVALIDSELECTOR']._serialized_end=22147 + _globals['_SELECTORREPORTINVALIDSELECTORMSG']._serialized_start=22150 + _globals['_SELECTORREPORTINVALIDSELECTORMSG']._serialized_end=22280 + _globals['_DEPSNOPACKAGESFOUND']._serialized_start=22282 + _globals['_DEPSNOPACKAGESFOUND']._serialized_end=22303 + _globals['_DEPSNOPACKAGESFOUNDMSG']._serialized_start=22305 + _globals['_DEPSNOPACKAGESFOUNDMSG']._serialized_end=22415 + _globals['_DEPSSTARTPACKAGEINSTALL']._serialized_start=22417 + _globals['_DEPSSTARTPACKAGEINSTALL']._serialized_end=22464 + _globals['_DEPSSTARTPACKAGEINSTALLMSG']._serialized_start=22466 + _globals['_DEPSSTARTPACKAGEINSTALLMSG']._serialized_end=22584 + _globals['_DEPSINSTALLINFO']._serialized_start=22586 + _globals['_DEPSINSTALLINFO']._serialized_end=22625 + _globals['_DEPSINSTALLINFOMSG']._serialized_start=22627 + _globals['_DEPSINSTALLINFOMSG']._serialized_end=22729 + _globals['_DEPSUPDATEAVAILABLE']._serialized_start=22731 + _globals['_DEPSUPDATEAVAILABLE']._serialized_end=22776 + _globals['_DEPSUPDATEAVAILABLEMSG']._serialized_start=22778 + _globals['_DEPSUPDATEAVAILABLEMSG']._serialized_end=22888 + _globals['_DEPSUPTODATE']._serialized_start=22890 + _globals['_DEPSUPTODATE']._serialized_end=22904 + _globals['_DEPSUPTODATEMSG']._serialized_start=22906 + _globals['_DEPSUPTODATEMSG']._serialized_end=23002 + _globals['_DEPSLISTSUBDIRECTORY']._serialized_start=23004 + _globals['_DEPSLISTSUBDIRECTORY']._serialized_end=23048 + _globals['_DEPSLISTSUBDIRECTORYMSG']._serialized_start=23050 + _globals['_DEPSLISTSUBDIRECTORYMSG']._serialized_end=23162 + _globals['_DEPSNOTIFYUPDATESAVAILABLE']._serialized_start=23164 + _globals['_DEPSNOTIFYUPDATESAVAILABLE']._serialized_end=23210 + _globals['_DEPSNOTIFYUPDATESAVAILABLEMSG']._serialized_start=23212 + _globals['_DEPSNOTIFYUPDATESAVAILABLEMSG']._serialized_end=23336 + _globals['_RETRYEXTERNALCALL']._serialized_start=23338 + _globals['_RETRYEXTERNALCALL']._serialized_end=23387 + _globals['_RETRYEXTERNALCALLMSG']._serialized_start=23389 + _globals['_RETRYEXTERNALCALLMSG']._serialized_end=23495 + _globals['_RECORDRETRYEXCEPTION']._serialized_start=23497 + _globals['_RECORDRETRYEXCEPTION']._serialized_end=23532 + _globals['_RECORDRETRYEXCEPTIONMSG']._serialized_start=23534 + _globals['_RECORDRETRYEXCEPTIONMSG']._serialized_end=23646 + _globals['_REGISTRYINDEXPROGRESSGETREQUEST']._serialized_start=23648 + _globals['_REGISTRYINDEXPROGRESSGETREQUEST']._serialized_end=23694 + _globals['_REGISTRYINDEXPROGRESSGETREQUESTMSG']._serialized_start=23697 + _globals['_REGISTRYINDEXPROGRESSGETREQUESTMSG']._serialized_end=23831 + _globals['_REGISTRYINDEXPROGRESSGETRESPONSE']._serialized_start=23833 + _globals['_REGISTRYINDEXPROGRESSGETRESPONSE']._serialized_end=23899 + _globals['_REGISTRYINDEXPROGRESSGETRESPONSEMSG']._serialized_start=23902 + _globals['_REGISTRYINDEXPROGRESSGETRESPONSEMSG']._serialized_end=24038 + _globals['_REGISTRYRESPONSEUNEXPECTEDTYPE']._serialized_start=24040 + _globals['_REGISTRYRESPONSEUNEXPECTEDTYPE']._serialized_end=24090 + _globals['_REGISTRYRESPONSEUNEXPECTEDTYPEMSG']._serialized_start=24093 + _globals['_REGISTRYRESPONSEUNEXPECTEDTYPEMSG']._serialized_end=24225 + _globals['_REGISTRYRESPONSEMISSINGTOPKEYS']._serialized_start=24227 + _globals['_REGISTRYRESPONSEMISSINGTOPKEYS']._serialized_end=24277 + _globals['_REGISTRYRESPONSEMISSINGTOPKEYSMSG']._serialized_start=24280 + _globals['_REGISTRYRESPONSEMISSINGTOPKEYSMSG']._serialized_end=24412 + _globals['_REGISTRYRESPONSEMISSINGNESTEDKEYS']._serialized_start=24414 + _globals['_REGISTRYRESPONSEMISSINGNESTEDKEYS']._serialized_end=24467 + _globals['_REGISTRYRESPONSEMISSINGNESTEDKEYSMSG']._serialized_start=24470 + _globals['_REGISTRYRESPONSEMISSINGNESTEDKEYSMSG']._serialized_end=24608 + _globals['_REGISTRYRESPONSEEXTRANESTEDKEYS']._serialized_start=24610 + _globals['_REGISTRYRESPONSEEXTRANESTEDKEYS']._serialized_end=24661 + _globals['_REGISTRYRESPONSEEXTRANESTEDKEYSMSG']._serialized_start=24664 + _globals['_REGISTRYRESPONSEEXTRANESTEDKEYSMSG']._serialized_end=24798 + _globals['_DEPSSETDOWNLOADDIRECTORY']._serialized_start=24800 + _globals['_DEPSSETDOWNLOADDIRECTORY']._serialized_end=24840 + _globals['_DEPSSETDOWNLOADDIRECTORYMSG']._serialized_start=24842 + _globals['_DEPSSETDOWNLOADDIRECTORYMSG']._serialized_end=24962 + _globals['_DEPSUNPINNED']._serialized_start=24964 + _globals['_DEPSUNPINNED']._serialized_end=25009 + _globals['_DEPSUNPINNEDMSG']._serialized_start=25011 + _globals['_DEPSUNPINNEDMSG']._serialized_end=25107 + _globals['_NONODESFORSELECTIONCRITERIA']._serialized_start=25109 + _globals['_NONODESFORSELECTIONCRITERIA']._serialized_end=25156 + _globals['_NONODESFORSELECTIONCRITERIAMSG']._serialized_start=25158 + _globals['_NONODESFORSELECTIONCRITERIAMSG']._serialized_end=25284 + _globals['_PUBLICATIONARTIFACTAVAILABLE']._serialized_start=25286 + _globals['_PUBLICATIONARTIFACTAVAILABLE']._serialized_end=25363 + _globals['_PUBLICATIONARTIFACTAVAILABLEMSG']._serialized_start=25366 + _globals['_PUBLICATIONARTIFACTAVAILABLEMSG']._serialized_end=25494 + _globals['_RUNNINGOPERATIONCAUGHTERROR']._serialized_start=25496 + _globals['_RUNNINGOPERATIONCAUGHTERROR']._serialized_end=25538 + _globals['_RUNNINGOPERATIONCAUGHTERRORMSG']._serialized_start=25540 + _globals['_RUNNINGOPERATIONCAUGHTERRORMSG']._serialized_end=25666 + _globals['_COMPILECOMPLETE']._serialized_start=25668 + _globals['_COMPILECOMPLETE']._serialized_end=25685 + _globals['_COMPILECOMPLETEMSG']._serialized_start=25687 + _globals['_COMPILECOMPLETEMSG']._serialized_end=25789 + _globals['_FRESHNESSCHECKCOMPLETE']._serialized_start=25791 + _globals['_FRESHNESSCHECKCOMPLETE']._serialized_end=25815 + _globals['_FRESHNESSCHECKCOMPLETEMSG']._serialized_start=25817 + _globals['_FRESHNESSCHECKCOMPLETEMSG']._serialized_end=25933 + _globals['_SEEDHEADER']._serialized_start=25935 + _globals['_SEEDHEADER']._serialized_end=25963 + _globals['_SEEDHEADERMSG']._serialized_start=25965 + _globals['_SEEDHEADERMSG']._serialized_end=26057 + _globals['_SQLRUNNEREXCEPTION']._serialized_start=26059 + _globals['_SQLRUNNEREXCEPTION']._serialized_end=26110 + _globals['_SQLRUNNEREXCEPTIONMSG']._serialized_start=26112 + _globals['_SQLRUNNEREXCEPTIONMSG']._serialized_end=26220 + _globals['_LOGTESTRESULT']._serialized_start=26223 + _globals['_LOGTESTRESULT']._serialized_end=26391 + _globals['_LOGTESTRESULTMSG']._serialized_start=26393 + _globals['_LOGTESTRESULTMSG']._serialized_end=26491 + _globals['_LOGSTARTLINE']._serialized_start=26493 + _globals['_LOGSTARTLINE']._serialized_end=26600 + _globals['_LOGSTARTLINEMSG']._serialized_start=26602 + _globals['_LOGSTARTLINEMSG']._serialized_end=26698 + _globals['_LOGMODELRESULT']._serialized_start=26701 + _globals['_LOGMODELRESULT']._serialized_end=26850 + _globals['_LOGMODELRESULTMSG']._serialized_start=26852 + _globals['_LOGMODELRESULTMSG']._serialized_end=26952 + _globals['_LOGSNAPSHOTRESULT']._serialized_start=26955 + _globals['_LOGSNAPSHOTRESULT']._serialized_end=27205 + _globals['_LOGSNAPSHOTRESULT_CFGENTRY']._serialized_start=27163 + _globals['_LOGSNAPSHOTRESULT_CFGENTRY']._serialized_end=27205 + _globals['_LOGSNAPSHOTRESULTMSG']._serialized_start=27207 + _globals['_LOGSNAPSHOTRESULTMSG']._serialized_end=27313 + _globals['_LOGSEEDRESULT']._serialized_start=27316 + _globals['_LOGSEEDRESULT']._serialized_end=27501 + _globals['_LOGSEEDRESULTMSG']._serialized_start=27503 + _globals['_LOGSEEDRESULTMSG']._serialized_end=27601 + _globals['_LOGFRESHNESSRESULT']._serialized_start=27604 + _globals['_LOGFRESHNESSRESULT']._serialized_end=27777 + _globals['_LOGFRESHNESSRESULTMSG']._serialized_start=27779 + _globals['_LOGFRESHNESSRESULTMSG']._serialized_end=27887 + _globals['_LOGCANCELLINE']._serialized_start=27889 + _globals['_LOGCANCELLINE']._serialized_end=27923 + _globals['_LOGCANCELLINEMSG']._serialized_start=27925 + _globals['_LOGCANCELLINEMSG']._serialized_end=28023 + _globals['_DEFAULTSELECTOR']._serialized_start=28025 + _globals['_DEFAULTSELECTOR']._serialized_end=28056 + _globals['_DEFAULTSELECTORMSG']._serialized_start=28058 + _globals['_DEFAULTSELECTORMSG']._serialized_end=28160 + _globals['_NODESTART']._serialized_start=28162 + _globals['_NODESTART']._serialized_end=28215 + _globals['_NODESTARTMSG']._serialized_start=28217 + _globals['_NODESTARTMSG']._serialized_end=28307 + _globals['_NODEFINISHED']._serialized_start=28309 + _globals['_NODEFINISHED']._serialized_end=28412 + _globals['_NODEFINISHEDMSG']._serialized_start=28414 + _globals['_NODEFINISHEDMSG']._serialized_end=28510 + _globals['_QUERYCANCELATIONUNSUPPORTED']._serialized_start=28512 + _globals['_QUERYCANCELATIONUNSUPPORTED']._serialized_end=28555 + _globals['_QUERYCANCELATIONUNSUPPORTEDMSG']._serialized_start=28557 + _globals['_QUERYCANCELATIONUNSUPPORTEDMSG']._serialized_end=28683 + _globals['_CONCURRENCYLINE']._serialized_start=28685 + _globals['_CONCURRENCYLINE']._serialized_end=28764 + _globals['_CONCURRENCYLINEMSG']._serialized_start=28766 + _globals['_CONCURRENCYLINEMSG']._serialized_end=28868 + _globals['_WRITINGINJECTEDSQLFORNODE']._serialized_start=28870 + _globals['_WRITINGINJECTEDSQLFORNODE']._serialized_end=28939 + _globals['_WRITINGINJECTEDSQLFORNODEMSG']._serialized_start=28941 + _globals['_WRITINGINJECTEDSQLFORNODEMSG']._serialized_end=29063 + _globals['_NODECOMPILING']._serialized_start=29065 + _globals['_NODECOMPILING']._serialized_end=29122 + _globals['_NODECOMPILINGMSG']._serialized_start=29124 + _globals['_NODECOMPILINGMSG']._serialized_end=29222 + _globals['_NODEEXECUTING']._serialized_start=29224 + _globals['_NODEEXECUTING']._serialized_end=29281 + _globals['_NODEEXECUTINGMSG']._serialized_start=29283 + _globals['_NODEEXECUTINGMSG']._serialized_end=29381 + _globals['_LOGHOOKSTARTLINE']._serialized_start=29383 + _globals['_LOGHOOKSTARTLINE']._serialized_end=29492 + _globals['_LOGHOOKSTARTLINEMSG']._serialized_start=29494 + _globals['_LOGHOOKSTARTLINEMSG']._serialized_end=29598 + _globals['_LOGHOOKENDLINE']._serialized_start=29601 + _globals['_LOGHOOKENDLINE']._serialized_end=29748 + _globals['_LOGHOOKENDLINEMSG']._serialized_start=29750 + _globals['_LOGHOOKENDLINEMSG']._serialized_end=29850 + _globals['_SKIPPINGDETAILS']._serialized_start=29853 + _globals['_SKIPPINGDETAILS']._serialized_end=30000 + _globals['_SKIPPINGDETAILSMSG']._serialized_start=30002 + _globals['_SKIPPINGDETAILSMSG']._serialized_end=30104 + _globals['_NOTHINGTODO']._serialized_start=30106 + _globals['_NOTHINGTODO']._serialized_end=30119 + _globals['_NOTHINGTODOMSG']._serialized_start=30121 + _globals['_NOTHINGTODOMSG']._serialized_end=30215 + _globals['_RUNNINGOPERATIONUNCAUGHTERROR']._serialized_start=30217 + _globals['_RUNNINGOPERATIONUNCAUGHTERROR']._serialized_end=30261 + _globals['_RUNNINGOPERATIONUNCAUGHTERRORMSG']._serialized_start=30264 + _globals['_RUNNINGOPERATIONUNCAUGHTERRORMSG']._serialized_end=30394 + _globals['_ENDRUNRESULT']._serialized_start=30397 + _globals['_ENDRUNRESULT']._serialized_end=30544 + _globals['_ENDRUNRESULTMSG']._serialized_start=30546 + _globals['_ENDRUNRESULTMSG']._serialized_end=30642 + _globals['_NONODESSELECTED']._serialized_start=30644 + _globals['_NONODESSELECTED']._serialized_end=30661 + _globals['_NONODESSELECTEDMSG']._serialized_start=30663 + _globals['_NONODESSELECTEDMSG']._serialized_end=30765 + _globals['_COMMANDCOMPLETED']._serialized_start=30767 + _globals['_COMMANDCOMPLETED']._serialized_end=30886 + _globals['_COMMANDCOMPLETEDMSG']._serialized_start=30888 + _globals['_COMMANDCOMPLETEDMSG']._serialized_end=30992 + _globals['_SHOWNODE']._serialized_start=30994 + _globals['_SHOWNODE']._serialized_end=31101 + _globals['_SHOWNODEMSG']._serialized_start=31103 + _globals['_SHOWNODEMSG']._serialized_end=31191 + _globals['_COMPILEDNODE']._serialized_start=31193 + _globals['_COMPILEDNODE']._serialized_end=31305 + _globals['_COMPILEDNODEMSG']._serialized_start=31307 + _globals['_COMPILEDNODEMSG']._serialized_end=31403 + _globals['_CATCHABLEEXCEPTIONONRUN']._serialized_start=31405 + _globals['_CATCHABLEEXCEPTIONONRUN']._serialized_end=31503 + _globals['_CATCHABLEEXCEPTIONONRUNMSG']._serialized_start=31505 + _globals['_CATCHABLEEXCEPTIONONRUNMSG']._serialized_end=31623 + _globals['_INTERNALERRORONRUN']._serialized_start=31625 + _globals['_INTERNALERRORONRUN']._serialized_end=31678 + _globals['_INTERNALERRORONRUNMSG']._serialized_start=31680 + _globals['_INTERNALERRORONRUNMSG']._serialized_end=31788 + _globals['_GENERICEXCEPTIONONRUN']._serialized_start=31790 + _globals['_GENERICEXCEPTIONONRUN']._serialized_end=31865 + _globals['_GENERICEXCEPTIONONRUNMSG']._serialized_start=31867 + _globals['_GENERICEXCEPTIONONRUNMSG']._serialized_end=31981 + _globals['_NODECONNECTIONRELEASEERROR']._serialized_start=31983 + _globals['_NODECONNECTIONRELEASEERROR']._serialized_end=32061 + _globals['_NODECONNECTIONRELEASEERRORMSG']._serialized_start=32063 + _globals['_NODECONNECTIONRELEASEERRORMSG']._serialized_end=32187 + _globals['_FOUNDSTATS']._serialized_start=32189 + _globals['_FOUNDSTATS']._serialized_end=32220 + _globals['_FOUNDSTATSMSG']._serialized_start=32222 + _globals['_FOUNDSTATSMSG']._serialized_end=32314 + _globals['_MAINKEYBOARDINTERRUPT']._serialized_start=32316 + _globals['_MAINKEYBOARDINTERRUPT']._serialized_end=32339 + _globals['_MAINKEYBOARDINTERRUPTMSG']._serialized_start=32341 + _globals['_MAINKEYBOARDINTERRUPTMSG']._serialized_end=32455 + _globals['_MAINENCOUNTEREDERROR']._serialized_start=32457 + _globals['_MAINENCOUNTEREDERROR']._serialized_end=32492 + _globals['_MAINENCOUNTEREDERRORMSG']._serialized_start=32494 + _globals['_MAINENCOUNTEREDERRORMSG']._serialized_end=32606 + _globals['_MAINSTACKTRACE']._serialized_start=32608 + _globals['_MAINSTACKTRACE']._serialized_end=32645 + _globals['_MAINSTACKTRACEMSG']._serialized_start=32647 + _globals['_MAINSTACKTRACEMSG']._serialized_end=32747 + _globals['_SYSTEMCOULDNOTWRITE']._serialized_start=32749 + _globals['_SYSTEMCOULDNOTWRITE']._serialized_end=32813 + _globals['_SYSTEMCOULDNOTWRITEMSG']._serialized_start=32815 + _globals['_SYSTEMCOULDNOTWRITEMSG']._serialized_end=32925 + _globals['_SYSTEMEXECUTINGCMD']._serialized_start=32927 + _globals['_SYSTEMEXECUTINGCMD']._serialized_end=32960 + _globals['_SYSTEMEXECUTINGCMDMSG']._serialized_start=32962 + _globals['_SYSTEMEXECUTINGCMDMSG']._serialized_end=33070 + _globals['_SYSTEMSTDOUT']._serialized_start=33072 + _globals['_SYSTEMSTDOUT']._serialized_end=33100 + _globals['_SYSTEMSTDOUTMSG']._serialized_start=33102 + _globals['_SYSTEMSTDOUTMSG']._serialized_end=33198 + _globals['_SYSTEMSTDERR']._serialized_start=33200 + _globals['_SYSTEMSTDERR']._serialized_end=33228 + _globals['_SYSTEMSTDERRMSG']._serialized_start=33230 + _globals['_SYSTEMSTDERRMSG']._serialized_end=33326 + _globals['_SYSTEMREPORTRETURNCODE']._serialized_start=33328 + _globals['_SYSTEMREPORTRETURNCODE']._serialized_end=33372 + _globals['_SYSTEMREPORTRETURNCODEMSG']._serialized_start=33374 + _globals['_SYSTEMREPORTRETURNCODEMSG']._serialized_end=33490 + _globals['_TIMINGINFOCOLLECTED']._serialized_start=33492 + _globals['_TIMINGINFOCOLLECTED']._serialized_end=33604 + _globals['_TIMINGINFOCOLLECTEDMSG']._serialized_start=33606 + _globals['_TIMINGINFOCOLLECTEDMSG']._serialized_end=33716 + _globals['_LOGDEBUGSTACKTRACE']._serialized_start=33718 + _globals['_LOGDEBUGSTACKTRACE']._serialized_end=33756 + _globals['_LOGDEBUGSTACKTRACEMSG']._serialized_start=33758 + _globals['_LOGDEBUGSTACKTRACEMSG']._serialized_end=33866 + _globals['_CHECKCLEANPATH']._serialized_start=33868 + _globals['_CHECKCLEANPATH']._serialized_end=33898 + _globals['_CHECKCLEANPATHMSG']._serialized_start=33900 + _globals['_CHECKCLEANPATHMSG']._serialized_end=34000 + _globals['_CONFIRMCLEANPATH']._serialized_start=34002 + _globals['_CONFIRMCLEANPATH']._serialized_end=34034 + _globals['_CONFIRMCLEANPATHMSG']._serialized_start=34036 + _globals['_CONFIRMCLEANPATHMSG']._serialized_end=34140 + _globals['_PROTECTEDCLEANPATH']._serialized_start=34142 + _globals['_PROTECTEDCLEANPATH']._serialized_end=34176 + _globals['_PROTECTEDCLEANPATHMSG']._serialized_start=34178 + _globals['_PROTECTEDCLEANPATHMSG']._serialized_end=34286 + _globals['_FINISHEDCLEANPATHS']._serialized_start=34288 + _globals['_FINISHEDCLEANPATHS']._serialized_end=34308 + _globals['_FINISHEDCLEANPATHSMSG']._serialized_start=34310 + _globals['_FINISHEDCLEANPATHSMSG']._serialized_end=34418 + _globals['_OPENCOMMAND']._serialized_start=34420 + _globals['_OPENCOMMAND']._serialized_end=34473 + _globals['_OPENCOMMANDMSG']._serialized_start=34475 + _globals['_OPENCOMMANDMSG']._serialized_end=34569 + _globals['_FORMATTING']._serialized_start=34571 + _globals['_FORMATTING']._serialized_end=34596 + _globals['_FORMATTINGMSG']._serialized_start=34598 + _globals['_FORMATTINGMSG']._serialized_end=34690 + _globals['_SERVINGDOCSPORT']._serialized_start=34692 + _globals['_SERVINGDOCSPORT']._serialized_end=34740 + _globals['_SERVINGDOCSPORTMSG']._serialized_start=34742 + _globals['_SERVINGDOCSPORTMSG']._serialized_end=34844 + _globals['_SERVINGDOCSACCESSINFO']._serialized_start=34846 + _globals['_SERVINGDOCSACCESSINFO']._serialized_end=34883 + _globals['_SERVINGDOCSACCESSINFOMSG']._serialized_start=34885 + _globals['_SERVINGDOCSACCESSINFOMSG']._serialized_end=34999 + _globals['_SERVINGDOCSEXITINFO']._serialized_start=35001 + _globals['_SERVINGDOCSEXITINFO']._serialized_end=35022 + _globals['_SERVINGDOCSEXITINFOMSG']._serialized_start=35024 + _globals['_SERVINGDOCSEXITINFOMSG']._serialized_end=35134 + _globals['_RUNRESULTWARNING']._serialized_start=35136 + _globals['_RUNRESULTWARNING']._serialized_end=35210 + _globals['_RUNRESULTWARNINGMSG']._serialized_start=35212 + _globals['_RUNRESULTWARNINGMSG']._serialized_end=35316 + _globals['_RUNRESULTFAILURE']._serialized_start=35318 + _globals['_RUNRESULTFAILURE']._serialized_end=35392 + _globals['_RUNRESULTFAILUREMSG']._serialized_start=35394 + _globals['_RUNRESULTFAILUREMSG']._serialized_end=35498 + _globals['_STATSLINE']._serialized_start=35500 + _globals['_STATSLINE']._serialized_end=35607 + _globals['_STATSLINE_STATSENTRY']._serialized_start=35563 + _globals['_STATSLINE_STATSENTRY']._serialized_end=35607 + _globals['_STATSLINEMSG']._serialized_start=35609 + _globals['_STATSLINEMSG']._serialized_end=35699 + _globals['_RUNRESULTERROR']._serialized_start=35701 + _globals['_RUNRESULTERROR']._serialized_end=35730 + _globals['_RUNRESULTERRORMSG']._serialized_start=35732 + _globals['_RUNRESULTERRORMSG']._serialized_end=35832 + _globals['_RUNRESULTERRORNOMESSAGE']._serialized_start=35834 + _globals['_RUNRESULTERRORNOMESSAGE']._serialized_end=35875 + _globals['_RUNRESULTERRORNOMESSAGEMSG']._serialized_start=35877 + _globals['_RUNRESULTERRORNOMESSAGEMSG']._serialized_end=35995 + _globals['_SQLCOMPILEDPATH']._serialized_start=35997 + _globals['_SQLCOMPILEDPATH']._serialized_end=36028 + _globals['_SQLCOMPILEDPATHMSG']._serialized_start=36030 + _globals['_SQLCOMPILEDPATHMSG']._serialized_end=36132 + _globals['_CHECKNODETESTFAILURE']._serialized_start=36134 + _globals['_CHECKNODETESTFAILURE']._serialized_end=36179 + _globals['_CHECKNODETESTFAILUREMSG']._serialized_start=36181 + _globals['_CHECKNODETESTFAILUREMSG']._serialized_end=36293 + _globals['_FIRSTRUNRESULTERROR']._serialized_start=36295 + _globals['_FIRSTRUNRESULTERROR']._serialized_end=36329 + _globals['_FIRSTRUNRESULTERRORMSG']._serialized_start=36331 + _globals['_FIRSTRUNRESULTERRORMSG']._serialized_end=36441 + _globals['_AFTERFIRSTRUNRESULTERROR']._serialized_start=36443 + _globals['_AFTERFIRSTRUNRESULTERROR']._serialized_end=36482 + _globals['_AFTERFIRSTRUNRESULTERRORMSG']._serialized_start=36484 + _globals['_AFTERFIRSTRUNRESULTERRORMSG']._serialized_end=36604 + _globals['_ENDOFRUNSUMMARY']._serialized_start=36606 + _globals['_ENDOFRUNSUMMARY']._serialized_end=36693 + _globals['_ENDOFRUNSUMMARYMSG']._serialized_start=36695 + _globals['_ENDOFRUNSUMMARYMSG']._serialized_end=36797 + _globals['_LOGSKIPBECAUSEERROR']._serialized_start=36799 + _globals['_LOGSKIPBECAUSEERROR']._serialized_end=36884 + _globals['_LOGSKIPBECAUSEERRORMSG']._serialized_start=36886 + _globals['_LOGSKIPBECAUSEERRORMSG']._serialized_end=36996 + _globals['_ENSUREGITINSTALLED']._serialized_start=36998 + _globals['_ENSUREGITINSTALLED']._serialized_end=37018 + _globals['_ENSUREGITINSTALLEDMSG']._serialized_start=37020 + _globals['_ENSUREGITINSTALLEDMSG']._serialized_end=37128 + _globals['_DEPSCREATINGLOCALSYMLINK']._serialized_start=37130 + _globals['_DEPSCREATINGLOCALSYMLINK']._serialized_end=37156 + _globals['_DEPSCREATINGLOCALSYMLINKMSG']._serialized_start=37158 + _globals['_DEPSCREATINGLOCALSYMLINKMSG']._serialized_end=37278 + _globals['_DEPSSYMLINKNOTAVAILABLE']._serialized_start=37280 + _globals['_DEPSSYMLINKNOTAVAILABLE']._serialized_end=37305 + _globals['_DEPSSYMLINKNOTAVAILABLEMSG']._serialized_start=37307 + _globals['_DEPSSYMLINKNOTAVAILABLEMSG']._serialized_end=37425 + _globals['_DISABLETRACKING']._serialized_start=37427 + _globals['_DISABLETRACKING']._serialized_end=37444 + _globals['_DISABLETRACKINGMSG']._serialized_start=37446 + _globals['_DISABLETRACKINGMSG']._serialized_end=37548 + _globals['_SENDINGEVENT']._serialized_start=37550 + _globals['_SENDINGEVENT']._serialized_end=37580 + _globals['_SENDINGEVENTMSG']._serialized_start=37582 + _globals['_SENDINGEVENTMSG']._serialized_end=37678 + _globals['_SENDEVENTFAILURE']._serialized_start=37680 + _globals['_SENDEVENTFAILURE']._serialized_end=37698 + _globals['_SENDEVENTFAILUREMSG']._serialized_start=37700 + _globals['_SENDEVENTFAILUREMSG']._serialized_end=37804 + _globals['_FLUSHEVENTS']._serialized_start=37806 + _globals['_FLUSHEVENTS']._serialized_end=37819 + _globals['_FLUSHEVENTSMSG']._serialized_start=37821 + _globals['_FLUSHEVENTSMSG']._serialized_end=37915 + _globals['_FLUSHEVENTSFAILURE']._serialized_start=37917 + _globals['_FLUSHEVENTSFAILURE']._serialized_end=37937 + _globals['_FLUSHEVENTSFAILUREMSG']._serialized_start=37939 + _globals['_FLUSHEVENTSFAILUREMSG']._serialized_end=38047 + _globals['_TRACKINGINITIALIZEFAILURE']._serialized_start=38049 + _globals['_TRACKINGINITIALIZEFAILURE']._serialized_end=38094 + _globals['_TRACKINGINITIALIZEFAILUREMSG']._serialized_start=38096 + _globals['_TRACKINGINITIALIZEFAILUREMSG']._serialized_end=38218 + _globals['_RUNRESULTWARNINGMESSAGE']._serialized_start=38220 + _globals['_RUNRESULTWARNINGMESSAGE']._serialized_end=38258 + _globals['_RUNRESULTWARNINGMESSAGEMSG']._serialized_start=38260 + _globals['_RUNRESULTWARNINGMESSAGEMSG']._serialized_end=38378 + _globals['_DEBUGCMDOUT']._serialized_start=38380 + _globals['_DEBUGCMDOUT']._serialized_end=38406 + _globals['_DEBUGCMDOUTMSG']._serialized_start=38408 + _globals['_DEBUGCMDOUTMSG']._serialized_end=38502 + _globals['_DEBUGCMDRESULT']._serialized_start=38504 + _globals['_DEBUGCMDRESULT']._serialized_end=38533 + _globals['_DEBUGCMDRESULTMSG']._serialized_start=38535 + _globals['_DEBUGCMDRESULTMSG']._serialized_end=38635 + _globals['_LISTCMDOUT']._serialized_start=38637 + _globals['_LISTCMDOUT']._serialized_end=38662 + _globals['_LISTCMDOUTMSG']._serialized_start=38664 + _globals['_LISTCMDOUTMSG']._serialized_end=38756 + _globals['_NOTE']._serialized_start=38758 + _globals['_NOTE']._serialized_end=38777 + _globals['_NOTEMSG']._serialized_start=38779 + _globals['_NOTEMSG']._serialized_end=38859 # @@protoc_insertion_point(module_scope) diff --git a/tests/unit/test_events.py b/tests/unit/test_events.py index 3e65fbc793c..2ff2c8856eb 100644 --- a/tests/unit/test_events.py +++ b/tests/unit/test_events.py @@ -139,6 +139,7 @@ def test_event_codes(self): types.AdapterEventInfo(), types.AdapterEventWarning(), types.AdapterEventError(), + types.AdapterRegistered(adapter_name="dbt-awesome", adapter_version="1.2.3"), types.NewConnection(conn_type="", conn_name=""), types.ConnectionReused(conn_name=""), types.ConnectionLeftOpenInCleanup(conn_name=""),