def create_instance(self, family_name: str, instance_name_or_spec: Union[dict, str]): dtu.check_isinstance(instance_name_or_spec, (dict, str)) family = self.get_family(family_name) if not family.valid: msg = f"Cannot instantiate {instance_name_or_spec!r} because its family {family_name!r} is " \ f"invalid." msg += "\n\n" + dtu.indent(family.error_if_invalid, " > ") raise dtu.DTConfigException(msg) if isinstance(instance_name_or_spec, str): instance_name = instance_name_or_spec dtu.check_is_in("instance", instance_name, family.instances) instance = family.instances[instance_name] if not instance.valid: msg = f"Cannot instantiate {instance_name!r} because it is invalid:\n" \ f"{dtu.indent(instance.error_if_invalid, '> ')}" raise dtu.DTConfigException(msg) res = dtu.instantiate(instance.constructor, instance.parameters) elif isinstance(instance_name_or_spec, dict): _name, spec = _parse_inline_spec(instance_name_or_spec) res = dtu.instantiate(spec.constructor, spec.parameters) else: assert False interface = dtu.import_name(family.interface) if not isinstance(res, interface): msg = f"I expected that {instance_name_or_spec!r} would be a {interface.__name__} but it is a " \ f"{type(res).__name__}." raise dtu.DTConfigException(msg) return res
def parse_reg_test(): x = dtu.yaml_load(s) # if isinstance(x['description'], unicode): # msg = 'I do not expect Unicode' # msg += '\n' + x.__repr__() # raise ValueError(msg) _ = dtu.instantiate(x["constructor"], x["parameters"])
def parse_reg_fail(): x = dtu.yaml_load(s_fail) print((x.__repr__())) try: _ = dtu.instantiate(x["constructor"], x["parameters"]) except RTParseError: pass else: raise Exception("Expected failure")
def check_validity_instance(f, i): if not f.valid: msg = "Instance not valid because family not valid." return i._replace(valid=False, error_if_invalid=msg) try: res = dtu.instantiate(i.constructor, i.parameters) except (TypeError, Exception) as e: # msg = str(e) msg = traceback.format_exc() return i._replace(valid=False, error_if_invalid=msg) interface = dtu.import_name(f.interface) # print('interface: %s' % interface) if not isinstance(res, interface): msg = f"Expected a {interface.__name__} but it is a {type(res).__name__}." return i._replace(valid=False, error_if_invalid=msg) return i