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

62 lines
1.9 KiB
Python
Raw Normal View History

2022-03-22 15:13:27 +00:00
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