87 lines
2.4 KiB
Python
87 lines
2.4 KiB
Python
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()
|