def _impl(cls: Type[pydantic.BaseModel], values: RootValidatorValuesType) -> RootValidatorValuesType: class SymtableValidator(NodeVisitor): def __init__(self) -> None: self.missing_symbols: List[str] = [] def visit_Node(self, node: Node, *, symtable: Dict[str, Any], **kwargs: Any) -> None: for name, metadata in node.__node_children__.items(): if isinstance(metadata["definition"].type_, type) and issubclass( metadata["definition"].type_, SymbolRef): if getattr(node, name) not in symtable: self.missing_symbols.append(getattr(node, name)) if isinstance(node, SymbolTableTrait): symtable = {**symtable, **node.symtable_} self.generic_visit(node, symtable=symtable, **kwargs) @classmethod def apply(cls, node: Node, *, symtable: Dict[str, Any]) -> List[str]: instance = cls() instance.visit(node, symtable=symtable) return instance.missing_symbols missing_symbols = [] for v in values.values(): missing_symbols.extend( SymtableValidator.apply(v, symtable=values["symtable_"])) if len(missing_symbols) > 0: raise ValueError("Symbols {} not found.".format(missing_symbols)) return values
def _impl(cls: Type[pydantic.BaseModel], values: RootValidatorValuesType) -> RootValidatorValuesType: dtype_nodes: List[Node] = [] for v in flatten_list(values.values()): if isinstance(v, Node): dtype_nodes.extend(v.iter_tree().if_hasattr("dtype")) nodes_without_dtype = [] for node in dtype_nodes: if not node.dtype: nodes_without_dtype.append(node) if len(nodes_without_dtype) > 0: raise ValueError( "Nodes without dtype detected {}".format(nodes_without_dtype)) return values