Пример #1
0
    def _compare(self, type_hint, expected_string):
        """Compare generated and expected types."""
        # Generate a type string.
        dbus_type = get_dbus_type(type_hint)
        self.assertEqual(dbus_type, expected_string)
        self.assertTrue(GLib.VariantType.string_is_valid(dbus_type))

        # Create a variant type from a type hint.
        variant_type = get_variant_type(type_hint)
        self.assertIsInstance(variant_type, GLib.VariantType)
        self.assertEqual(variant_type.dup_string(), expected_string)

        expected_type = GLib.VariantType.new(expected_string)
        self.assertTrue(expected_type.equal(variant_type))

        # Create a variant type from a type string.
        variant_type = get_variant_type(expected_string)
        self.assertIsInstance(variant_type, GLib.VariantType)
        self.assertTrue(expected_type.equal(variant_type))

        # Test the is_tuple_of_one function.
        expected_value = is_base_type(type_hint, Tuple) \
            and len(get_type_arguments(type_hint)) == 1

        self.assertEqual(is_tuple_of_one(type_hint), expected_value)
        self.assertEqual(is_tuple_of_one(expected_string), expected_value)

        self.assertTrue(is_tuple_of_one(Tuple[type_hint]))
        self.assertTrue(is_tuple_of_one("({})".format(expected_string)))
Пример #2
0
    def _create_field(cls, field_name, member_hint):
        """Create a representation of a DBus field.

        :param field_name: a name of the field
        :param member_hint: a type hint of the member
        :return: a new instance of DBus field
        """
        if is_base_type(member_hint, DBusData):
            return DBusDataField(field_name, member_hint)

        if is_base_type(member_hint, List):
            (arg_hint, ) = get_type_arguments(member_hint)

            if is_base_type(arg_hint, DBusData):
                return DBusDataListField(field_name, arg_hint)

        return DBusField(field_name, member_hint)
Пример #3
0
    def test_base_class(self):
        """Test the base class checks."""
        class Data(object):
            pass

        class DataA(Data):
            pass

        class DataB(Data):
            pass

        self.assertEqual(is_base_type(Data, Data), True)
        self.assertEqual(is_base_type(DataA, Data), True)
        self.assertEqual(is_base_type(DataB, Data), True)

        self.assertEqual(is_base_type(Data, DataA), False)
        self.assertEqual(is_base_type(Data, DataB), False)
        self.assertEqual(is_base_type(DataA, DataB), False)
        self.assertEqual(is_base_type(DataB, DataA), False)

        self.assertEqual(is_base_type(List[Data], List), True)
        self.assertEqual(is_base_type(Tuple[DataA], Tuple), True)
        self.assertEqual(is_base_type(Dict[Str, DataB], Dict), True)
Пример #4
0
    def _iterate_out_parameters(cls, member, signature):
        """Iterate over output parameters."""
        name = DBusSpecification.RETURN_PARAMETER
        direction = DBusSpecification.DIRECTION_OUT
        type_hint = signature.return_annotation

        # Is the return type defined?
        if type_hint is signature.empty:
            return

        # Is the return type other than None?
        if type_hint is None:
            return

        # Generate multiple output arguments if requested.
        if getattr(member, RETURNS_MULTIPLE_ARGUMENTS_ATTRIBUTE, False):
            # The return type has to be a tuple.
            if not is_base_type(type_hint, Tuple):
                raise DBusSpecificationError(
                    "Expected a tuple of multiple arguments."
                )

            # The return type has to contain multiple arguments.
            type_args = get_type_arguments(type_hint)

            if len(type_args) < 2:
                raise DBusSpecificationError(
                    "Expected a tuple of more than one argument."
                )

            # Iterate over types in the tuple
            for i, type_arg in enumerate(type_args):
                yield "{}_{}".format(name, i), type_arg, direction

            return

        # Otherwise, return only one output argument.
        yield name, type_hint, direction
Пример #5
0
    def test_base_type(self):
        """Test the base type checks."""
        self.assertEqual(is_base_type(Int, Int), True)
        self.assertEqual(is_base_type(UInt16, UInt16), True)
        self.assertEqual(is_base_type(Variant, Variant), True)

        self.assertEqual(is_base_type(Int, Bool), False)
        self.assertEqual(is_base_type(Bool, List), False)
        self.assertEqual(is_base_type(UInt16, Dict), False)
        self.assertEqual(is_base_type(UInt16, Int), False)
        self.assertEqual(is_base_type(Variant, Tuple), False)

        self.assertEqual(is_base_type(List[Int], List), True)
        self.assertEqual(is_base_type(List[Bool], List), True)
        self.assertEqual(is_base_type(List[Variant], List), True)

        self.assertEqual(is_base_type(Tuple[Int], Tuple), True)
        self.assertEqual(is_base_type(Tuple[Bool], Tuple), True)
        self.assertEqual(is_base_type(Tuple[Variant], Tuple), True)

        self.assertEqual(is_base_type(Dict[Str, Int], Dict), True)
        self.assertEqual(is_base_type(Dict[Str, Bool], Dict), True)
        self.assertEqual(is_base_type(Dict[Str, Variant], Dict), True)

        self.assertEqual(is_base_type(List[Int], Tuple), False)
        self.assertEqual(is_base_type(Tuple[Bool], Dict), False)
        self.assertEqual(is_base_type(Dict[Str, Variant], List), False)