dbt-selly/dbt-env/lib/python3.8/site-packages/dbt/parser/rpc.py

62 lines
1.9 KiB
Python

import os
from dataclasses import dataclass
from typing import Iterable
from dbt.contracts.graph.manifest import SourceFile
from dbt.contracts.graph.parsed import ParsedRPCNode, ParsedMacro
from dbt.contracts.graph.unparsed import UnparsedMacro
from dbt.exceptions import InternalException
from dbt.node_types import NodeType
from dbt.parser.base import SimpleSQLParser
from dbt.parser.macros import MacroParser
from dbt.parser.search import FileBlock
@dataclass
class RPCBlock(FileBlock):
rpc_name: str
@property
def name(self):
return self.rpc_name
class RPCCallParser(SimpleSQLParser[ParsedRPCNode]):
def parse_from_dict(self, dct, validate=True) -> ParsedRPCNode:
if validate:
ParsedRPCNode.validate(dct)
return ParsedRPCNode.from_dict(dct)
@property
def resource_type(self) -> NodeType:
return NodeType.RPCCall
def get_compiled_path(cls, block: FileBlock):
# we do it this way to make mypy happy
if not isinstance(block, RPCBlock):
raise InternalException(
'While parsing RPC calls, got an actual file block instead of '
'an RPC block: {}'.format(block)
)
return os.path.join('rpc', block.name)
def parse_remote(self, sql: str, name: str) -> ParsedRPCNode:
source_file = SourceFile.remote(sql, self.project.project_name)
contents = RPCBlock(rpc_name=name, file=source_file)
return self.parse_node(contents)
class RPCMacroParser(MacroParser):
def parse_remote(self, contents) -> Iterable[ParsedMacro]:
base = UnparsedMacro(
path='from remote system',
original_file_path='from remote system',
package_name=self.project.project_name,
raw_sql=contents,
root_path=self.project.project_root,
resource_type=NodeType.Macro,
)
for node in self.parse_unparsed_macros(base):
yield node