コード例 #1
0
def test_signatures_single_dispatch():
    T = descriptor_pb2.FieldDescriptorProto.Type
    fields = (
        ('foo',
         make_field(
             message=wrappers.MessageType(
                 fields={},
                 message_pb=descriptor_pb2.DescriptorProto(name='Bacon'),
             ),
             name='bar',
             type=T.Value('TYPE_MESSAGE'),
             type_name='bogus.Message',
         )),
        ('bar', make_field(name='foo', type=T.Value('TYPE_INT32'))),
    )
    signatures = wrappers.MethodSignatures(all=(
        wrappers.MethodSignature(
            name='spam',
            fields=collections.OrderedDict(fields),
        ),
        wrappers.MethodSignature(
            name='eggs',
            fields=collections.OrderedDict(reversed(fields)),
        ),
    ))
    assert len(signatures) == 2
    assert len(signatures.single_dispatch) == 1
    assert signatures.single_dispatch[0] == signatures[1]
コード例 #2
0
def get_message(
    dot_path: str,
    *,
    fields: typing.Tuple[desc.FieldDescriptorProto] = (),
) -> wrappers.MessageType:
    # Pass explicit None through (for lro_metadata).
    if dot_path is None:
        return None

    # Note: The `dot_path` here is distinct from the canonical proto path
    # because it includes the module, which the proto path does not.
    #
    # So, if trying to test the DescriptorProto message here, the path
    # would be google.protobuf.descriptor.DescriptorProto (whereas the proto
    # path is just google.protobuf.DescriptorProto).
    pieces = dot_path.split('.')
    pkg, module, name = pieces[:-2], pieces[-2], pieces[-1]

    return wrappers.MessageType(
        fields={
            i.name: wrappers.Field(
                field_pb=i,
                enum=get_enum(i.type_name) if i.type_name else None,
            )
            for i in fields
        },
        nested_messages={},
        nested_enums={},
        message_pb=desc.DescriptorProto(name=name, field=fields),
        meta=metadata.Metadata(address=metadata.Address(
            name=name,
            package=tuple(pkg),
            module=module,
        )),
    )
コード例 #3
0
def test_operation_meta():
    lro_response = wrappers.MessageType(
        fields={},
        message_pb=descriptor_pb2.DescriptorProto(name='LroResponse'),
        meta=metadata.Metadata(address=metadata.Address(module='foo')),
    )
    operation = wrappers.OperationType(lro_response=lro_response)
    assert 'representing a long-running operation' in operation.meta.doc
    assert ':class:`~.foo_pb2.LroResponse`' in operation.meta.doc
コード例 #4
0
def test_operation():
    lro_response = wrappers.MessageType(
        fields={},
        message_pb=descriptor_pb2.DescriptorProto(name='LroResponse'),
    )
    operation = wrappers.OperationType(lro_response=lro_response)
    assert operation.name == 'Operation'
    assert operation.python_ident == 'operation.Operation'
    assert operation.sphinx_ident == '~.operation.Operation'
コード例 #5
0
    def _load_message(
        self,
        message_pb: descriptor_pb2.DescriptorProto,
        address: metadata.Address,
        path: Tuple[int],
    ) -> wrappers.MessageType:
        """Load message descriptions from DescriptorProtos."""
        address = address.child(message_pb.name, path)

        # Load all nested items.
        #
        # Note: This occurs before piecing together this message's fields
        # because if nested types are present, they are generally the
        # type of one of this message's fields, and they need to be in
        # the registry for the field's message or enum attributes to be
        # set correctly.
        nested_enums = self._load_children(
            message_pb.enum_type,
            address=address,
            loader=self._load_enum,
            path=path + (4, ),
        )
        nested_messages = self._load_children(
            message_pb.nested_type,
            address=address,
            loader=self._load_message,
            path=path + (3, ),
        )
        # self._load_children(message.oneof_decl, loader=self._load_field,
        #                     address=nested_addr, info=info.get(8, {}))

        # Create a dictionary of all the fields for this message.
        fields = self._get_fields(
            message_pb.field,
            address=address,
            path=path + (2, ),
        )
        fields.update(
            self._get_fields(
                message_pb.extension,
                address=address,
                path=path + (6, ),
            ))

        # Create a message correspoding to this descriptor.
        self.proto_messages[address.proto] = wrappers.MessageType(
            fields=fields,
            message_pb=message_pb,
            nested_enums=nested_enums,
            nested_messages=nested_messages,
            meta=metadata.Metadata(
                address=address,
                documentation=self.docs.get(path, self.EMPTY),
            ),
        )
        return self.proto_messages[address.proto]
コード例 #6
0
def test_operation():
    lro_response = wrappers.MessageType(
        fields={},
        nested_messages={},
        nested_enums={},
        message_pb=descriptor_pb2.DescriptorProto(name='LroResponse'),
    )
    operation = wrappers.OperationType(lro_response=lro_response)
    assert operation.name == 'Operation'
    assert str(operation.ident) == 'operation.Operation'
    assert operation.ident.sphinx == '~.operation.Operation'
コード例 #7
0
def test_field_not_primitive():
    Type = descriptor_pb2.FieldDescriptorProto.Type
    message = wrappers.MessageType(
        fields={},
        message_pb=descriptor_pb2.DescriptorProto(),
    )
    non_primitive_field = make_field(
        type=Type.Value('TYPE_MESSAGE'),
        type_name='bogus.Message',
        message=message,
    )
    assert not non_primitive_field.is_primitive
