15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Protocol Buffers - Google's data interchange format 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2008 Google Inc. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# http://code.google.com/p/protobuf/ 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions are 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# met: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Redistributions of source code must retain the above copyright 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# notice, this list of conditions and the following disclaimer. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Redistributions in binary form must reproduce the above 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the documentation and/or other materials provided with the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distribution. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Neither the name of Google Inc. nor the names of its 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# contributors may be used to endorse or promote products derived from 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this software without specific prior written permission. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Descriptors essentially contain exactly the information found in a .proto 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)file, in types that make this information accessible in Python. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__author__ = 'robinson@google.com (Will Robinson)' 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import api_implementation 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if api_implementation.Type() == 'cpp': 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if api_implementation.Version() == 2: 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch from google.protobuf.internal.cpp import _message 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch else: 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch from google.protobuf.internal import cpp_message 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Error(Exception): 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Base error for this module.""" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass TypeTransformationError(Error): 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """Error transforming between python proto type and corresponding C++ type.""" 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescriptorBase(object): 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Descriptors base class. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This class is the base of all descriptor classes. It provides common options 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) related functionaility. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Attributes: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_options: True if the descriptor has non-default options. Usually it 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is not necessary to read this -- just call GetOptions() which will 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) happily return the default instance. However, it's sometimes useful 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for efficiency, and also useful inside the protobuf implementation to 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avoid some bootstrapping issues. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, options, options_class_name): 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Initialize the descriptor given its options message and the name of the 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class of the options message. The name of the class is required in case 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the options message is None and has to be created. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._options = options 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._options_class_name = options_class_name 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Does this descriptor have non-default options? 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.has_options = options is not None 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def _SetOptions(self, options, options_class_name): 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """Sets the descriptor's options 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch This function is used in generated proto2 files to update descriptor 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch options. It must not be used outside proto2. 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """ 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self._options = options 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self._options_class_name = options_class_name 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # Does this descriptor have non-default options? 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.has_options = options is not None 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def GetOptions(self): 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Retrieves descriptor options. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This method returns the options set or creates the default options for the 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) descriptor. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self._options: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self._options 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from google.protobuf import descriptor_pb2 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options_class = getattr(descriptor_pb2, self._options_class_name) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except AttributeError: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raise RuntimeError('Unknown options class name %s!' % 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (self._options_class_name)) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._options = options_class() 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self._options 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class _NestedDescriptorBase(DescriptorBase): 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Common class for descriptors that can be nested.""" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, options, options_class_name, name, full_name, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file, containing_type, serialized_start=None, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_end=None): 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Constructor. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Args: 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options: Protocol message options or None 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to use default message options. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options_class_name: (str) The class name of the above options. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name: (str) Name of this protocol message type. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_name: (str) Fully-qualified name of this protocol message type, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) which will include protocol "package" name and the name of any 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enclosing types. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file: (FileDescriptor) Reference to file info. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type: if provided, this is a nested descriptor, with this 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) descriptor as parent, otherwise None. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_start: The start index (inclusive) in block in the 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file.serialized_pb that describes this descriptor. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_end: The end index (exclusive) in block in the 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file.serialized_pb that describes this descriptor. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(_NestedDescriptorBase, self).__init__( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options, options_class_name) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.name = name 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(falk): Add function to calculate full_name instead of having it in 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # memory? 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.full_name = full_name 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.file = file 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.containing_type = containing_type 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_start = serialized_start 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_end = serialized_end 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def GetTopLevelContainingType(self): 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Returns the root if this is a nested type, or itself if its the root.""" 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desc = self 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while desc.containing_type is not None: 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desc = desc.containing_type 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return desc 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def CopyToProto(self, proto): 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Copies this to the matching proto in descriptor_pb2. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Args: 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto: An empty proto instance from descriptor_pb2. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Raises: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Error: If self couldnt be serialized, due to to few constructor arguments. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (self.file is not None and 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_start is not None and 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_end is not None): 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ParseFromString(self.file.serialized_pb[ 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_start:self._serialized_end]) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raise Error('Descriptor does not contain serialization.') 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Descriptor(_NestedDescriptorBase): 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Descriptor for a protocol message type. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A Descriptor instance has the following attributes: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name: (str) Name of this protocol message type. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_name: (str) Fully-qualified name of this protocol message type, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) which will include protocol "package" name and the name of any 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enclosing types. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type: (Descriptor) Reference to the descriptor of the 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type containing us, or None if this is top-level. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fields: (list of FieldDescriptors) Field descriptors for all 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fields in this type. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objects as in |fields|, but indexed by "number" attribute in each 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldDescriptor. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objects as in |fields|, but indexed by "name" attribute in each 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldDescriptor. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_types: (list of Descriptors) Descriptor references 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for all protocol message types nested within this one. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_types_by_name: (dict str -> Descriptor) Same Descriptor 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objects as in |nested_types|, but indexed by "name" attribute 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in each Descriptor. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_types: (list of EnumDescriptors) EnumDescriptor references 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for all enums contained within this type. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objects as in |enum_types|, but indexed by "name" attribute 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in each EnumDescriptor. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from enum value name to EnumValueDescriptor for that value. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions: (list of FieldDescriptor) All extensions defined directly 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) within this message type (NOT within a nested type). 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objects as |extensions|, but indexed by "name" attribute of each 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldDescriptor. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_extendable: Does this type define any extension ranges? 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options: (descriptor_pb2.MessageOptions) Protocol message options or None 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to use default message options. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file: (FileDescriptor) Reference to file descriptor. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, name, full_name, filename, containing_type, fields, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_types, enum_types, extensions, options=None, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_extendable=True, extension_ranges=None, file=None, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_start=None, serialized_end=None): 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Arguments to __init__() are as described in the description 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) of Descriptor fields above. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Note that filename is an obsolete argument, that is not used anymore. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Please use file.name to access this as an attribute. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(Descriptor, self).__init__( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options, 'MessageOptions', name, full_name, file, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type, serialized_start=serialized_start, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_end=serialized_start) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # We have fields in addition to fields_by_name and fields_by_number, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # so that: 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 1. Clients can index fields by "order in which they're listed." 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2. Clients can easily iterate over all fields with the terse 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # syntax: for f in descriptor.fields: ... 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.fields = fields 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for field in self.fields: 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.containing_type = self 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.fields_by_number = dict((f.number, f) for f in fields) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.fields_by_name = dict((f.name, f) for f in fields) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.nested_types = nested_types 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.nested_types_by_name = dict((t.name, t) for t in nested_types) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.enum_types = enum_types 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for enum_type in self.enum_types: 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_type.containing_type = self 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.enum_types_by_name = dict((t.name, t) for t in enum_types) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.enum_values_by_name = dict( 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (v.name, v) for t in enum_types for v in t.values) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extensions = extensions 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for extension in self.extensions: 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension.extension_scope = self 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extensions_by_name = dict((f.name, f) for f in extensions) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.is_extendable = is_extendable 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extension_ranges = extension_ranges 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_start = serialized_start 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_end = serialized_end 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def EnumValueName(self, enum, value): 273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """Returns the string name of an enum value. 274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch This is just a small helper method to simplify a common operation. 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Args: 278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch enum: string name of the Enum. 279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value: int, value of the enum. 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Returns: 282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch string name of the enum value. 283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Raises: 285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch KeyError if either the Enum doesn't exist or the value is not a valid 286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value for the enum. 287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """ 288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return self.enum_types_by_name[enum].values_by_number[value].name 289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def CopyToProto(self, proto): 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Copies this to a descriptor_pb2.DescriptorProto. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Args: 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto: An empty descriptor_pb2.DescriptorProto. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This function is overriden to give a better doc comment. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(Descriptor, self).CopyToProto(proto) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# TODO(robinson): We should have aggressive checking here, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# for example: 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * If you specify a repeated field, you should not be allowed 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# to specify a default value. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * [Other examples here as needed]. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# TODO(robinson): for this and other *Descriptor classes, we 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# might also want to lock things down aggressively (e.g., 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# prevent clients from setting the attributes). Having 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# stronger invariants here in general will reduce the number 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# of runtime checks we must do in reflection.py... 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FieldDescriptor(DescriptorBase): 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Descriptor for a single field in a .proto file. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch A FieldDescriptor instance has the following attributes: 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name: (str) Name of this field, exactly as it appears in .proto. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_name: (str) Name of this field, including containing scope. This is 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) particularly relevant for extensions. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index: (int) Dense, 0-indexed index giving the order that this 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field textually appears within its message in the .proto file. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number: (int) Tag number declared for this field in the .proto file. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type: (One of the TYPE_* constants below) Declared type. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cpp_type: (One of the CPPTYPE_* constants below) C++ type used to 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) represent this field. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label: (One of the LABEL_* constants below) Tells whether this 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field is optional, required, or repeated. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_default_value: (bool) True if this field has a default value defined, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otherwise false. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_value: (Varies) Default value of this field. Only 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meaningful for non-repeated scalar fields. Repeated fields 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should always set this to [], and non-repeated composite 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fields should always set this to None. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type: (Descriptor) Descriptor of the protocol message 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type that contains this field. Set by the Descriptor constructor 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if we're passed into one. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Somewhat confusingly, for extension fields, this is the 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) descriptor of the EXTENDED message, not the descriptor 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) of the message containing this field. (See is_extension and 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_scope below). 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_type: (Descriptor) If a composite field, a descriptor 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) of the message type contained in this field. Otherwise, this is None. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_type: (EnumDescriptor) If this field contains an enum, a 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) descriptor of that enum. Otherwise, this is None. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_extension: True iff this describes an extension field. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_scope: (Descriptor) Only meaningful if is_extension is True. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Gives the message that immediately contains this extension field. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Will be None iff we're a top-level (file-level) extension field. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options: (descriptor_pb2.FieldOptions) Protocol message field options or 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) None to use default field options. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Must be consistent with C++ FieldDescriptor::Type enum in 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # descriptor.h. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(robinson): Find a way to eliminate this repetition. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_DOUBLE = 1 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_FLOAT = 2 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_INT64 = 3 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_UINT64 = 4 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_INT32 = 5 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_FIXED64 = 6 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_FIXED32 = 7 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_BOOL = 8 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_STRING = 9 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_GROUP = 10 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_MESSAGE = 11 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_BYTES = 12 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_UINT32 = 13 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_ENUM = 14 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_SFIXED32 = 15 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_SFIXED64 = 16 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_SINT32 = 17 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_SINT64 = 18 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAX_TYPE = 18 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Must be consistent with C++ FieldDescriptor::CppType enum in 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # descriptor.h. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(robinson): Find a way to eliminate this repetition. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_INT32 = 1 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_INT64 = 2 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_UINT32 = 3 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_UINT64 = 4 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_DOUBLE = 5 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_FLOAT = 6 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_BOOL = 7 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_ENUM = 8 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_STRING = 9 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_MESSAGE = 10 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAX_CPPTYPE = 10 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch _PYTHON_TO_CPP_PROTO_TYPE_MAP = { 399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_DOUBLE: CPPTYPE_DOUBLE, 400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_FLOAT: CPPTYPE_FLOAT, 401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_ENUM: CPPTYPE_ENUM, 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_INT64: CPPTYPE_INT64, 403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_SINT64: CPPTYPE_INT64, 404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_SFIXED64: CPPTYPE_INT64, 405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_UINT64: CPPTYPE_UINT64, 406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_FIXED64: CPPTYPE_UINT64, 407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_INT32: CPPTYPE_INT32, 408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_SFIXED32: CPPTYPE_INT32, 409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_SINT32: CPPTYPE_INT32, 410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_UINT32: CPPTYPE_UINT32, 411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_FIXED32: CPPTYPE_UINT32, 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_BYTES: CPPTYPE_STRING, 413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_STRING: CPPTYPE_STRING, 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_BOOL: CPPTYPE_BOOL, 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_MESSAGE: CPPTYPE_MESSAGE, 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TYPE_GROUP: CPPTYPE_MESSAGE 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Must be consistent with C++ FieldDescriptor::Label enum in 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # descriptor.h. 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(robinson): Find a way to eliminate this repetition. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LABEL_OPTIONAL = 1 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LABEL_REQUIRED = 2 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LABEL_REPEATED = 3 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAX_LABEL = 3 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, name, full_name, index, number, type, cpp_type, label, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_value, message_type, enum_type, containing_type, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_extension, extension_scope, options=None, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_default_value=True): 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """The arguments are as described in the description of FieldDescriptor 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attributes above. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Note that containing_type may be None, and may be set later if necessary 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (to deal with circular references between message types, for example). 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Likewise for extension_scope. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(FieldDescriptor, self).__init__(options, 'FieldOptions') 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.name = name 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.full_name = full_name 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.index = index 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.number = number 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.type = type 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.cpp_type = cpp_type 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.label = label 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.has_default_value = has_default_value 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.default_value = default_value 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.containing_type = containing_type 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.message_type = message_type 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.enum_type = enum_type 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.is_extension = is_extension 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extension_scope = extension_scope 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if api_implementation.Type() == 'cpp': 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if is_extension: 456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if api_implementation.Version() == 2: 457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self._cdescriptor = _message.GetExtensionDescriptor(full_name) 458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch else: 459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if api_implementation.Version() == 2: 462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self._cdescriptor = _message.GetFieldDescriptor(full_name) 463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch else: 464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self._cdescriptor = cpp_message.GetFieldDescriptor(full_name) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._cdescriptor = None 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch @staticmethod 469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def ProtoTypeToCppProtoType(proto_type): 470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """Converts from a Python proto type to a C++ Proto Type. 471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch The Python ProtocolBuffer classes specify both the 'Python' datatype and the 473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'C++' datatype - and they're not the same. This helper method should 474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch translate from one to another. 475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Args: 477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto_type: the Python proto type (descriptor.FieldDescriptor.TYPE_*) 478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Returns: 479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch descriptor.FieldDescriptor.CPPTYPE_*, the C++ type. 480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Raises: 481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TypeTransformationError: when the Python proto type isn't known. 482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """ 483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch try: 484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return FieldDescriptor._PYTHON_TO_CPP_PROTO_TYPE_MAP[proto_type] 485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch except KeyError: 486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch raise TypeTransformationError('Unknown proto_type: %s' % proto_type) 487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumDescriptor(_NestedDescriptorBase): 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Descriptor for an enum defined in a .proto file. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) An EnumDescriptor instance has the following attributes: 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name: (str) Name of the enum type. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_name: (str) Full name of the type, including package name 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) and any enclosing type(s). 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values: (list of EnumValueDescriptors) List of the values 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in this enum. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values_by_name: (dict str -> EnumValueDescriptor) Same as |values|, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) but indexed by the "name" field of each EnumValueDescriptor. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values_by_number: (dict int -> EnumValueDescriptor) Same as |values|, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) but indexed by the "number" field of each EnumValueDescriptor. 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type: (Descriptor) Descriptor of the immediate containing 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type of this enum, or None if this is an enum defined at the 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top level in a .proto file. Set by Descriptor's constructor 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if we're passed into one. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file: (FileDescriptor) Reference to file descriptor. 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options: (descriptor_pb2.EnumOptions) Enum options message or 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) None to use default enum options. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, name, full_name, filename, values, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type=None, options=None, file=None, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_start=None, serialized_end=None): 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Arguments are as described in the attribute description above. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Note that filename is an obsolete argument, that is not used anymore. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Please use file.name to access this as an attribute. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(EnumDescriptor, self).__init__( 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options, 'EnumOptions', name, full_name, file, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type, serialized_start=serialized_start, 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_end=serialized_start) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.values = values 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for value in self.values: 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.type = self 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.values_by_name = dict((v.name, v) for v in values) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.values_by_number = dict((v.number, v) for v in values) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_start = serialized_start 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._serialized_end = serialized_end 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def CopyToProto(self, proto): 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Copies this to a descriptor_pb2.EnumDescriptorProto. 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Args: 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto: An empty descriptor_pb2.EnumDescriptorProto. 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This function is overriden to give a better doc comment. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(EnumDescriptor, self).CopyToProto(proto) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumValueDescriptor(DescriptorBase): 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Descriptor for a single value within an enum. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name: (str) Name of this value. 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index: (int) Dense, 0-indexed index giving the order that this 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value appears textually within its enum in the .proto file. 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number: (int) Actual number assigned to this enum value. 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type: (EnumDescriptor) EnumDescriptor to which this value 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) belongs. Set by EnumDescriptor's constructor if we're 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) passed into one. 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options: (descriptor_pb2.EnumValueOptions) Enum value options message or 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) None to use default enum value options options. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, name, index, number, type=None, options=None): 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Arguments are as described in the attribute description above.""" 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions') 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.name = name 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.index = index 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.number = number 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.type = type 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceDescriptor(_NestedDescriptorBase): 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Descriptor for a service. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name: (str) Name of the service. 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_name: (str) Full name of the service, including package name. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index: (int) 0-indexed index giving the order that this services 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) definition appears withing the .proto file. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) methods: (list of MethodDescriptor) List of methods provided by this 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service. 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options: (descriptor_pb2.ServiceOptions) Service options message or 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) None to use default service options. 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file: (FileDescriptor) Reference to file info. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, name, full_name, index, methods, options=None, file=None, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_start=None, serialized_end=None): 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(ServiceDescriptor, self).__init__( 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options, 'ServiceOptions', name, full_name, file, 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) None, serialized_start=serialized_start, 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_end=serialized_end) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.index = index 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.methods = methods 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Set the containing service for each method in this service. 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for method in self.methods: 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method.containing_service = self 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def FindMethodByName(self, name): 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Searches for the specified method, and returns its descriptor.""" 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for method in self.methods: 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if name == method.name: 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return method 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return None 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def CopyToProto(self, proto): 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Copies this to a descriptor_pb2.ServiceDescriptorProto. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Args: 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto: An empty descriptor_pb2.ServiceDescriptorProto. 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This function is overriden to give a better doc comment. 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(ServiceDescriptor, self).CopyToProto(proto) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MethodDescriptor(DescriptorBase): 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Descriptor for a method in a service. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name: (str) Name of the method within the service. 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_name: (str) Full name of method. 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index: (int) 0-indexed index of the method inside the service. 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_service: (ServiceDescriptor) The service that contains this 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method. 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_type: The descriptor of the message that this method accepts. 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_type: The descriptor of the message that this method returns. 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options: (descriptor_pb2.MethodOptions) Method options message or 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) None to use default method options. 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, name, full_name, index, containing_service, 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_type, output_type, options=None): 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """The arguments are as described in the description of MethodDescriptor 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attributes above. 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Note that containing_service may be None, and may be set later if necessary. 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(MethodDescriptor, self).__init__(options, 'MethodOptions') 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.name = name 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.full_name = full_name 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.index = index 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.containing_service = containing_service 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.input_type = input_type 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.output_type = output_type 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileDescriptor(DescriptorBase): 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name: name of file, relative to root of source tree. 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) package: name of the package 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_pb: (str) Byte string of serialized 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) descriptor_pb2.FileDescriptorProto. 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, name, package, options=None, serialized_pb=None): 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Constructor.""" 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(FileDescriptor, self).__init__(options, 'FileOptions') 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.message_types_by_name = {} 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.name = name 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.package = package 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.serialized_pb = serialized_pb 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (api_implementation.Type() == 'cpp' and 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.serialized_pb is not None): 664ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if api_implementation.Version() == 2: 665ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch _message.BuildFile(self.serialized_pb) 666ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch else: 667ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch cpp_message.BuildFile(self.serialized_pb) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def CopyToProto(self, proto): 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Copies this to a descriptor_pb2.FileDescriptorProto. 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Args: 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto: An empty descriptor_pb2.FileDescriptorProto. 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ParseFromString(self.serialized_pb) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _ParseOptions(message, string): 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Parses serialized options. 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This helper function is used to parse serialized options in generated 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 files. It must not be used outside proto2. 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.ParseFromString(string) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message 686ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochdef MakeDescriptor(desc_proto, package=''): 689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """Make a protobuf Descriptor given a DescriptorProto protobuf. 690ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Args: 692ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc_proto: The descriptor_pb2.DescriptorProto protobuf message. 693ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch package: Optional package name for the new message Descriptor (string). 694ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 695ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Returns: 696ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch A Descriptor for protobuf messages. 697ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch """ 698ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch full_message_name = [desc_proto.name] 699ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if package: full_message_name.insert(0, package) 700ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch fields = [] 701ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for field_proto in desc_proto.field: 702ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch full_name = '.'.join(full_message_name + [field_proto.name]) 703ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field = FieldDescriptor( 704ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field_proto.name, full_name, field_proto.number - 1, 705ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field_proto.number, field_proto.type, 706ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type), 707ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field_proto.label, None, None, None, None, False, None, 708ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch has_default_value=False) 709ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch fields.append(field) 710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 711ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc_name = '.'.join(full_message_name) 712ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return Descriptor(desc_proto.name, desc_name, None, None, fields, 713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch [], [], []) 714