@propertydefchild_modules(self)->list[RunwayModuleDefinition]:"""List of child modules."""return[RunwayModuleDefinition(child)forchildinself._data.parallel]@child_modules.setterdefchild_modules(self,modules:list[RunwayModuleDefinition|RunwayModuleDefinitionModel],)->None:"""Set the value of the property. Args: modules: A list of modules. Raises: TypeError: The provided value does not match the required types. """ifnotisinstance(modules,list):# type: ignoreraiseTypeError(f"expected list[RunwayModuleDefinition]; got {type(modules)}")sanitized:list[RunwayModuleDefinitionModel]=[]fori,modinenumerate(modules):ifisinstance(mod,RunwayModuleDefinition):sanitized.append(RunwayModuleDefinitionModel.model_validate(mod.data))elifisinstance(mod,RunwayModuleDefinitionModel):# type: ignoresanitized.append(mod)else:raiseTypeError(f"{self.name}.parallel[{i}] is type {type(mod)}; ""expected type RunwayModuleDefinition or RunwayModuleDefinitionModel")self._data.parallel=sanitized@propertydefis_parent(self)->bool:"""Assess if the modules contains child modules (e.g. run in parallel)."""returnbool(self._data.parallel)@propertydefmenu_entry(self)->str:"""Return menu entry representation of this module."""ifself.is_parent:returnf"{self.name} [{', '.join([c.menu_entryforcinself.child_modules])}]"returnself.name
[docs]defreverse(self)->None:"""Reverse the order of child/parallel modules."""self._data.parallel.reverse()
def_register_variable(self,var_name:str,var_value:Any)->None:"""Register a variable. Args: var_name: Name of the config field that can contain a variable lookup. var_value: Literal value supplied in the config to be resolved as a variable if it contains a lookup. """self._vars[var_name]=Variable(name=f"{self.name}.{var_name}",value=var_value,variable_type="runway")
[docs]@classmethoddefparse_obj(cls:type[Self],obj:object)->Self:"""Parse a python object into this class. Args: obj: The object to parse. """returncls(RunwayModuleDefinitionModel.model_validate(obj))