コード例 #8
0
def test_type_message():
    T = descriptor_pb2.FieldDescriptorProto.Type
    message = wrappers.MessageType(
        fields={},
        message_pb=descriptor_pb2.DescriptorProto(),
    )
    field = make_field(
        type=T.Value('TYPE_MESSAGE'),
        type_name='bogus.Message',
        message=message,
    )
    assert field.type == message
コード例 #9
0
def test_field_not_primitive():
    message = wrappers.MessageType(
        fields={},
        nested_messages={},
        nested_enums={},
        message_pb=descriptor_pb2.DescriptorProto(),
    )
    non_primitive_field = make_field(
        type='TYPE_MESSAGE',
        type_name='bogus.Message',
        message=message,
    )
    assert not non_primitive_field.is_primitive
コード例 #10
0
def test_type_message():
    message = wrappers.MessageType(
        fields={},
        nested_messages={},
        nested_enums={},
        message_pb=descriptor_pb2.DescriptorProto(),
    )
    field = make_field(
        type='TYPE_MESSAGE',
        type_name='bogus.Message',
        message=message,
    )
    assert field.type == message
コード例 #11
0
def test_mock_value_original_type_message():
    subfields = collections.OrderedDict((
        ('foo', make_field(name='foo', type='TYPE_INT32')),
        ('bar', make_field(name='bar', type='TYPE_STRING'))
    ))
    message = wrappers.MessageType(
        fields=subfields,
        message_pb=descriptor_pb2.DescriptorProto(name='Message', field=[
            i.field_pb for i in subfields.values()
        ]),
        meta=metadata.Metadata(address=metadata.Address(
            module='bogus',
            name='Message',
        )),
        nested_enums={},
        nested_messages={},
    )

    field = make_field(
        type='TYPE_MESSAGE',
        type_name='bogus.Message',
        message=message,
    )

    mock = field.mock_value_original_type

    assert mock == {"foo": 324, "bar": "bar_value"}

    # Messages by definition aren't primitive
    with pytest.raises(TypeError):
        field.primitive_mock()

    # Special case for map entries
    entry_msg = make_message(
        name='MessageEntry',
        fields=(
            make_field(name='key', type='TYPE_STRING'),
            make_field(name='value', type='TYPE_STRING'),
        ),
        options=descriptor_pb2.MessageOptions(map_entry=True),
    )
    entry_field = make_field(
        name="messages",
        type_name="stuff.MessageEntry",
        message=entry_msg,
        label=3,
        type='TYPE_MESSAGE',
    )

    assert entry_field.mock_value_original_type == {}
コード例 #12
0
def make_message(name: str, package: str = 'foo.bar.v1', module: str = 'baz',
        fields: Sequence[wrappers.Field] = (),
        ) -> wrappers.MessageType:
    message_pb = descriptor_pb2.DescriptorProto(
        name=name,
        field=[i.field_pb for i in fields],
    )
    return wrappers.MessageType(
        message_pb=message_pb,
        fields=collections.OrderedDict((i.name, i) for i in fields),
        meta=metadata.Metadata(address=metadata.Address(
            package=tuple(package.split('.')),
            module=module,
        )),
    )
コード例 #13
0
def test_mock_value_message():
    subfields = collections.OrderedDict(
        (('foo', make_field(name='foo', type='TYPE_INT32')),
         ('bar', make_field(name='bar', type='TYPE_STRING'))))
    message = wrappers.MessageType(
        fields=subfields,
        message_pb=descriptor_pb2.DescriptorProto(
            name='Message', field=[i.field_pb for i in subfields.values()]),
        meta=metadata.Metadata(address=metadata.Address(
            module='bogus',
            name='Message',
        )),
        nested_enums={},
        nested_messages={},
    )
    field = make_field(
        type='TYPE_MESSAGE',
        type_name='bogus.Message',
        message=message,
    )
    assert field.mock_value == 'bogus.Message(foo=324)'
コード例 #14
0
def get_message(dot_path: str) -> wrappers.MessageType:
    # Pass explicit None through (for lro_metadata).
    if dot_path is None:
        return None

    # Note: The `dot_path` here is distinct from the canonical proto path
    # because it includes the module, which the proto path does not.
    #
    # So, if trying to test the DescriptorProto message here, the path
    # would be google.protobuf.descriptor.DescriptorProto (whereas the proto
    # path is just google.protobuf.DescriptorProto).
    pieces = dot_path.split('.')
    pkg, module, name = pieces[:-2], pieces[-2], pieces[-1]
    return wrappers.MessageType(
        fields={},
        message_pb=descriptor_pb2.DescriptorProto(name=name),
        meta=metadata.Metadata(address=metadata.Address(
            package=pkg,
            module=module,
        )),
    )
コード例 #15
0
def make_message(name: str, package: str = 'foo.bar.v1', module: str = 'baz',
                 fields: typing.Sequence[wrappers.Field] = (),
                 meta: metadata.Metadata = None,
                 options: descriptor_pb2.MethodOptions = None,
                 ) -> wrappers.MessageType:
    message_pb = descriptor_pb2.DescriptorProto(
        name=name,
        field=[i.field_pb for i in fields],
        options=options,
    )
    return wrappers.MessageType(
        message_pb=message_pb,
        fields=collections.OrderedDict((i.name, i) for i in fields),
        nested_messages={},
        nested_enums={},
        meta=meta or metadata.Metadata(address=metadata.Address(
            name=name,
            package=tuple(package.split('.')),
            module=module,
        )),
    )