dbt-selly/dbt-env/lib/python3.8/site-packages/dbt/context/docs.py

87 lines
2.4 KiB
Python
Raw Normal View History

2022-03-22 15:13:27 +00:00
from typing import (
Any, Dict, Union
)
from dbt.exceptions import (
doc_invalid_args,
doc_target_not_found,
)
from dbt.config.runtime import RuntimeConfig
from dbt.contracts.graph.compiled import CompileResultNode
from dbt.contracts.graph.manifest import Manifest
from dbt.contracts.graph.parsed import ParsedMacro
from dbt.context.base import contextmember
from dbt.context.configured import SchemaYamlContext
class DocsRuntimeContext(SchemaYamlContext):
def __init__(
self,
config: RuntimeConfig,
node: Union[ParsedMacro, CompileResultNode],
manifest: Manifest,
current_project: str,
) -> None:
super().__init__(config, current_project)
self.node = node
self.manifest = manifest
@contextmember
def doc(self, *args: str) -> str:
"""The `doc` function is used to reference docs blocks in schema.yml
files. It is analogous to the `ref` function. For more information,
consult the Documentation guide.
> orders.md:
{% docs orders %}
# docs
- go
- here
{% enddocs %}
> schema.yml
version: 2
models:
- name: orders
description: "{{ doc('orders') }}"
"""
# when you call doc(), this is what happens at runtime
if len(args) == 1:
doc_package_name = None
doc_name = args[0]
elif len(args) == 2:
doc_package_name, doc_name = args
else:
doc_invalid_args(self.node, args)
# ParsedDocumentation
target_doc = self.manifest.resolve_doc(
doc_name,
doc_package_name,
self._project_name,
self.node.package_name,
)
if target_doc:
file_id = target_doc.file_id
if file_id in self.manifest.files:
source_file = self.manifest.files[file_id]
source_file.add_node(self.node.unique_id)
else:
doc_target_not_found(self.node, doc_name, doc_package_name)
return target_doc.block_contents
def generate_runtime_docs(
config: RuntimeConfig,
target: Any,
manifest: Manifest,
current_project: str,
) -> Dict[str, Any]:
ctx = DocsRuntimeContext(config, target, manifest, current_project)
# This is not a Mashumaro to_dict call
return ctx.to_dict()