rostran/core/outputs.py (77 lines of code) (raw):

from .exceptions import InvalidTemplateOutput, InvalidTemplateOutputs class Output: PROPERTIES = (VALUE, DESCRIPTION, CONDITION) = ( "Value", "Description", "Condition", ) def __init__( self, name, value, description=None, condition=None, orig_data: dict = None ): self.name = name self.value = value self.description = description self.condition = condition self.orig_data = orig_data @classmethod def initialize(cls, name: str, data: dict): if not isinstance(data, dict): raise InvalidTemplateOutput( name=name, reason=f"The type of data ({data}) should be dict" ) output = cls( name, value=data.get(cls.VALUE), description=data.get(cls.DESCRIPTION), condition=data.get(cls.CONDITION), orig_data=data, ) output.validate() return output def validate(self): if not isinstance(self.name, str): raise InvalidTemplateOutput( name=self.name, reason=f"The type should be str", ) if self.value is None: raise InvalidTemplateOutput( name=self.name, reason=f"The {self.VALUE} should not be empty", ) if self.condition is not None and not isinstance(self.condition, str): raise InvalidTemplateOutput( name=self.name, reason=f"The type of {self.CONDITION} should be str", ) def as_dict(self, format=False) -> dict: if not format and self.orig_data: data = {k: v for k, v in self.orig_data.items() if v is not None} else: data = {} if self.description is not None: data.update({self.DESCRIPTION: self.description}) if self.condition is not None: data.update({self.CONDITION: self.condition}) data[self.VALUE] = self.value return {self.name: data} class Outputs(dict): @classmethod def initialize(cls, data: dict): if not isinstance(data, dict): raise InvalidTemplateOutputs( reason=f"The type of data ({data}) should be dict" ) outputs = cls() for name, val in data.items(): output = Output.initialize(name, val) outputs.add(output) return outputs def add(self, output: Output): self[output.name] = output def as_dict(self, format=False) -> dict: data = {} for output in self.values(): output: Output data.update(output.as_dict(format)) return data