def bom(self): if not self._bom: self._bom = EntityElnBom(self.configs) self._bom.configure_motifs(self.ident) return self._bom
class EDAModulePrototypeBase(ModulePrototypeBase): @property def projectname(self): raise NotImplementedError @property def rprojfolder(self): return os.path.relpath(self.projfolder, PROJECTS_ROOT) @property def desc(self): return self.configs.description(self.ident) @property def configs(self): if not self._configs: self._configs = ConfigsFile(self.projfolder) return self._configs @property def bom(self): if not self._bom: self._bom = EntityElnBom(self.configs) self._bom.configure_motifs(self.ident) return self._bom @property def obom(self): if not self._obom: self._obom = self.bom.create_output_bom(configname=self.ident) return self._obom def _get_status(self): raise NotImplementedError @property def _psctx(self): ctx = copy(self._validation_context) ctx.locality = 'Strategy' return ctx @property def _pspol_doc_am(self): return ConfigOptionPolicy( context=self._psctx, path=('documentation', 'am'), options=[True, False], is_error=True, default=True ) @property def _pspol_testing(self): return ConfigOptionPolicy( context=self._psctx, path=('productionstrategy', 'testing'), options=['normal', 'lazy'], is_error=True, default='normal' ) @property def _pspol_labelling(self): return ConfigOptionPolicy( context=self._psctx, path=('productionstrategy', 'labelling'), options=['normal', 'lazy'], is_error=True, default='normal' ) @property def _pspol_labeldefs(self): return ConfigOptionPolicy( context=self._psctx, path=('documentation', 'labels'), options=None, is_error=True, default=None ) def _get_production_strategy(self): rval = {} configdata = self.configs.rawconfig ec = ErrorCollector() try: am = get_dict_val(configdata, self._pspol_doc_am) except ValidationError as e: am = e.policy.default ec.add(e) if am is True: # Assembly manifest should be used rval['prodst'] = "@AM" rval['genmanifest'] = True else: # No Assembly manifest needed rval['prodst'] = "@THIS" rval['genmanifest'] = False try: testing = get_dict_val(configdata, self._pspol_testing) except ValidationError as e: testing = e.policy.default ec.add(e) if testing == 'normal': # Normal test procedure, Test when made rval['testst'] = "@NOW" if testing == 'lazy': # Lazy test procedure, Test when used rval['testst'] = "@USE" try: labelling = get_dict_val(configdata, self._pspol_labelling) except ValidationError as e: labelling = e.policy.default ec.add(e) if labelling == 'normal': # Normal test procedure, Label when made rval['lblst'] = "@NOW" if labelling == 'lazy': # Lazy test procedure, Label when used rval['lblst'] = "@USE" rval['genlabel'] = False rval['labels'] = [] try: labeldefs = get_dict_val(configdata, self._pspol_labeldefs) except ValidationError as e: labeldefs = e.policy.default ec.add(e) if labeldefs is not None: if isinstance(labeldefs, dict): for k in sorted(labeldefs.keys()): rval['labels'].append( {'code': k, 'ident': self.ident + '.' + configdata['label'][k]} ) rval['genlabel'] = True elif isinstance(labeldefs, str): rval['labels'].append( {'code': labeldefs, 'ident': self.ident} ) rval['genlabel'] = True return rval def make_labels(self, sno, label_manager=None): # This does not check whether the sno is valid and correct and # so on. This should therefore not be called directly, but instead # the instance's makelabel function should be used. if label_manager is None: from tendril.dox.labelmaker import manager label_manager = manager if self.strategy['genlabel'] is True: for label in self.strategy['labels']: label_manager.add_label( label['code'], label['ident'], sno ) @property def _changelogpath(self): return os.path.join(self.projfolder, 'ChangeLog') @property def projfolder(self): return projects.cards[self.ident] @property def indicative_cost(self): return self.obom.indicative_cost @property def sourcing_errors(self): if self._sourcing_errors is None: self._sourcing_errors = self.obom.sourcing_errors return self._sourcing_errors @property def indicative_cost_breakup(self): return self.obom.indicative_cost_breakup @property def indicative_cost_hierarchical_breakup(self): try: return self.bom.indicative_cost_hierarchical_breakup(self.ident) except NoStructureHereException: return self.indicative_cost_breakup def _validate_obom(self, ec): # Final Validation of Output BOMs. This validation is of the # ultimate BOM generated, a last check after all possible # transformations are complete. # On-construction validation of OBOMs only includes the # specific mechanisms for construction and transformation, # and not validation of the output itself. The output is # therefore done here, at the very last minute. # NOTE Tentatively, validation errors are to be reported at the # instant when the data required to fully explain the error is # about to go out of immediately accessible scope. obom = self.obom ctx = copy(self._validation_context) ctx.locality = "OBOM" for line in obom.lines: policy = IdentPolicy(ctx, projects.is_recognized) try: policy.check(line.ident, line.refdeslist, self.status) except ValidationError as e: ec.add(e) policy = IdentQtyPolicy(ctx, True) try: temp = line.quantity except ValueError: ec.add(QuantityTypeError(policy, line.ident, line.refdeslist)) def _validate(self): # One Time Validators temp = self.configs temp = self.status temp = self.strategy temp = self.changelog temp = self.bom # Validators for Reconstructed Structures lvalidation_errors = ErrorCollector() # Validate all OBOM line devices # Validate all OBOM line idents # Validate all OBOM line quantity types self._validate_obom(lvalidation_errors) self._sourcing_errors = self.obom.sourcing_errors # TODO Check for valid snoseries # TODO Check for empty groups? # TODO Check for unused motifs? # TODO Validate all motifs as configured # TODO Validate all SJs are accounted for # TODO Validate all Generators are expected # TODO Higher order configuration validation self._validated = True return lvalidation_errors @property def validation_errors(self): # Regenerate Validation reconstructed structures lverrors = self._validate() rval = ErrorCollector() rval.add(self._validation_errors) # Obtain validation errors from Configs load rval.add(self._configs.validation_errors) # Obtain validation errors collected during construction # from Parser -> BOM -> OBOM rval.add(self._obom.validation_errors) rval.add(lverrors) return rval @property def docs(self): return get_docs_list(self.projfolder, self.ident)
class EDAModulePrototypeBase(ModulePrototypeBase): @property def desc(self): return self.configs.description(self.ident) @property def configs(self): if not self._configs: self._configs = ConfigsFile(self.projfolder) return self._configs @property def bom(self): if not self._bom: self._bom = EntityElnBom(self.configs) self._bom.configure_motifs(self.ident) return self._bom @property def obom(self): if not self._obom: self._obom = self.bom.create_output_bom(configname=self.ident) return self._obom def _get_status(self): raise NotImplementedError @property def _psctx(self): ctx = copy(self._validation_context) ctx.locality = 'Strategy' return ctx @property def _pspol_doc_am(self): return ConfigOptionPolicy( context=self._psctx, path=('documentation', 'am'), options=[True, False], is_error=True, default=True ) @property def _pspol_testing(self): return ConfigOptionPolicy( context=self._psctx, path=('productionstrategy', 'testing'), options=['normal', 'lazy'], is_error=True, default='normal' ) @property def _pspol_labelling(self): return ConfigOptionPolicy( context=self._psctx, path=('productionstrategy', 'labelling'), options=['normal', 'lazy'], is_error=True, default='normal' ) @property def _pspol_labeldefs(self): return ConfigOptionPolicy( context=self._psctx, path=('documentation', 'labels'), options=None, is_error=True, default=None ) def _get_production_strategy(self): rval = {} configdata = self.configs.rawconfig ec = ErrorCollector() try: am = get_dict_val(configdata, self._pspol_doc_am) except ValidationError as e: am = e.policy.default ec.add(e) if am is True: # Assembly manifest should be used rval['prodst'] = "@AM" rval['genmanifest'] = True else: # No Assembly manifest needed rval['prodst'] = "@THIS" rval['genmanifest'] = False try: testing = get_dict_val(configdata, self._pspol_testing) except ValidationError as e: testing = e.policy.default ec.add(e) if testing == 'normal': # Normal test procedure, Test when made rval['testst'] = "@NOW" if testing == 'lazy': # Lazy test procedure, Test when used rval['testst'] = "@USE" try: labelling = get_dict_val(configdata, self._pspol_labelling) except ValidationError as e: labelling = e.policy.default ec.add(e) if labelling == 'normal': # Normal test procedure, Label when made rval['lblst'] = "@NOW" if labelling == 'lazy': # Lazy test procedure, Label when used rval['lblst'] = "@USE" rval['genlabel'] = False rval['labels'] = [] try: labeldefs = get_dict_val(configdata, self._pspol_labeldefs) except ValidationError as e: labeldefs = e.policy.default ec.add(e) if labeldefs is not None: if isinstance(labeldefs, dict): for k in sorted(labeldefs.keys()): rval['labels'].append( {'code': k, 'ident': self.ident + '.' + configdata['label'][k]} ) rval['genlabel'] = True elif isinstance(labeldefs, str): rval['labels'].append( {'code': labeldefs, 'ident': self.ident} ) rval['genlabel'] = True return rval def make_labels(self, sno, label_manager=None): # This does not check whether the sno is valid and correct and # so on. This should therefore not be called directly, but instead # the instance's makelabel function should be used. if label_manager is None: from tendril.dox.labelmaker import manager label_manager = manager if self.strategy['genlabel'] is True: for label in self.strategy['labels']: label_manager.add_label( label['code'], label['ident'], sno ) @property def _changelogpath(self): return os.path.join(self.projfolder, 'ChangeLog') @property def projfolder(self): return projects.cards[self.ident] @property def indicative_cost(self): return self.obom.indicative_cost @property def sourcing_errors(self): if self._sourcing_errors is None: self._sourcing_errors = self.obom.sourcing_errors return self._sourcing_errors @property def indicative_cost_breakup(self): return self.obom.indicative_cost_breakup @property def indicative_cost_hierarchical_breakup(self): try: return self.bom.indicative_cost_hierarchical_breakup(self.ident) except NoStructureHereException: return self.indicative_cost_breakup def _validate_obom(self, ec): # Final Validation of Output BOMs. This validation is of the # ultimate BOM generated, a last check after all possible # transformations are complete. # On-construction validation of OBOMs only includes the # specific mechanisms for construction and transformation, # and not validation of the output itself. The output is # therefore done here, at the very last minute. # NOTE Tentatively, validation errors are to be reported at the # instant when the data required to fully explain the error is # about to go out of immediately accessible scope. obom = self.obom ctx = copy(self._validation_context) ctx.locality = "OBOM" for line in obom.lines: policy = IdentPolicy(ctx, projects.is_recognized) try: policy.check(line.ident, line.refdeslist, self.status) except ValidationError as e: ec.add(e) policy = IdentQtyPolicy(ctx, True) try: temp = line.quantity except ValueError: ec.add(QuantityTypeError(policy, line.ident, line.refdeslist)) def _validate(self): # One Time Validators temp = self.configs temp = self.status temp = self.strategy temp = self.changelog temp = self.bom # Validators for Reconstructed Structures lvalidation_errors = ErrorCollector() # Validate all OBOM line devices # Validate all OBOM line idents # Validate all OBOM line quantity types self._validate_obom(lvalidation_errors) self._sourcing_errors = self.obom.sourcing_errors # TODO Check for empty groups? # TODO Check for unused motifs? # TODO Validate all motifs as configured # TODO Validate all SJs are accounted for # TODO Validate all Generators are expected # TODO Higher order configuration validation self._validated = True return lvalidation_errors @property def validation_errors(self): # Regenerate Validation reconstructed structures lverrors = self._validate() rval = ErrorCollector() rval.add(self._validation_errors) # Obtain validation errors from Configs load rval.add(self._configs.validation_errors) # Obtain validation errors collected during construction # from Parser -> BOM -> OBOM rval.add(self._obom.validation_errors) rval.add(lverrors) return rval @property def docs(self): return get_docs_list(self.projfolder, self.ident)