Exemplo n.º 1
0
  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]
Exemplo n.º 2
0
 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
       ])