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]
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, )), )
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
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'
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]
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'
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
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
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
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
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 == {}
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, )), )
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)'
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, )), )
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, )), )