diff --git a/core/dbt/artifacts/resources/__init__.py b/core/dbt/artifacts/resources/__init__.py index e7c97147b06..5b4a42ac25b 100644 --- a/core/dbt/artifacts/resources/__init__.py +++ b/core/dbt/artifacts/resources/__init__.py @@ -2,3 +2,5 @@ # alias to latest resource definitions from dbt.artifacts.resources.v1.documentation import Documentation +from dbt.artifacts.resources.v1.macro import Macro, MacroDependsOn, MacroArgument +from dbt.artifacts.resources.v1.docs import Docs diff --git a/core/dbt/artifacts/resources/v1/docs.py b/core/dbt/artifacts/resources/v1/docs.py new file mode 100644 index 00000000000..5dca7a88421 --- /dev/null +++ b/core/dbt/artifacts/resources/v1/docs.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass +from dbt_common.dataclass_schema import dbtClassMixin +from dbt_common.contracts.util import Replaceable +from typing import Optional + + +@dataclass +class Docs(dbtClassMixin, Replaceable): + show: bool = True + node_color: Optional[str] = None diff --git a/core/dbt/artifacts/resources/v1/macro.py b/core/dbt/artifacts/resources/v1/macro.py new file mode 100644 index 00000000000..26f37719643 --- /dev/null +++ b/core/dbt/artifacts/resources/v1/macro.py @@ -0,0 +1,40 @@ +from dataclasses import dataclass, field +import time +from typing import Literal, List, Dict, Optional, Any + +from dbt_common.contracts.util import Replaceable +from dbt_common.dataclass_schema import dbtClassMixin +from dbt.artifacts.resources.base import BaseArtifactNode +from dbt.artifacts.resources.types import NodeType, ModelLanguage +from dbt.artifacts.resources.v1.docs import Docs + + +@dataclass +class MacroArgument(dbtClassMixin): + name: str + type: Optional[str] = None + description: str = "" + + +@dataclass +class MacroDependsOn(dbtClassMixin, Replaceable): + macros: List[str] = field(default_factory=list) + + # 'in' on lists is O(n) so this is O(n^2) for # of macros + def add_macro(self, value: str): + if value not in self.macros: + self.macros.append(value) + + +@dataclass +class Macro(BaseArtifactNode): + macro_sql: str + resource_type: Literal[NodeType.Macro] + depends_on: MacroDependsOn = field(default_factory=MacroDependsOn) + description: str = "" + meta: Dict[str, Any] = field(default_factory=dict) + docs: Docs = field(default_factory=Docs) + patch_path: Optional[str] = None + arguments: List[MacroArgument] = field(default_factory=list) + created_at: float = field(default_factory=lambda: time.time()) + supported_languages: Optional[List[ModelLanguage]] = None diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 9b93e995cff..a335bd59d9b 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -27,12 +27,10 @@ ) from dbt.contracts.graph.unparsed import ( ConstantPropertyInput, - Docs, ExposureType, ExternalTable, FreshnessThreshold, HasYamlMetadata, - MacroArgument, MaturityType, Owner, Quoting, @@ -61,7 +59,6 @@ from dbt_common.events.contextvars import set_log_contextvars from dbt.flags import get_flags from dbt.node_types import ( - ModelLanguage, NodeType, AccessType, REFABLE_NODE_TYPES, @@ -97,7 +94,14 @@ SavedQueryConfig, ) -from dbt.artifacts.resources import BaseArtifactNode, Documentation as DocumentationContract +from dbt.artifacts.resources import ( + BaseArtifactNode, + Docs, + MacroDependsOn, + MacroArgument, + Documentation as DocumentationResource, + Macro as MacroResource, +) # ===================================================================== @@ -240,18 +244,6 @@ def quoting_dict(self) -> Dict[str, bool]: return {} -@dataclass -class MacroDependsOn(dbtClassMixin, Replaceable): - """Used only in the Macro class""" - - macros: List[str] = field(default_factory=list) - - # 'in' on lists is O(n) so this is O(n^2) for # of macros - def add_macro(self, value: str): - if value not in self.macros: - self.macros.append(value) - - @dataclass class DeferRelation(HasRelationMetadata): alias: str @@ -1149,18 +1141,7 @@ class SnapshotNode(CompiledNode): @dataclass -class Macro(BaseNode): - macro_sql: str - resource_type: Literal[NodeType.Macro] - depends_on: MacroDependsOn = field(default_factory=MacroDependsOn) - description: str = "" - meta: Dict[str, Any] = field(default_factory=dict) - docs: Docs = field(default_factory=Docs) - patch_path: Optional[str] = None - arguments: List[MacroArgument] = field(default_factory=list) - created_at: float = field(default_factory=lambda: time.time()) - supported_languages: Optional[List[ModelLanguage]] = None - +class Macro(MacroResource, BaseNode): def same_contents(self, other: Optional["Macro"]) -> bool: if other is None: return False @@ -1179,7 +1160,7 @@ def depends_on_macros(self): @dataclass -class Documentation(DocumentationContract, BaseNode): +class Documentation(DocumentationResource, BaseNode): @property def search_name(self): return self.name diff --git a/core/dbt/contracts/graph/unparsed.py b/core/dbt/contracts/graph/unparsed.py index 5f355635872..b17a2912432 100644 --- a/core/dbt/contracts/graph/unparsed.py +++ b/core/dbt/contracts/graph/unparsed.py @@ -29,6 +29,7 @@ from dbt.exceptions import ParsingError from dbt_semantic_interfaces.type_enums import ConversionCalculationType +from dbt.artifacts.resources import Docs, MacroArgument from dataclasses import dataclass, field from datetime import timedelta @@ -83,12 +84,6 @@ class UnparsedRunHook(UnparsedNode): index: Optional[int] = None -@dataclass -class Docs(dbtClassMixin, Replaceable): - show: bool = True - node_color: Optional[str] = None - - @dataclass class HasColumnProps(AdditionalPropertiesMixin, ExtensibleDbtClassMixin, Replaceable): name: str @@ -266,13 +261,6 @@ def get_tests_for_version(self, version: NodeVersion) -> List[TestDef]: ) -@dataclass -class MacroArgument(dbtClassMixin): - name: str - type: Optional[str] = None - description: str = "" - - @dataclass class UnparsedMacroUpdate(HasConfig, HasColumnProps, HasYamlMetadata): arguments: List[MacroArgument] = field(default_factory=list)