Example #1
0
def check_validity_family_interface(f):
    # try to import interface
    symbol = f.interface
    try:
        dtu.import_name(symbol)
    except ValueError:
        # logger.error(e)
        error_if_invalid = f"Invalid symbol {symbol!r}."
        return f._replace(valid=False, error_if_invalid=error_if_invalid)
    return f
Example #2
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
Example #3
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
Example #4
0
def message_class_from_string(s):
    if not "/" in s:
        msg = ""
        msg += f'Invalid message name "{s}".\n'
        msg += 'I expected that the name of the message is in the format "PACKAGE/MSG".\n '
        msg += 'E.g. "sensor_msgs/Joy" or "duckietown_msgs/BoolStamped".'
        raise dtu.DTConfigException(msg)

    # e.g. "std_msgs/Header"
    i = s.index("/")
    package = s[:i]
    name = s[i + 1:]
    symbol = f"{package}.msg.{name}"
    try:
        msgclass = dtu.import_name(symbol)
        return msgclass
    except ValueError as e:
        msg = f'Cannot import type for message "{s}" ({symbol}).'
        dtu.raise_wrapped(dtu.DTConfigException, e, msg, compact=True)