1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): We probably need to provide deep-copy methods for
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# descriptor types.  When a FieldDescriptor is passed into
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Descriptor.__init__(), we should make a deep copy and then set
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# containing_type on it.  Alternatively, we could just get
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# rid of containing_type (iit's not needed for reflection.py, at least).
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): Print method?
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): Useful __repr__?
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Descriptors essentially contain exactly the information found in a .proto
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefile, in types that make this information accessible in Python.
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'robinson@google.com (Will Robinson)'
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
48d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass Error(Exception):
49d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """Base error for this module."""
50d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
51d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorBase(object):
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptors base class.
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  This class is the base of all descriptor classes. It provides common options
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  related functionaility.
58d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
59d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  Attributes:
60d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    has_options:  True if the descriptor has non-default options.  Usually it
61d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        is not necessary to read this -- just call GetOptions() which will
62d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        happily return the default instance.  However, it's sometimes useful
63d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        for efficiency, and also useful inside the protobuf implementation to
64d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        avoid some bootstrapping issues.
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, options, options_class_name):
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Initialize the descriptor given its options message and the name of the
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class of the options message. The name of the class is required in case
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    the options message is None and has to be created.
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._options = options
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._options_class_name = options_class_name
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
75d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # Does this descriptor have non-default options?
76d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.has_options = options is not None
77d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def GetOptions(self):
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Retrieves descriptor options.
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    This method returns the options set or creates the default options for the
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descriptor.
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if self._options:
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return self._options
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    from google.protobuf import descriptor_pb2
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      options_class = getattr(descriptor_pb2, self._options_class_name)
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except AttributeError:
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      raise RuntimeError('Unknown options class name %s!' %
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         (self._options_class_name))
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._options = options_class()
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return self._options
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
96d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass _NestedDescriptorBase(DescriptorBase):
97d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """Common class for descriptors that can be nested."""
98d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __init__(self, options, options_class_name, name, full_name,
100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               file, containing_type, serialized_start=None,
101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               serialized_end=None):
102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Constructor.
103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
105d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      options: Protocol message options or None
106d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        to use default message options.
107d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      options_class_name: (str) The class name of the above options.
108d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
109d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      name: (str) Name of this protocol message type.
110d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      full_name: (str) Fully-qualified name of this protocol message type,
111d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        which will include protocol "package" name and the name of any
112d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        enclosing types.
113d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      file: (FileDescriptor) Reference to file info.
114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      containing_type: if provided, this is a nested descriptor, with this
115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        descriptor as parent, otherwise None.
116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      serialized_start: The start index (inclusive) in block in the
117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        file.serialized_pb that describes this descriptor.
118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      serialized_end: The end index (exclusive) in block in the
119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        file.serialized_pb that describes this descriptor.
120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(_NestedDescriptorBase, self).__init__(
122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        options, options_class_name)
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.name = name
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # TODO(falk): Add function to calculate full_name instead of having it in
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    #             memory?
127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.full_name = full_name
128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.file = file
129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.containing_type = containing_type
130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._serialized_start = serialized_start
132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._serialized_end = serialized_end
133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def GetTopLevelContainingType(self):
135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Returns the root if this is a nested type, or itself if its the root."""
136d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    desc = self
137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    while desc.containing_type is not None:
138d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      desc = desc.containing_type
139d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return desc
140d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to the matching proto in descriptor_pb2.
143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
145d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty proto instance from descriptor_pb2.
146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
147d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Raises:
148d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      Error: If self couldnt be serialized, due to to few constructor arguments.
149d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
150d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if (self.file is not None and
151d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        self._serialized_start is not None and
152d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        self._serialized_end is not None):
153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto.ParseFromString(self.file.serialized_pb[
154d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          self._serialized_start:self._serialized_end])
155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    else:
156d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      raise Error('Descriptor does not contain serialization.')
157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass Descriptor(_NestedDescriptorBase):
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a protocol message type.
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  A Descriptor instance has the following attributes:
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of this protocol message type.
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_name: (str) Fully-qualified name of this protocol message type,
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      which will include protocol "package" name and the name of any
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      enclosing types.
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    containing_type: (Descriptor) Reference to the descriptor of the
171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      type containing us, or None if this is top-level.
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields: (list of FieldDescriptors) Field descriptors for all
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      fields in this type.
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as in |fields|, but indexed by "number" attribute in each
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FieldDescriptor.
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as in |fields|, but indexed by "name" attribute in each
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FieldDescriptor.
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    nested_types: (list of Descriptors) Descriptor references
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      for all protocol message types nested within this one.
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    nested_types_by_name: (dict str -> Descriptor) Same Descriptor
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as in |nested_types|, but indexed by "name" attribute
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      in each Descriptor.
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum_types: (list of EnumDescriptors) EnumDescriptor references
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      for all enums contained within this type.
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as in |enum_types|, but indexed by "name" attribute
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      in each EnumDescriptor.
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      from enum value name to EnumValueDescriptor for that value.
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extensions: (list of FieldDescriptor) All extensions defined directly
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      within this message type (NOT within a nested type).
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      objects as |extensions|, but indexed by "name" attribute of each
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FieldDescriptor.
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
202d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    is_extendable:  Does this type define any extension ranges?
203d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.MessageOptions) Protocol message options or None
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      to use default message options.
206d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
207d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    file: (FileDescriptor) Reference to file descriptor.
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
210d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __init__(self, name, full_name, filename, containing_type, fields,
211d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               nested_types, enum_types, extensions, options=None,
212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               is_extendable=True, extension_ranges=None, file=None,
213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               serialized_start=None, serialized_end=None):
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Arguments to __init__() are as described in the description
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    of Descriptor fields above.
216d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
217d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Note that filename is an obsolete argument, that is not used anymore.
218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Please use file.name to access this as an attribute.
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(Descriptor, self).__init__(
221d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        options, 'MessageOptions', name, full_name, file,
222d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        containing_type, serialized_start=serialized_start,
223d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        serialized_end=serialized_start)
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # We have fields in addition to fields_by_name and fields_by_number,
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # so that:
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   1. Clients can index fields by "order in which they're listed."
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #   2. Clients can easily iterate over all fields with the terse
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    #      syntax: for f in descriptor.fields: ...
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.fields = fields
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for field in self.fields:
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field.containing_type = self
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.fields_by_number = dict((f.number, f) for f in fields)
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.fields_by_name = dict((f.name, f) for f in fields)
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.nested_types = nested_types
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.nested_types_by_name = dict((t.name, t) for t in nested_types)
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.enum_types = enum_types
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for enum_type in self.enum_types:
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      enum_type.containing_type = self
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.enum_types_by_name = dict((t.name, t) for t in enum_types)
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.enum_values_by_name = dict(
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (v.name, v) for t in enum_types for v in t.values)
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extensions = extensions
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for extension in self.extensions:
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension.extension_scope = self
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extensions_by_name = dict((f.name, f) for f in extensions)
250d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.is_extendable = is_extendable
251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.extension_ranges = extension_ranges
252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
253d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._serialized_start = serialized_start
254d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._serialized_end = serialized_end
255d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
256d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
257d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to a descriptor_pb2.DescriptorProto.
258d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
260d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty descriptor_pb2.DescriptorProto.
261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # This function is overriden to give a better doc comment.
263d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(Descriptor, self).CopyToProto(proto)
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): We should have aggressive checking here,
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# for example:
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * If you specify a repeated field, you should not be allowed
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     to specify a default value.
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   * [Other examples here as needed].
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): for this and other *Descriptor classes, we
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# might also want to lock things down aggressively (e.g.,
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# prevent clients from setting the attributes).  Having
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# stronger invariants here in general will reduce the number
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# of runtime checks we must do in reflection.py...
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldDescriptor(DescriptorBase):
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a single field in a .proto file.
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  A FieldDescriptor instance has the following attriubtes:
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of this field, exactly as it appears in .proto.
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_name: (str) Name of this field, including containing scope.  This is
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      particularly relevant for extensions.
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    index: (int) Dense, 0-indexed index giving the order that this
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field textually appears within its message in the .proto file.
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    number: (int) Tag number declared for this field in the .proto file.
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    type: (One of the TYPE_* constants below) Declared type.
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    cpp_type: (One of the CPPTYPE_* constants below) C++ type used to
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      represent this field.
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    label: (One of the LABEL_* constants below) Tells whether this
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field is optional, required, or repeated.
296d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    has_default_value: (bool) True if this field has a default value defined,
297d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      otherwise false.
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    default_value: (Varies) Default value of this field.  Only
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      meaningful for non-repeated scalar fields.  Repeated fields
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      should always set this to [], and non-repeated composite
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      fields should always set this to None.
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    containing_type: (Descriptor) Descriptor of the protocol message
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      type that contains this field.  Set by the Descriptor constructor
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if we're passed into one.
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Somewhat confusingly, for extension fields, this is the
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor of the EXTENDED message, not the descriptor
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      of the message containing this field.  (See is_extension and
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extension_scope below).
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message_type: (Descriptor) If a composite field, a descriptor
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      of the message type contained in this field.  Otherwise, this is None.
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    enum_type: (EnumDescriptor) If this field contains an enum, a
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor of that enum.  Otherwise, this is None.
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    is_extension: True iff this describes an extension field.
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extension_scope: (Descriptor) Only meaningful if is_extension is True.
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Gives the message that immediately contains this extension field.
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Will be None iff we're a top-level (file-level) extension field.
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.FieldOptions) Protocol message field options or
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      None to use default field options.
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Must be consistent with C++ FieldDescriptor::Type enum in
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # descriptor.h.
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Find a way to eliminate this repetition.
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_DOUBLE         = 1
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_FLOAT          = 2
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_INT64          = 3
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_UINT64         = 4
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_INT32          = 5
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_FIXED64        = 6
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_FIXED32        = 7
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_BOOL           = 8
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_STRING         = 9
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_GROUP          = 10
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_MESSAGE        = 11
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_BYTES          = 12
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_UINT32         = 13
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_ENUM           = 14
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_SFIXED32       = 15
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_SFIXED64       = 16
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_SINT32         = 17
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TYPE_SINT64         = 18
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MAX_TYPE            = 18
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Must be consistent with C++ FieldDescriptor::CppType enum in
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # descriptor.h.
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Find a way to eliminate this repetition.
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_INT32       = 1
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_INT64       = 2
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_UINT32      = 3
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_UINT64      = 4
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_DOUBLE      = 5
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_FLOAT       = 6
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_BOOL        = 7
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_ENUM        = 8
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_STRING      = 9
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CPPTYPE_MESSAGE     = 10
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MAX_CPPTYPE         = 10
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Must be consistent with C++ FieldDescriptor::Label enum in
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # descriptor.h.
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Find a way to eliminate this repetition.
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LABEL_OPTIONAL      = 1
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LABEL_REQUIRED      = 2
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LABEL_REPEATED      = 3
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MAX_LABEL           = 3
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, name, full_name, index, number, type, cpp_type, label,
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               default_value, message_type, enum_type, containing_type,
375d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               is_extension, extension_scope, options=None,
376d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               has_default_value=True):
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """The arguments are as described in the description of FieldDescriptor
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    attributes above.
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Note that containing_type may be None, and may be set later if necessary
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (to deal with circular references between message types, for example).
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Likewise for extension_scope.
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    super(FieldDescriptor, self).__init__(options, 'FieldOptions')
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.name = name
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.full_name = full_name
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.index = index
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.number = number
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.type = type
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.cpp_type = cpp_type
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.label = label
392d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.has_default_value = has_default_value
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.default_value = default_value
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.containing_type = containing_type
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.message_type = message_type
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.enum_type = enum_type
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.is_extension = is_extension
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.extension_scope = extension_scope
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
401d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass EnumDescriptor(_NestedDescriptorBase):
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for an enum defined in a .proto file.
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  An EnumDescriptor instance has the following attributes:
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of the enum type.
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_name: (str) Full name of the type, including package name
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      and any enclosing type(s).
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    values: (list of EnumValueDescriptors) List of the values
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      in this enum.
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    values_by_name: (dict str -> EnumValueDescriptor) Same as |values|,
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      but indexed by the "name" field of each EnumValueDescriptor.
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    values_by_number: (dict int -> EnumValueDescriptor) Same as |values|,
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      but indexed by the "number" field of each EnumValueDescriptor.
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    containing_type: (Descriptor) Descriptor of the immediate containing
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      type of this enum, or None if this is an enum defined at the
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      top level in a .proto file.  Set by Descriptor's constructor
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if we're passed into one.
421d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    file: (FileDescriptor) Reference to file descriptor.
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.EnumOptions) Enum options message or
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      None to use default enum options.
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, name, full_name, filename, values,
427d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               containing_type=None, options=None, file=None,
428d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               serialized_start=None, serialized_end=None):
429d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Arguments are as described in the attribute description above.
430d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
431d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Note that filename is an obsolete argument, that is not used anymore.
432d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Please use file.name to access this as an attribute.
433d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
434d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(EnumDescriptor, self).__init__(
435d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        options, 'EnumOptions', name, full_name, file,
436d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        containing_type, serialized_start=serialized_start,
437d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        serialized_end=serialized_start)
438d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.values = values
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for value in self.values:
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      value.type = self
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.values_by_name = dict((v.name, v) for v in values)
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.values_by_number = dict((v.number, v) for v in values)
444d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
445d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._serialized_start = serialized_start
446d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._serialized_end = serialized_end
447d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
448d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
449d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to a descriptor_pb2.EnumDescriptorProto.
450d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
451d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
452d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty descriptor_pb2.EnumDescriptorProto.
453d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
454d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # This function is overriden to give a better doc comment.
455d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(EnumDescriptor, self).CopyToProto(proto)
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueDescriptor(DescriptorBase):
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a single value within an enum.
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of this value.
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    index: (int) Dense, 0-indexed index giving the order that this
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      value appears textually within its enum in the .proto file.
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    number: (int) Actual number assigned to this enum value.
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    type: (EnumDescriptor) EnumDescriptor to which this value
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      belongs.  Set by EnumDescriptor's constructor if we're
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      passed into one.
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.EnumValueOptions) Enum value options message or
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      None to use default enum value options options.
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, name, index, number, type=None, options=None):
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Arguments are as described in the attribute description above."""
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions')
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.name = name
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.index = index
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.number = number
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.type = type
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
482d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass ServiceDescriptor(_NestedDescriptorBase):
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a service.
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    name: (str) Name of the service.
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_name: (str) Full name of the service, including package name.
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    index: (int) 0-indexed index giving the order that this services
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      definition appears withing the .proto file.
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    methods: (list of MethodDescriptor) List of methods provided by this
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      service.
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    options: (descriptor_pb2.ServiceOptions) Service options message or
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      None to use default service options.
494d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    file: (FileDescriptor) Reference to file info.
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
497d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __init__(self, name, full_name, index, methods, options=None, file=None,
498d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               serialized_start=None, serialized_end=None):
499d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(ServiceDescriptor, self).__init__(
500d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        options, 'ServiceOptions', name, full_name, file,
501d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        None, serialized_start=serialized_start,
502d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        serialized_end=serialized_end)
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.index = index
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.methods = methods
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Set the containing service for each method in this service.
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for method in self.methods:
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      method.containing_service = self
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def FindMethodByName(self, name):
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Searches for the specified method, and returns its descriptor."""
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for method in self.methods:
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if name == method.name:
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return method
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return None
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
516d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
517d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to a descriptor_pb2.ServiceDescriptorProto.
518d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
519d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
520d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty descriptor_pb2.ServiceDescriptorProto.
521d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
522d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    # This function is overriden to give a better doc comment.
523d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(ServiceDescriptor, self).CopyToProto(proto)
524d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodDescriptor(DescriptorBase):
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Descriptor for a method in a service.
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  name: (str) Name of the method within the service.
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  full_name: (str) Full name of method.
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  index: (int) 0-indexed index of the method inside the service.
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  containing_service: (ServiceDescriptor) The service that contains this
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    method.
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input_type: The descriptor of the message that this method accepts.
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output_type: The descriptor of the message that this method returns.
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  options: (descriptor_pb2.MethodOptions) Method options message or
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    None to use default method options.
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, name, full_name, index, containing_service,
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               input_type, output_type, options=None):
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """The arguments are as described in the description of MethodDescriptor
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    attributes above.
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Note that containing_service may be None, and may be set later if necessary.
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    super(MethodDescriptor, self).__init__(options, 'MethodOptions')
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.name = name
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.full_name = full_name
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.index = index
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.containing_service = containing_service
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.input_type = input_type
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.output_type = output_type
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
557d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass FileDescriptor(DescriptorBase):
558d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto.
559d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
560d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  name: name of file, relative to root of source tree.
561d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  package: name of the package
562d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  serialized_pb: (str) Byte string of serialized
563d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    descriptor_pb2.FileDescriptorProto.
564d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  """
565d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
566d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __init__(self, name, package, options=None, serialized_pb=None):
567d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Constructor."""
568d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    super(FileDescriptor, self).__init__(options, 'FileOptions')
569d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
570d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.name = name
571d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.package = package
572d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.serialized_pb = serialized_pb
573d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
574d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def CopyToProto(self, proto):
575d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Copies this to a descriptor_pb2.FileDescriptorProto.
576d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
577d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Args:
578d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      proto: An empty descriptor_pb2.FileDescriptorProto.
579d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
580d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    proto.ParseFromString(self.serialized_pb)
581d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
582d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef _ParseOptions(message, string):
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Parses serialized options.
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  This helper function is used to parse serialized options in generated
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  proto2 files. It must not be used outside proto2.
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  message.ParseFromString(string)
590d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return message
591