예제 #1
0
    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
예제 #2
0
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"])
예제 #3
0
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")
예제 #4
0
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