Index: third_party/protobuf/python/google/protobuf/descriptor.py |
diff --git a/third_party/protobuf/python/google/protobuf/descriptor.py b/third_party/protobuf/python/google/protobuf/descriptor.py |
index 3209b34d57d8da1d45bc9e5a457241603b7d2610..e1f2e3b7c9497bc33801450c562d4a150b691720 100755 |
--- a/third_party/protobuf/python/google/protobuf/descriptor.py |
+++ b/third_party/protobuf/python/google/protobuf/descriptor.py |
@@ -171,13 +171,6 @@ class _NestedDescriptorBase(DescriptorBase): |
self._serialized_start = serialized_start |
self._serialized_end = serialized_end |
- def GetTopLevelContainingType(self): |
- """Returns the root if this is a nested type, or itself if its the root.""" |
- desc = self |
- while desc.containing_type is not None: |
- desc = desc.containing_type |
- return desc |
- |
def CopyToProto(self, proto): |
"""Copies this to the matching proto in descriptor_pb2. |
@@ -258,7 +251,7 @@ class Descriptor(_NestedDescriptorBase): |
def __new__(cls, name, full_name, filename, containing_type, fields, |
nested_types, enum_types, extensions, options=None, |
is_extendable=True, extension_ranges=None, oneofs=None, |
- file=None, serialized_start=None, serialized_end=None, |
+ file=None, serialized_start=None, serialized_end=None, # pylint: disable=redefined-builtin |
syntax=None): |
_message.Message._CheckCalledFromGeneratedFile() |
return _message.default_pool.FindMessageTypeByName(full_name) |
@@ -269,8 +262,8 @@ class Descriptor(_NestedDescriptorBase): |
def __init__(self, name, full_name, filename, containing_type, fields, |
nested_types, enum_types, extensions, options=None, |
is_extendable=True, extension_ranges=None, oneofs=None, |
- file=None, serialized_start=None, serialized_end=None, |
- syntax=None): # pylint:disable=redefined-builtin |
+ file=None, serialized_start=None, serialized_end=None, # pylint: disable=redefined-builtin |
+ syntax=None): |
"""Arguments to __init__() are as described in the description |
of Descriptor fields above. |
@@ -349,7 +342,7 @@ class Descriptor(_NestedDescriptorBase): |
Args: |
proto: An empty descriptor_pb2.DescriptorProto. |
""" |
- # This function is overriden to give a better doc comment. |
+ # This function is overridden to give a better doc comment. |
super(Descriptor, self).CopyToProto(proto) |
@@ -497,7 +490,7 @@ class FieldDescriptor(DescriptorBase): |
def __new__(cls, name, full_name, index, number, type, cpp_type, label, |
default_value, message_type, enum_type, containing_type, |
is_extension, extension_scope, options=None, |
- has_default_value=True, containing_oneof=None): |
+ has_default_value=True, containing_oneof=None, json_name=None): |
_message.Message._CheckCalledFromGeneratedFile() |
if is_extension: |
return _message.default_pool.FindExtensionByName(full_name) |
@@ -507,7 +500,7 @@ class FieldDescriptor(DescriptorBase): |
def __init__(self, name, full_name, index, number, type, cpp_type, label, |
default_value, message_type, enum_type, containing_type, |
is_extension, extension_scope, options=None, |
- has_default_value=True, containing_oneof=None): |
+ has_default_value=True, containing_oneof=None, json_name=None): |
"""The arguments are as described in the description of FieldDescriptor |
attributes above. |
@@ -519,6 +512,10 @@ class FieldDescriptor(DescriptorBase): |
self.name = name |
self.full_name = full_name |
self._camelcase_name = None |
+ if json_name is None: |
+ self.json_name = _ToJsonName(name) |
+ else: |
+ self.json_name = json_name |
self.index = index |
self.number = number |
self.type = type |
@@ -626,7 +623,7 @@ class EnumDescriptor(_NestedDescriptorBase): |
Args: |
proto: An empty descriptor_pb2.EnumDescriptorProto. |
""" |
- # This function is overriden to give a better doc comment. |
+ # This function is overridden to give a better doc comment. |
super(EnumDescriptor, self).CopyToProto(proto) |
@@ -665,7 +662,7 @@ class EnumValueDescriptor(DescriptorBase): |
self.type = type |
-class OneofDescriptor(object): |
+class OneofDescriptor(DescriptorBase): |
"""Descriptor for a oneof field. |
name: (str) Name of the oneof field. |
@@ -682,12 +679,15 @@ class OneofDescriptor(object): |
if _USE_C_DESCRIPTORS: |
_C_DESCRIPTOR_CLASS = _message.OneofDescriptor |
- def __new__(cls, name, full_name, index, containing_type, fields): |
+ def __new__( |
+ cls, name, full_name, index, containing_type, fields, options=None): |
_message.Message._CheckCalledFromGeneratedFile() |
return _message.default_pool.FindOneofByName(full_name) |
- def __init__(self, name, full_name, index, containing_type, fields): |
+ def __init__( |
+ self, name, full_name, index, containing_type, fields, options=None): |
"""Arguments are as described in the attribute description above.""" |
+ super(OneofDescriptor, self).__init__(options, 'OneofOptions') |
self.name = name |
self.full_name = full_name |
self.index = index |
@@ -705,11 +705,22 @@ class ServiceDescriptor(_NestedDescriptorBase): |
definition appears withing the .proto file. |
methods: (list of MethodDescriptor) List of methods provided by this |
service. |
+ methods_by_name: (dict str -> MethodDescriptor) Same MethodDescriptor |
+ objects as in |methods_by_name|, but indexed by "name" attribute in each |
+ MethodDescriptor. |
options: (descriptor_pb2.ServiceOptions) Service options message or |
None to use default service options. |
file: (FileDescriptor) Reference to file info. |
""" |
+ if _USE_C_DESCRIPTORS: |
+ _C_DESCRIPTOR_CLASS = _message.ServiceDescriptor |
+ |
+ def __new__(cls, name, full_name, index, methods, options=None, file=None, # pylint: disable=redefined-builtin |
+ serialized_start=None, serialized_end=None): |
+ _message.Message._CheckCalledFromGeneratedFile() # pylint: disable=protected-access |
+ return _message.default_pool.FindServiceByName(full_name) |
+ |
def __init__(self, name, full_name, index, methods, options=None, file=None, |
serialized_start=None, serialized_end=None): |
super(ServiceDescriptor, self).__init__( |
@@ -718,16 +729,14 @@ class ServiceDescriptor(_NestedDescriptorBase): |
serialized_end=serialized_end) |
self.index = index |
self.methods = methods |
+ self.methods_by_name = dict((m.name, m) for m in methods) |
# Set the containing service for each method in this service. |
for method in self.methods: |
method.containing_service = self |
def FindMethodByName(self, name): |
"""Searches for the specified method, and returns its descriptor.""" |
- for method in self.methods: |
- if name == method.name: |
- return method |
- return None |
+ return self.methods_by_name.get(name, None) |
def CopyToProto(self, proto): |
"""Copies this to a descriptor_pb2.ServiceDescriptorProto. |
@@ -735,7 +744,7 @@ class ServiceDescriptor(_NestedDescriptorBase): |
Args: |
proto: An empty descriptor_pb2.ServiceDescriptorProto. |
""" |
- # This function is overriden to give a better doc comment. |
+ # This function is overridden to give a better doc comment. |
super(ServiceDescriptor, self).CopyToProto(proto) |
@@ -754,6 +763,14 @@ class MethodDescriptor(DescriptorBase): |
None to use default method options. |
""" |
+ if _USE_C_DESCRIPTORS: |
+ _C_DESCRIPTOR_CLASS = _message.MethodDescriptor |
+ |
+ def __new__(cls, name, full_name, index, containing_service, |
+ input_type, output_type, options=None): |
+ _message.Message._CheckCalledFromGeneratedFile() # pylint: disable=protected-access |
+ return _message.default_pool.FindMethodByName(full_name) |
+ |
def __init__(self, name, full_name, index, containing_service, |
input_type, output_type, options=None): |
"""The arguments are as described in the description of MethodDescriptor |
@@ -788,6 +805,7 @@ class FileDescriptor(DescriptorBase): |
message_types_by_name: Dict of message names of their descriptors. |
enum_types_by_name: Dict of enum names and their descriptors. |
extensions_by_name: Dict of extension names and their descriptors. |
+ services_by_name: Dict of services names and their descriptors. |
pool: the DescriptorPool this descriptor belongs to. When not passed to the |
constructor, the global default pool is used. |
""" |
@@ -825,6 +843,7 @@ class FileDescriptor(DescriptorBase): |
self.enum_types_by_name = {} |
self.extensions_by_name = {} |
+ self.services_by_name = {} |
self.dependencies = (dependencies or []) |
self.public_dependencies = (public_dependencies or []) |
@@ -872,6 +891,31 @@ def _ToCamelCase(name): |
return ''.join(result) |
+def _OptionsOrNone(descriptor_proto): |
+ """Returns the value of the field `options`, or None if it is not set.""" |
+ if descriptor_proto.HasField('options'): |
+ return descriptor_proto.options |
+ else: |
+ return None |
+ |
+ |
+def _ToJsonName(name): |
+ """Converts name to Json name and returns it.""" |
+ capitalize_next = False |
+ result = [] |
+ |
+ for c in name: |
+ if c == '_': |
+ capitalize_next = True |
+ elif capitalize_next: |
+ result.append(c.upper()) |
+ capitalize_next = False |
+ else: |
+ result += c |
+ |
+ return ''.join(result) |
+ |
+ |
def MakeDescriptor(desc_proto, package='', build_file_if_cpp=True, |
syntax=None): |
"""Make a protobuf Descriptor given a DescriptorProto protobuf. |
@@ -948,6 +992,10 @@ def MakeDescriptor(desc_proto, package='', build_file_if_cpp=True, |
full_name = '.'.join(full_message_name + [field_proto.name]) |
enum_desc = None |
nested_desc = None |
+ if field_proto.json_name: |
+ json_name = field_proto.json_name |
+ else: |
+ json_name = None |
if field_proto.HasField('type_name'): |
type_name = field_proto.type_name |
full_type_name = '.'.join(full_message_name + |
@@ -962,10 +1010,11 @@ def MakeDescriptor(desc_proto, package='', build_file_if_cpp=True, |
field_proto.number, field_proto.type, |
FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type), |
field_proto.label, None, nested_desc, enum_desc, None, False, None, |
- options=field_proto.options, has_default_value=False) |
+ options=_OptionsOrNone(field_proto), has_default_value=False, |
+ json_name=json_name) |
fields.append(field) |
desc_name = '.'.join(full_message_name) |
return Descriptor(desc_proto.name, desc_name, None, None, fields, |
list(nested_types.values()), list(enum_types.values()), [], |
- options=desc_proto.options) |
+ options=_OptionsOrNone(desc_proto)) |