1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson# https://developers.google.com/protocol-buffers/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Needs to stay compatible with Python 2.5 due to GAE. 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 33a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Copyright 2007 Google Inc. All Rights Reserved. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Descriptors essentially contain exactly the information found in a .proto 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefile, in types that make this information accessible in Python. 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'robinson@google.com (Will Robinson)' 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import api_implementation 42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonif api_implementation.Type() == 'cpp': 45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Used by MakeDescriptor in cpp mode 46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson import os 47a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson import uuid 48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if api_implementation.Version() == 2: 50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson from google.protobuf.pyext import _message 51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson from google.protobuf.internal import cpp_message 53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 54d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 55d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass Error(Exception): 56d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Base error for this module.""" 57d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 58d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass TypeTransformationError(Error): 60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """Error transforming between python proto type and corresponding C++ type.""" 61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorBase(object): 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Descriptors base class. 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville This class is the base of all descriptor classes. It provides common options 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville related functionaility. 69d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 70d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Attributes: 71d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville has_options: True if the descriptor has non-default options. Usually it 72d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville is not necessary to read this -- just call GetOptions() which will 73d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville happily return the default instance. However, it's sometimes useful 74d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville for efficiency, and also useful inside the protobuf implementation to 75d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville avoid some bootstrapping issues. 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def __init__(self, options, options_class_name): 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Initialize the descriptor given its options message and the name of the 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class of the options message. The name of the class is required in case 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville the options message is None and has to be created. 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self._options = options 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self._options_class_name = options_class_name 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # Does this descriptor have non-default options? 87d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.has_options = options is not None 88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def _SetOptions(self, options, options_class_name): 90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """Sets the descriptor's options 91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson This function is used in generated proto2 files to update descriptor 93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson options. It must not be used outside proto2. 94a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """ 95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self._options = options 96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self._options_class_name = options_class_name 97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Does this descriptor have non-default options? 99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.has_options = options is not None 100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def GetOptions(self): 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Retrieves descriptor options. 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville This method returns the options set or creates the default options for the 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville descriptor. 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if self._options: 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return self._options 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville from google.protobuf import descriptor_pb2 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try: 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options_class = getattr(descriptor_pb2, self._options_class_name) 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville except AttributeError: 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise RuntimeError('Unknown options class name %s!' % 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (self._options_class_name)) 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self._options = options_class() 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return self._options 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass _NestedDescriptorBase(DescriptorBase): 120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Common class for descriptors that can be nested.""" 121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def __init__(self, options, options_class_name, name, full_name, 123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file, containing_type, serialized_start=None, 124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville serialized_end=None): 125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Constructor. 126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Args: 128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville options: Protocol message options or None 129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville to use default message options. 130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville options_class_name: (str) The class name of the above options. 131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville name: (str) Name of this protocol message type. 133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville full_name: (str) Fully-qualified name of this protocol message type, 134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville which will include protocol "package" name and the name of any 135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville enclosing types. 136d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file: (FileDescriptor) Reference to file info. 137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville containing_type: if provided, this is a nested descriptor, with this 138d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville descriptor as parent, otherwise None. 139d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville serialized_start: The start index (inclusive) in block in the 140d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file.serialized_pb that describes this descriptor. 141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville serialized_end: The end index (exclusive) in block in the 142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file.serialized_pb that describes this descriptor. 143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """ 144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville super(_NestedDescriptorBase, self).__init__( 145d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville options, options_class_name) 146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 147d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.name = name 148d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # TODO(falk): Add function to calculate full_name instead of having it in 149d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # memory? 150d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.full_name = full_name 151d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.file = file 152d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.containing_type = containing_type 153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 154d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self._serialized_start = serialized_start 155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self._serialized_end = serialized_end 156d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def GetTopLevelContainingType(self): 158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Returns the root if this is a nested type, or itself if its the root.""" 159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville desc = self 160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville while desc.containing_type is not None: 161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville desc = desc.containing_type 162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return desc 163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 164d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def CopyToProto(self, proto): 165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Copies this to the matching proto in descriptor_pb2. 166d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 167d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Args: 168d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto: An empty proto instance from descriptor_pb2. 169d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Raises: 171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Error: If self couldnt be serialized, due to to few constructor arguments. 172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """ 173d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (self.file is not None and 174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self._serialized_start is not None and 175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self._serialized_end is not None): 176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto.ParseFromString(self.file.serialized_pb[ 177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self._serialized_start:self._serialized_end]) 178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville else: 179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville raise Error('Descriptor does not contain serialization.') 180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 181d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 182d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass Descriptor(_NestedDescriptorBase): 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Descriptor for a protocol message type. 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville A Descriptor instance has the following attributes: 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name: (str) Name of this protocol message type. 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville full_name: (str) Fully-qualified name of this protocol message type, 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville which will include protocol "package" name and the name of any 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enclosing types. 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville containing_type: (Descriptor) Reference to the descriptor of the 194d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville type containing us, or None if this is top-level. 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fields: (list of FieldDescriptors) Field descriptors for all 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fields in this type. 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville objects as in |fields|, but indexed by "number" attribute in each 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor. 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville objects as in |fields|, but indexed by "name" attribute in each 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor. 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested_types: (list of Descriptors) Descriptor references 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for all protocol message types nested within this one. 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested_types_by_name: (dict str -> Descriptor) Same Descriptor 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville objects as in |nested_types|, but indexed by "name" attribute 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville in each Descriptor. 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_types: (list of EnumDescriptors) EnumDescriptor references 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for all enums contained within this type. 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville objects as in |enum_types|, but indexed by "name" attribute 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville in each EnumDescriptor. 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville from enum value name to EnumValueDescriptor for that value. 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extensions: (list of FieldDescriptor) All extensions defined directly 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville within this message type (NOT within a nested type). 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville objects as |extensions|, but indexed by "name" attribute of each 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor. 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 225d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville is_extendable: Does this type define any extension ranges? 226d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options: (descriptor_pb2.MessageOptions) Protocol message options or None 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville to use default message options. 229d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneofs: (list of OneofDescriptor) The list of descriptors for oneof fields 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson in this message. 232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneofs_by_name: (dict str -> OneofDescriptor) Same objects as in |oneofs|, 233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson but indexed by "name" attribute. 234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 235d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file: (FileDescriptor) Reference to file descriptor. 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # NOTE(tmarek): The file argument redefining a builtin is nothing we can 239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # fix right now since we don't know how many clients already rely on the 240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # name of the argument. 241d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def __init__(self, name, full_name, filename, containing_type, fields, 242d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville nested_types, enum_types, extensions, options=None, 243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson is_extendable=True, extension_ranges=None, oneofs=None, 244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file=None, serialized_start=None, serialized_end=None): # pylint:disable=redefined-builtin 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Arguments to __init__() are as described in the description 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville of Descriptor fields above. 247d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 248d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Note that filename is an obsolete argument, that is not used anymore. 249d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Please use file.name to access this as an attribute. 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville super(Descriptor, self).__init__( 252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville options, 'MessageOptions', name, full_name, file, 253d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville containing_type, serialized_start=serialized_start, 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson serialized_end=serialized_end) 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # We have fields in addition to fields_by_name and fields_by_number, 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # so that: 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 1. Clients can index fields by "order in which they're listed." 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2. Clients can easily iterate over all fields with the terse 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # syntax: for f in descriptor.fields: ... 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.fields = fields 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for field in self.fields: 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.containing_type = self 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.fields_by_number = dict((f.number, f) for f in fields) 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.fields_by_name = dict((f.name, f) for f in fields) 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.nested_types = nested_types 268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for nested_type in nested_types: 269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_type.containing_type = self 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.nested_types_by_name = dict((t.name, t) for t in nested_types) 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.enum_types = enum_types 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for enum_type in self.enum_types: 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_type.containing_type = self 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.enum_types_by_name = dict((t.name, t) for t in enum_types) 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.enum_values_by_name = dict( 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (v.name, v) for t in enum_types for v in t.values) 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extensions = extensions 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for extension in self.extensions: 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension.extension_scope = self 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extensions_by_name = dict((f.name, f) for f in extensions) 283d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.is_extendable = is_extendable 284d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.extension_ranges = extension_ranges 285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.oneofs = oneofs if oneofs is not None else [] 286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.oneofs_by_name = dict((o.name, o) for o in self.oneofs) 287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for oneof in self.oneofs: 288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof.containing_type = self 289d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def EnumValueName(self, enum, value): 291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """Returns the string name of an enum value. 292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson This is just a small helper method to simplify a common operation. 294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Args: 296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum: string name of the Enum. 297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value: int, value of the enum. 298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Returns: 300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson string name of the enum value. 301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Raises: 303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson KeyError if either the Enum doesn't exist or the value is not a valid 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value for the enum. 305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """ 306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return self.enum_types_by_name[enum].values_by_number[value].name 307d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 308d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def CopyToProto(self, proto): 309d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Copies this to a descriptor_pb2.DescriptorProto. 310d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 311d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Args: 312d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto: An empty descriptor_pb2.DescriptorProto. 313d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """ 314d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # This function is overriden to give a better doc comment. 315d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville super(Descriptor, self).CopyToProto(proto) 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): We should have aggressive checking here, 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# for example: 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * If you specify a repeated field, you should not be allowed 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# to specify a default value. 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * [Other examples here as needed]. 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): for this and other *Descriptor classes, we 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# might also want to lock things down aggressively (e.g., 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# prevent clients from setting the attributes). Having 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# stronger invariants here in general will reduce the number 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# of runtime checks we must do in reflection.py... 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldDescriptor(DescriptorBase): 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Descriptor for a single field in a .proto file. 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson A FieldDescriptor instance has the following attributes: 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name: (str) Name of this field, exactly as it appears in .proto. 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville full_name: (str) Name of this field, including containing scope. This is 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville particularly relevant for extensions. 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville index: (int) Dense, 0-indexed index giving the order that this 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field textually appears within its message in the .proto file. 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville number: (int) Tag number declared for this field in the .proto file. 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville type: (One of the TYPE_* constants below) Declared type. 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville cpp_type: (One of the CPPTYPE_* constants below) C++ type used to 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville represent this field. 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville label: (One of the LABEL_* constants below) Tells whether this 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field is optional, required, or repeated. 348d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville has_default_value: (bool) True if this field has a default value defined, 349d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville otherwise false. 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville default_value: (Varies) Default value of this field. Only 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville meaningful for non-repeated scalar fields. Repeated fields 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should always set this to [], and non-repeated composite 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fields should always set this to None. 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville containing_type: (Descriptor) Descriptor of the protocol message 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville type that contains this field. Set by the Descriptor constructor 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if we're passed into one. 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Somewhat confusingly, for extension fields, this is the 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville descriptor of the EXTENDED message, not the descriptor 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville of the message containing this field. (See is_extension and 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_scope below). 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_type: (Descriptor) If a composite field, a descriptor 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville of the message type contained in this field. Otherwise, this is None. 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum_type: (EnumDescriptor) If this field contains an enum, a 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville descriptor of that enum. Otherwise, this is None. 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville is_extension: True iff this describes an extension field. 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_scope: (Descriptor) Only meaningful if is_extension is True. 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Gives the message that immediately contains this extension field. 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Will be None iff we're a top-level (file-level) extension field. 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options: (descriptor_pb2.FieldOptions) Protocol message field options or 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville None to use default field options. 374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson containing_oneof: (OneofDescriptor) If the field is a member of a oneof 376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson union, contains its descriptor. Otherwise, None. 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Must be consistent with C++ FieldDescriptor::Type enum in 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # descriptor.h. 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): Find a way to eliminate this repetition. 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_DOUBLE = 1 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FLOAT = 2 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_INT64 = 3 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_UINT64 = 4 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_INT32 = 5 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FIXED64 = 6 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FIXED32 = 7 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_BOOL = 8 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_STRING = 9 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_GROUP = 10 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_MESSAGE = 11 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_BYTES = 12 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_UINT32 = 13 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_ENUM = 14 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SFIXED32 = 15 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SFIXED64 = 16 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SINT32 = 17 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SINT64 = 18 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_TYPE = 18 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Must be consistent with C++ FieldDescriptor::CppType enum in 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # descriptor.h. 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): Find a way to eliminate this repetition. 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_INT32 = 1 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_INT64 = 2 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_UINT32 = 3 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_UINT64 = 4 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_DOUBLE = 5 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_FLOAT = 6 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_BOOL = 7 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_ENUM = 8 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_STRING = 9 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_MESSAGE = 10 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_CPPTYPE = 10 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson _PYTHON_TO_CPP_PROTO_TYPE_MAP = { 420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_DOUBLE: CPPTYPE_DOUBLE, 421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_FLOAT: CPPTYPE_FLOAT, 422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_ENUM: CPPTYPE_ENUM, 423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_INT64: CPPTYPE_INT64, 424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_SINT64: CPPTYPE_INT64, 425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_SFIXED64: CPPTYPE_INT64, 426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_UINT64: CPPTYPE_UINT64, 427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_FIXED64: CPPTYPE_UINT64, 428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_INT32: CPPTYPE_INT32, 429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_SFIXED32: CPPTYPE_INT32, 430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_SINT32: CPPTYPE_INT32, 431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_UINT32: CPPTYPE_UINT32, 432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_FIXED32: CPPTYPE_UINT32, 433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_BYTES: CPPTYPE_STRING, 434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_STRING: CPPTYPE_STRING, 435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_BOOL: CPPTYPE_BOOL, 436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_MESSAGE: CPPTYPE_MESSAGE, 437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TYPE_GROUP: CPPTYPE_MESSAGE 438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Must be consistent with C++ FieldDescriptor::Label enum in 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # descriptor.h. 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): Find a way to eliminate this repetition. 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LABEL_OPTIONAL = 1 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LABEL_REQUIRED = 2 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LABEL_REPEATED = 3 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_LABEL = 3 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Must be consistent with C++ constants kMaxNumber, kFirstReservedNumber, 450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # and kLastReservedNumber in descriptor.h 451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson MAX_FIELD_NUMBER = (1 << 29) - 1 452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FIRST_RESERVED_FIELD_NUMBER = 19000 453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson LAST_RESERVED_FIELD_NUMBER = 19999 454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def __init__(self, name, full_name, index, number, type, cpp_type, label, 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville default_value, message_type, enum_type, containing_type, 457d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville is_extension, extension_scope, options=None, 458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson has_default_value=True, containing_oneof=None): 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """The arguments are as described in the description of FieldDescriptor 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville attributes above. 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Note that containing_type may be None, and may be set later if necessary 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (to deal with circular references between message types, for example). 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Likewise for extension_scope. 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville super(FieldDescriptor, self).__init__(options, 'FieldOptions') 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.name = name 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.full_name = full_name 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.index = index 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.number = number 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.type = type 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.cpp_type = cpp_type 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.label = label 474d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.has_default_value = has_default_value 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.default_value = default_value 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.containing_type = containing_type 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.message_type = message_type 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.enum_type = enum_type 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.is_extension = is_extension 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extension_scope = extension_scope 481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.containing_oneof = containing_oneof 482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if api_implementation.Type() == 'cpp': 483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if is_extension: 484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if api_implementation.Version() == 2: 485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # pylint: disable=protected-access 486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self._cdescriptor = ( 487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson _message.Message._GetExtensionDescriptor(full_name)) 488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # pylint: enable=protected-access 489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name) 491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if api_implementation.Version() == 2: 493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # pylint: disable=protected-access 494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self._cdescriptor = _message.Message._GetFieldDescriptor(full_name) 495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # pylint: enable=protected-access 496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self._cdescriptor = cpp_message.GetFieldDescriptor(full_name) 498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self._cdescriptor = None 500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson @staticmethod 502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def ProtoTypeToCppProtoType(proto_type): 503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """Converts from a Python proto type to a C++ Proto Type. 504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson The Python ProtocolBuffer classes specify both the 'Python' datatype and the 506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'C++' datatype - and they're not the same. This helper method should 507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson translate from one to another. 508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Args: 510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson proto_type: the Python proto type (descriptor.FieldDescriptor.TYPE_*) 511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Returns: 512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor.FieldDescriptor.CPPTYPE_*, the C++ type. 513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Raises: 514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TypeTransformationError: when the Python proto type isn't known. 515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """ 516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson try: 517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return FieldDescriptor._PYTHON_TO_CPP_PROTO_TYPE_MAP[proto_type] 518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson except KeyError: 519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson raise TypeTransformationError('Unknown proto_type: %s' % proto_type) 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 522d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass EnumDescriptor(_NestedDescriptorBase): 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Descriptor for an enum defined in a .proto file. 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville An EnumDescriptor instance has the following attributes: 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name: (str) Name of the enum type. 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville full_name: (str) Full name of the type, including package name 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville and any enclosing type(s). 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville values: (list of EnumValueDescriptors) List of the values 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville in this enum. 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville values_by_name: (dict str -> EnumValueDescriptor) Same as |values|, 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville but indexed by the "name" field of each EnumValueDescriptor. 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville values_by_number: (dict int -> EnumValueDescriptor) Same as |values|, 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville but indexed by the "number" field of each EnumValueDescriptor. 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville containing_type: (Descriptor) Descriptor of the immediate containing 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville type of this enum, or None if this is an enum defined at the 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville top level in a .proto file. Set by Descriptor's constructor 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if we're passed into one. 542d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file: (FileDescriptor) Reference to file descriptor. 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options: (descriptor_pb2.EnumOptions) Enum options message or 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville None to use default enum options. 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def __init__(self, name, full_name, filename, values, 548d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville containing_type=None, options=None, file=None, 549d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville serialized_start=None, serialized_end=None): 550d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Arguments are as described in the attribute description above. 551d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 552d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Note that filename is an obsolete argument, that is not used anymore. 553d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Please use file.name to access this as an attribute. 554d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """ 555d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville super(EnumDescriptor, self).__init__( 556d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville options, 'EnumOptions', name, full_name, file, 557d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville containing_type, serialized_start=serialized_start, 558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson serialized_end=serialized_end) 559d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.values = values 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for value in self.values: 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value.type = self 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.values_by_name = dict((v.name, v) for v in values) 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.values_by_number = dict((v.number, v) for v in values) 565d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 566d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def CopyToProto(self, proto): 567d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Copies this to a descriptor_pb2.EnumDescriptorProto. 568d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 569d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Args: 570d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto: An empty descriptor_pb2.EnumDescriptorProto. 571d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """ 572d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # This function is overriden to give a better doc comment. 573d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville super(EnumDescriptor, self).CopyToProto(proto) 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueDescriptor(DescriptorBase): 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Descriptor for a single value within an enum. 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name: (str) Name of this value. 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville index: (int) Dense, 0-indexed index giving the order that this 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value appears textually within its enum in the .proto file. 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville number: (int) Actual number assigned to this enum value. 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville type: (EnumDescriptor) EnumDescriptor to which this value 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville belongs. Set by EnumDescriptor's constructor if we're 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville passed into one. 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options: (descriptor_pb2.EnumValueOptions) Enum value options message or 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville None to use default enum value options options. 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def __init__(self, name, index, number, type=None, options=None): 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Arguments are as described in the attribute description above.""" 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions') 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.name = name 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.index = index 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.number = number 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.type = type 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass OneofDescriptor(object): 601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """Descriptor for a oneof field. 602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name: (str) Name of the oneof field. 604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson full_name: (str) Full name of the oneof field, including package name. 605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson index: (int) 0-based index giving the order of the oneof field inside 606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson its containing type. 607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson containing_type: (Descriptor) Descriptor of the protocol message 608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson type that contains this field. Set by the Descriptor constructor 609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if we're passed into one. 610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields: (list of FieldDescriptor) The list of field descriptors this 611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson oneof can contain. 612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """ 613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def __init__(self, name, full_name, index, containing_type, fields): 615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """Arguments are as described in the attribute description above.""" 616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.name = name 617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.full_name = full_name 618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.index = index 619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.containing_type = containing_type 620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.fields = fields 621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 623d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass ServiceDescriptor(_NestedDescriptorBase): 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Descriptor for a service. 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name: (str) Name of the service. 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville full_name: (str) Full name of the service, including package name. 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville index: (int) 0-indexed index giving the order that this services 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville definition appears withing the .proto file. 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville methods: (list of MethodDescriptor) List of methods provided by this 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service. 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options: (descriptor_pb2.ServiceOptions) Service options message or 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville None to use default service options. 635d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file: (FileDescriptor) Reference to file info. 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 638d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def __init__(self, name, full_name, index, methods, options=None, file=None, 639d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville serialized_start=None, serialized_end=None): 640d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville super(ServiceDescriptor, self).__init__( 641d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville options, 'ServiceOptions', name, full_name, file, 642d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville None, serialized_start=serialized_start, 643d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville serialized_end=serialized_end) 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.index = index 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.methods = methods 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Set the containing service for each method in this service. 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for method in self.methods: 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville method.containing_service = self 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def FindMethodByName(self, name): 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Searches for the specified method, and returns its descriptor.""" 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for method in self.methods: 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if name == method.name: 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return method 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return None 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 657d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def CopyToProto(self, proto): 658d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Copies this to a descriptor_pb2.ServiceDescriptorProto. 659d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 660d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Args: 661d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto: An empty descriptor_pb2.ServiceDescriptorProto. 662d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """ 663d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # This function is overriden to give a better doc comment. 664d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville super(ServiceDescriptor, self).CopyToProto(proto) 665d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodDescriptor(DescriptorBase): 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Descriptor for a method in a service. 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name: (str) Name of the method within the service. 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville full_name: (str) Full name of method. 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville index: (int) 0-indexed index of the method inside the service. 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville containing_service: (ServiceDescriptor) The service that contains this 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville method. 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville input_type: The descriptor of the message that this method accepts. 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output_type: The descriptor of the message that this method returns. 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options: (descriptor_pb2.MethodOptions) Method options message or 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville None to use default method options. 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def __init__(self, name, full_name, index, containing_service, 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville input_type, output_type, options=None): 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """The arguments are as described in the description of MethodDescriptor 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville attributes above. 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Note that containing_service may be None, and may be set later if necessary. 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville super(MethodDescriptor, self).__init__(options, 'MethodOptions') 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.name = name 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.full_name = full_name 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.index = index 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.containing_service = containing_service 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.input_type = input_type 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.output_type = output_type 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 698d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass FileDescriptor(DescriptorBase): 699d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto. 700d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Note that enum_types_by_name, extensions_by_name, and dependencies 702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields are only set by the message_factory module, and not by the 703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson generated proto code. 704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 705d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville name: name of file, relative to root of source tree. 706d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville package: name of the package 707d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville serialized_pb: (str) Byte string of serialized 708d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville descriptor_pb2.FileDescriptorProto. 709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson dependencies: List of other FileDescriptors this FileDescriptor depends on. 710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message_types_by_name: Dict of message names of their descriptors. 711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum_types_by_name: Dict of enum names and their descriptors. 712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson extensions_by_name: Dict of extension names and their descriptors. 713d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """ 714d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def __init__(self, name, package, options=None, serialized_pb=None, 716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson dependencies=None): 717d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Constructor.""" 718d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville super(FileDescriptor, self).__init__(options, 'FileOptions') 719d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message_types_by_name = {} 721d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.name = name 722d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.package = package 723d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.serialized_pb = serialized_pb 724d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.enum_types_by_name = {} 726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.extensions_by_name = {} 727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.dependencies = (dependencies or []) 728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (api_implementation.Type() == 'cpp' and 730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.serialized_pb is not None): 731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if api_implementation.Version() == 2: 732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # pylint: disable=protected-access 733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson _message.Message._BuildFile(self.serialized_pb) 734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # pylint: enable=protected-access 735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson cpp_message.BuildFile(self.serialized_pb) 737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 738d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def CopyToProto(self, proto): 739d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """Copies this to a descriptor_pb2.FileDescriptorProto. 740d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 741d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Args: 742d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto: An empty descriptor_pb2.FileDescriptorProto. 743d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville """ 744d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto.ParseFromString(self.serialized_pb) 745d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 746d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef _ParseOptions(message, string): 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Parses serialized options. 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville This helper function is used to parse serialized options in generated 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 files. It must not be used outside proto2. 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.ParseFromString(string) 754d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return message 755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsondef MakeDescriptor(desc_proto, package='', build_file_if_cpp=True): 758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """Make a protobuf Descriptor given a DescriptorProto protobuf. 759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 760a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Handles nested descriptors. Note that this is limited to the scope of defining 761a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson a message inside of another message. Composite fields can currently only be 762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson resolved if the message is defined in the same scope as the field. 763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Args: 765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson desc_proto: The descriptor_pb2.DescriptorProto protobuf message. 766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson package: Optional package name for the new message Descriptor (string). 767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson build_file_if_cpp: Update the C++ descriptor pool if api matches. 768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Set to False on recursion, so no duplicates are created. 769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Returns: 770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson A Descriptor for protobuf messages. 771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """ 772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if api_implementation.Type() == 'cpp' and build_file_if_cpp: 773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # The C++ implementation requires all descriptors to be backed by the same 774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # definition in the C++ descriptor pool. To do this, we build a 775a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # FileDescriptorProto with the same definition as this descriptor and build 776a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # it into the pool. 777a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson from google.protobuf import descriptor_pb2 778a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_descriptor_proto = descriptor_pb2.FileDescriptorProto() 779a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_descriptor_proto.message_type.add().MergeFrom(desc_proto) 780a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 781a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Generate a random name for this proto file to prevent conflicts with 782a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # any imported ones. We need to specify a file name so BuildFile accepts 783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # our FileDescriptorProto, but it is not important what that file name 784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # is actually set to. 785a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson proto_name = str(uuid.uuid4()) 786a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 787a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if package: 788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_descriptor_proto.name = os.path.join(package.replace('.', '/'), 789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson proto_name + '.proto') 790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_descriptor_proto.package = package 791a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 792a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_descriptor_proto.name = proto_name + '.proto' 793a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if api_implementation.Version() == 2: 795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # pylint: disable=protected-access 796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson _message.Message._BuildFile(file_descriptor_proto.SerializeToString()) 797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # pylint: enable=protected-access 798a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 799a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson cpp_message.BuildFile(file_descriptor_proto.SerializeToString()) 800a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 801a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson full_message_name = [desc_proto.name] 802a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if package: full_message_name.insert(0, package) 803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 804a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Create Descriptors for enum types 805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum_types = {} 806a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for enum_proto in desc_proto.enum_type: 807a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson full_name = '.'.join(full_message_name + [enum_proto.name]) 808a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum_desc = EnumDescriptor( 809a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum_proto.name, full_name, None, [ 810a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EnumValueDescriptor(enum_val.name, ii, enum_val.number) 811a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for ii, enum_val in enumerate(enum_proto.value)]) 812a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum_types[full_name] = enum_desc 813a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 814a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Create Descriptors for nested types 815a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_types = {} 816a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for nested_proto in desc_proto.nested_type: 817a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson full_name = '.'.join(full_message_name + [nested_proto.name]) 818a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Nested types are just those defined inside of the message, not all types 819a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # used by fields in the message, so no loops are possible here. 820a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_desc = MakeDescriptor(nested_proto, 821a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson package='.'.join(full_message_name), 822a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson build_file_if_cpp=False) 823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_types[full_name] = nested_desc 824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields = [] 826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for field_proto in desc_proto.field: 827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson full_name = '.'.join(full_message_name + [field_proto.name]) 828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum_desc = None 829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_desc = None 830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if field_proto.HasField('type_name'): 831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson type_name = field_proto.type_name 832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson full_type_name = '.'.join(full_message_name + 833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson [type_name[type_name.rfind('.')+1:]]) 834a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if full_type_name in nested_types: 835a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_desc = nested_types[full_type_name] 836a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson elif full_type_name in enum_types: 837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum_desc = enum_types[full_type_name] 838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Else type_name references a non-local type, which isn't implemented 839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field = FieldDescriptor( 840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_proto.name, full_name, field_proto.number - 1, 841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_proto.number, field_proto.type, 842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type), 843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_proto.label, None, nested_desc, enum_desc, None, False, None, 844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson has_default_value=False) 845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields.append(field) 846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson desc_name = '.'.join(full_message_name) 848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return Descriptor(desc_proto.name, desc_name, None, None, fields, 849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_types.values(), enum_types.values(), []) 850