descriptor.py revision 5821806d5e7f356e8fa4b058a389a808ea183019
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':
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from google.protobuf.internal import cpp_message
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Error(Exception):
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Base error for this module."""
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescriptorBase(object):
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptors base class.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  This class is the base of all descriptor classes. It provides common options
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  related functionaility.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Attributes:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    has_options:  True if the descriptor has non-default options.  Usually it
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is not necessary to read this -- just call GetOptions() which will
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        happily return the default instance.  However, it's sometimes useful
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for efficiency, and also useful inside the protobuf implementation to
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        avoid some bootstrapping issues.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, options, options_class_name):
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Initialize the descriptor given its options message and the name of the
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class of the options message. The name of the class is required in case
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the options message is None and has to be created.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._options = options
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._options_class_name = options_class_name
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Does this descriptor have non-default options?
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.has_options = options is not None
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetOptions(self):
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Retrieves descriptor options.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This method returns the options set or creates the default options for the
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    descriptor.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self._options:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return self._options
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    from google.protobuf import descriptor_pb2
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options_class = getattr(descriptor_pb2, self._options_class_name)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except AttributeError:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise RuntimeError('Unknown options class name %s!' %
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         (self._options_class_name))
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._options = options_class()
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self._options
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class _NestedDescriptorBase(DescriptorBase):
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Common class for descriptors that can be nested."""
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, options, options_class_name, name, full_name,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               file, containing_type, serialized_start=None,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               serialized_end=None):
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Constructor.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options: Protocol message options or None
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to use default message options.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options_class_name: (str) The class name of the above options.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name: (str) Name of this protocol message type.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_name: (str) Fully-qualified name of this protocol message type,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        which will include protocol "package" name and the name of any
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enclosing types.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file: (FileDescriptor) Reference to file info.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      containing_type: if provided, this is a nested descriptor, with this
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        descriptor as parent, otherwise None.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      serialized_start: The start index (inclusive) in block in the
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.serialized_pb that describes this descriptor.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      serialized_end: The end index (exclusive) in block in the
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.serialized_pb that describes this descriptor.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(_NestedDescriptorBase, self).__init__(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options, options_class_name)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(falk): Add function to calculate full_name instead of having it in
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #             memory?
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.full_name = full_name
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.file = file
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.containing_type = containing_type
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_start = serialized_start
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_end = serialized_end
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetTopLevelContainingType(self):
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns the root if this is a nested type, or itself if its the root."""
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    desc = self
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while desc.containing_type is not None:
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      desc = desc.containing_type
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return desc
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to the matching proto in descriptor_pb2.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty proto instance from descriptor_pb2.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Raises:
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Error: If self couldnt be serialized, due to to few constructor arguments.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (self.file is not None and
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self._serialized_start is not None and
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self._serialized_end is not None):
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ParseFromString(self.file.serialized_pb[
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self._serialized_start:self._serialized_end])
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise Error('Descriptor does not contain serialization.')
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Descriptor(_NestedDescriptorBase):
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a protocol message type.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A Descriptor instance has the following attributes:
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of this protocol message type.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name: (str) Fully-qualified name of this protocol message type,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      which will include protocol "package" name and the name of any
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enclosing types.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containing_type: (Descriptor) Reference to the descriptor of the
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type containing us, or None if this is top-level.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fields: (list of FieldDescriptors) Field descriptors for all
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fields in this type.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as in |fields|, but indexed by "number" attribute in each
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FieldDescriptor.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as in |fields|, but indexed by "name" attribute in each
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FieldDescriptor.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_types: (list of Descriptors) Descriptor references
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for all protocol message types nested within this one.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_types_by_name: (dict str -> Descriptor) Same Descriptor
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as in |nested_types|, but indexed by "name" attribute
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in each Descriptor.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_types: (list of EnumDescriptors) EnumDescriptor references
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for all enums contained within this type.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as in |enum_types|, but indexed by "name" attribute
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in each EnumDescriptor.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      from enum value name to EnumValueDescriptor for that value.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions: (list of FieldDescriptor) All extensions defined directly
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      within this message type (NOT within a nested type).
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as |extensions|, but indexed by "name" attribute of each
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FieldDescriptor.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_extendable:  Does this type define any extension ranges?
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.MessageOptions) Protocol message options or None
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      to use default message options.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file: (FileDescriptor) Reference to file descriptor.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, filename, containing_type, fields,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               nested_types, enum_types, extensions, options=None,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               is_extendable=True, extension_ranges=None, file=None,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               serialized_start=None, serialized_end=None):
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Arguments to __init__() are as described in the description
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    of Descriptor fields above.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Note that filename is an obsolete argument, that is not used anymore.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Please use file.name to access this as an attribute.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(Descriptor, self).__init__(
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options, 'MessageOptions', name, full_name, file,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        containing_type, serialized_start=serialized_start,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        serialized_end=serialized_start)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # We have fields in addition to fields_by_name and fields_by_number,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # so that:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   1. Clients can index fields by "order in which they're listed."
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   2. Clients can easily iterate over all fields with the terse
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #      syntax: for f in descriptor.fields: ...
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.fields = fields
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for field in self.fields:
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      field.containing_type = self
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.fields_by_number = dict((f.number, f) for f in fields)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.fields_by_name = dict((f.name, f) for f in fields)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.nested_types = nested_types
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.nested_types_by_name = dict((t.name, t) for t in nested_types)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.enum_types = enum_types
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for enum_type in self.enum_types:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enum_type.containing_type = self
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.enum_types_by_name = dict((t.name, t) for t in enum_types)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.enum_values_by_name = dict(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (v.name, v) for t in enum_types for v in t.values)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extensions = extensions
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for extension in self.extensions:
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension.extension_scope = self
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extensions_by_name = dict((f.name, f) for f in extensions)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.is_extendable = is_extendable
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extension_ranges = extension_ranges
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_start = serialized_start
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_end = serialized_end
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to a descriptor_pb2.DescriptorProto.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty descriptor_pb2.DescriptorProto.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This function is overriden to give a better doc comment.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(Descriptor, self).CopyToProto(proto)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# TODO(robinson): We should have aggressive checking here,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# for example:
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * If you specify a repeated field, you should not be allowed
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     to specify a default value.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * [Other examples here as needed].
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# TODO(robinson): for this and other *Descriptor classes, we
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# might also want to lock things down aggressively (e.g.,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# prevent clients from setting the attributes).  Having
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# stronger invariants here in general will reduce the number
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# of runtime checks we must do in reflection.py...
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FieldDescriptor(DescriptorBase):
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a single field in a .proto file.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A FieldDescriptor instance has the following attriubtes:
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of this field, exactly as it appears in .proto.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name: (str) Name of this field, including containing scope.  This is
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      particularly relevant for extensions.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index: (int) Dense, 0-indexed index giving the order that this
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      field textually appears within its message in the .proto file.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number: (int) Tag number declared for this field in the .proto file.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type: (One of the TYPE_* constants below) Declared type.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cpp_type: (One of the CPPTYPE_* constants below) C++ type used to
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      represent this field.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label: (One of the LABEL_* constants below) Tells whether this
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      field is optional, required, or repeated.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    has_default_value: (bool) True if this field has a default value defined,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      otherwise false.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_value: (Varies) Default value of this field.  Only
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      meaningful for non-repeated scalar fields.  Repeated fields
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      should always set this to [], and non-repeated composite
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fields should always set this to None.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containing_type: (Descriptor) Descriptor of the protocol message
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type that contains this field.  Set by the Descriptor constructor
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if we're passed into one.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Somewhat confusingly, for extension fields, this is the
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      descriptor of the EXTENDED message, not the descriptor
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      of the message containing this field.  (See is_extension and
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_scope below).
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_type: (Descriptor) If a composite field, a descriptor
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      of the message type contained in this field.  Otherwise, this is None.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_type: (EnumDescriptor) If this field contains an enum, a
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      descriptor of that enum.  Otherwise, this is None.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_extension: True iff this describes an extension field.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_scope: (Descriptor) Only meaningful if is_extension is True.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Gives the message that immediately contains this extension field.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Will be None iff we're a top-level (file-level) extension field.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.FieldOptions) Protocol message field options or
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      None to use default field options.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Must be consistent with C++ FieldDescriptor::Type enum in
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # descriptor.h.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # TODO(robinson): Find a way to eliminate this repetition.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_DOUBLE         = 1
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_FLOAT          = 2
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_INT64          = 3
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_UINT64         = 4
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_INT32          = 5
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_FIXED64        = 6
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_FIXED32        = 7
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_BOOL           = 8
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_STRING         = 9
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_GROUP          = 10
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_MESSAGE        = 11
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_BYTES          = 12
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_UINT32         = 13
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_ENUM           = 14
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SFIXED32       = 15
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SFIXED64       = 16
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SINT32         = 17
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SINT64         = 18
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_TYPE            = 18
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Must be consistent with C++ FieldDescriptor::CppType enum in
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # descriptor.h.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # TODO(robinson): Find a way to eliminate this repetition.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT32       = 1
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT64       = 2
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_UINT32      = 3
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_UINT64      = 4
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_DOUBLE      = 5
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_FLOAT       = 6
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_BOOL        = 7
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_ENUM        = 8
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_STRING      = 9
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_MESSAGE     = 10
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_CPPTYPE         = 10
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Must be consistent with C++ FieldDescriptor::Label enum in
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # descriptor.h.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # TODO(robinson): Find a way to eliminate this repetition.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LABEL_OPTIONAL      = 1
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LABEL_REQUIRED      = 2
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LABEL_REPEATED      = 3
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_LABEL           = 3
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, index, number, type, cpp_type, label,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               default_value, message_type, enum_type, containing_type,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               is_extension, extension_scope, options=None,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               has_default_value=True):
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """The arguments are as described in the description of FieldDescriptor
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attributes above.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Note that containing_type may be None, and may be set later if necessary
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (to deal with circular references between message types, for example).
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Likewise for extension_scope.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(FieldDescriptor, self).__init__(options, 'FieldOptions')
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.full_name = full_name
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.index = index
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.number = number
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type = type
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.cpp_type = cpp_type
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.label = label
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.has_default_value = has_default_value
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.default_value = default_value
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.containing_type = containing_type
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.message_type = message_type
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.enum_type = enum_type
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.is_extension = is_extension
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extension_scope = extension_scope
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() == 'cpp':
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if is_extension:
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self._cdescriptor = cpp_message.GetFieldDescriptor(full_name)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self._cdescriptor = None
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumDescriptor(_NestedDescriptorBase):
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for an enum defined in a .proto file.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  An EnumDescriptor instance has the following attributes:
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of the enum type.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name: (str) Full name of the type, including package name
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      and any enclosing type(s).
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values: (list of EnumValueDescriptors) List of the values
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in this enum.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_by_name: (dict str -> EnumValueDescriptor) Same as |values|,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      but indexed by the "name" field of each EnumValueDescriptor.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_by_number: (dict int -> EnumValueDescriptor) Same as |values|,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      but indexed by the "number" field of each EnumValueDescriptor.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containing_type: (Descriptor) Descriptor of the immediate containing
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type of this enum, or None if this is an enum defined at the
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      top level in a .proto file.  Set by Descriptor's constructor
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if we're passed into one.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file: (FileDescriptor) Reference to file descriptor.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.EnumOptions) Enum options message or
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      None to use default enum options.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, filename, values,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               containing_type=None, options=None, file=None,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               serialized_start=None, serialized_end=None):
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Arguments are as described in the attribute description above.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Note that filename is an obsolete argument, that is not used anymore.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Please use file.name to access this as an attribute.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(EnumDescriptor, self).__init__(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options, 'EnumOptions', name, full_name, file,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        containing_type, serialized_start=serialized_start,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        serialized_end=serialized_start)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.values = values
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value in self.values:
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value.type = self
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.values_by_name = dict((v.name, v) for v in values)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.values_by_number = dict((v.number, v) for v in values)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_start = serialized_start
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_end = serialized_end
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to a descriptor_pb2.EnumDescriptorProto.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty descriptor_pb2.EnumDescriptorProto.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This function is overriden to give a better doc comment.
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(EnumDescriptor, self).CopyToProto(proto)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumValueDescriptor(DescriptorBase):
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a single value within an enum.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of this value.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index: (int) Dense, 0-indexed index giving the order that this
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value appears textually within its enum in the .proto file.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number: (int) Actual number assigned to this enum value.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type: (EnumDescriptor) EnumDescriptor to which this value
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      belongs.  Set by EnumDescriptor's constructor if we're
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      passed into one.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.EnumValueOptions) Enum value options message or
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      None to use default enum value options options.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, index, number, type=None, options=None):
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Arguments are as described in the attribute description above."""
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions')
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.index = index
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.number = number
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type = type
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceDescriptor(_NestedDescriptorBase):
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a service.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of the service.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name: (str) Full name of the service, including package name.
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index: (int) 0-indexed index giving the order that this services
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      definition appears withing the .proto file.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    methods: (list of MethodDescriptor) List of methods provided by this
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service.
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.ServiceOptions) Service options message or
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      None to use default service options.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file: (FileDescriptor) Reference to file info.
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, index, methods, options=None, file=None,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               serialized_start=None, serialized_end=None):
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(ServiceDescriptor, self).__init__(
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options, 'ServiceOptions', name, full_name, file,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        None, serialized_start=serialized_start,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        serialized_end=serialized_end)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.index = index
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.methods = methods
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Set the containing service for each method in this service.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for method in self.methods:
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      method.containing_service = self
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def FindMethodByName(self, name):
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Searches for the specified method, and returns its descriptor."""
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for method in self.methods:
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if name == method.name:
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return method
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to a descriptor_pb2.ServiceDescriptorProto.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty descriptor_pb2.ServiceDescriptorProto.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This function is overriden to give a better doc comment.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(ServiceDescriptor, self).CopyToProto(proto)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MethodDescriptor(DescriptorBase):
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a method in a service.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name: (str) Name of the method within the service.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  full_name: (str) Full name of method.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index: (int) 0-indexed index of the method inside the service.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  containing_service: (ServiceDescriptor) The service that contains this
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    method.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_type: The descriptor of the message that this method accepts.
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output_type: The descriptor of the message that this method returns.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options: (descriptor_pb2.MethodOptions) Method options message or
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    None to use default method options.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, index, containing_service,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               input_type, output_type, options=None):
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """The arguments are as described in the description of MethodDescriptor
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attributes above.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Note that containing_service may be None, and may be set later if necessary.
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(MethodDescriptor, self).__init__(options, 'MethodOptions')
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.full_name = full_name
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.index = index
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.containing_service = containing_service
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.input_type = input_type
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.output_type = output_type
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileDescriptor(DescriptorBase):
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name: name of file, relative to root of source tree.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  package: name of the package
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  serialized_pb: (str) Byte string of serialized
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    descriptor_pb2.FileDescriptorProto.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, package, options=None, serialized_pb=None):
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Constructor."""
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(FileDescriptor, self).__init__(options, 'FileOptions')
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.message_types_by_name = {}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.package = package
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.serialized_pb = serialized_pb
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (api_implementation.Type() == 'cpp' and
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.serialized_pb is not None):
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cpp_message.BuildFile(self.serialized_pb)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to a descriptor_pb2.FileDescriptorProto.
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty descriptor_pb2.FileDescriptorProto.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ParseFromString(self.serialized_pb)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _ParseOptions(message, string):
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Parses serialized options.
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  This helper function is used to parse serialized options in generated
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto2 files. It must not be used outside proto2.
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message.ParseFromString(string)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message
599