def _convertfileprototofiledescriptor(self, file_proto): """creates a filedescriptor from a proto or returns a cached copy. this method also has the side effect of loading all the symbols found in the file into the appropriate dictionaries in the pool. args: file_proto: the proto to convert. returns: a filedescriptor matching the passed in proto. """ if file_proto.name not in self._file_descriptors: file_descriptor = descriptor.filedescriptor( name=file_proto.name, package=file_proto.package, options=file_proto.options, serialized_pb=file_proto.serializetostring()) scope = {} dependencies = list(self._getdeps(file_proto)) for dependency in dependencies: dep_desc = self.findfilebyname(dependency.name) dep_proto = descriptor_pb2.filedescriptorproto.fromstring( dep_desc.serialized_pb) package = '.' + dep_proto.package package_prefix = package + '.' def _strip_package(symbol): if symbol.startswith(package_prefix): return symbol[len(package_prefix):] return symbol symbols = list(self._extractsymbols(dep_proto.message_type, package)) scope.update(symbols) scope.update((_strip_package(k), v) for k, v in symbols) symbols = list(self._extractenums(dep_proto.enum_type, package)) scope.update(symbols) scope.update((_strip_package(k), v) for k, v in symbols) for message_type in file_proto.message_type: message_desc = self._convertmessagedescriptor( message_type, file_proto.package, file_descriptor, scope) file_descriptor.message_types_by_name[message_desc.name] = message_desc for enum_type in file_proto.enum_type: self._convertenumdescriptor(enum_type, file_proto.package, file_descriptor, none, scope) for desc_proto in self._extractmessages(file_proto.message_type): self._setfieldtypes(desc_proto, scope) for desc_proto in file_proto.message_type: desc = scope[desc_proto.name] file_descriptor.message_types_by_name[desc_proto.name] = desc self.add(file_proto) self._file_descriptors[file_proto.name] = file_descriptor return self._file_descriptors[file_proto.name]
def setup(self): self.my_file = descriptor.filedescriptor( name='some/filename/some.proto', package='protobuf_unittest' ) self.my_enum = descriptor.enumdescriptor( name='foreignenum', full_name='protobuf_unittest.foreignenum', filename=none, file=self.my_file, values=[ descriptor.enumvaluedescriptor(name='foreign_foo', index=0, number=4), descriptor.enumvaluedescriptor(name='foreign_bar', index=1, number=5), descriptor.enumvaluedescriptor(name='foreign_baz', index=2, number=6), ]) self.my_message = descriptor.descriptor( name='nestedmessage', full_name='protobuf_unittest.testalltypes.nestedmessage', filename=none, file=self.my_file, containing_type=none, fields=[ descriptor.fielddescriptor( name='bb', full_name='protobuf_unittest.testalltypes.nestedmessage.bb', index=0, number=1, type=5, cpp_type=1, label=1, has_default_value=false, default_value=0, message_type=none, enum_type=none, containing_type=none, is_extension=false, extension_scope=none), ], nested_types=[], enum_types=[ self.my_enum, ], extensions=[]) self.my_method = descriptor.methoddescriptor( name='bar', full_name='protobuf_unittest.testservice.bar', index=0, containing_service=none, input_type=none, output_type=none) self.my_service = descriptor.servicedescriptor( name='testservicewithoptions', full_name='protobuf_unittest.testservicewithoptions', file=self.my_file, index=0, methods=[ self.my_method ])