Index: third_party/google/protobuf/reflection.py |
diff --git a/third_party/google/protobuf/reflection.py b/third_party/google/protobuf/reflection.py |
deleted file mode 100644 |
index 7aac623068f93acf4798e836a0e4b9e4b79cb0f1..0000000000000000000000000000000000000000 |
--- a/third_party/google/protobuf/reflection.py |
+++ /dev/null |
@@ -1,205 +0,0 @@ |
-# Protocol Buffers - Google's data interchange format |
-# Copyright 2008 Google Inc. All rights reserved. |
-# http://code.google.com/p/protobuf/ |
-# |
-# Redistribution and use in source and binary forms, with or without |
-# modification, are permitted provided that the following conditions are |
-# met: |
-# |
-# * Redistributions of source code must retain the above copyright |
-# notice, this list of conditions and the following disclaimer. |
-# * Redistributions in binary form must reproduce the above |
-# copyright notice, this list of conditions and the following disclaimer |
-# in the documentation and/or other materials provided with the |
-# distribution. |
-# * Neither the name of Google Inc. nor the names of its |
-# contributors may be used to endorse or promote products derived from |
-# this software without specific prior written permission. |
-# |
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- |
-# This code is meant to work on Python 2.4 and above only. |
- |
-"""Contains a metaclass and helper functions used to create |
-protocol message classes from Descriptor objects at runtime. |
- |
-Recall that a metaclass is the "type" of a class. |
-(A class is to a metaclass what an instance is to a class.) |
- |
-In this case, we use the GeneratedProtocolMessageType metaclass |
-to inject all the useful functionality into the classes |
-output by the protocol compiler at compile-time. |
- |
-The upshot of all this is that the real implementation |
-details for ALL pure-Python protocol buffers are *here in |
-this file*. |
-""" |
- |
-__author__ = 'robinson@google.com (Will Robinson)' |
- |
- |
-from google.protobuf.internal import api_implementation |
-from google.protobuf import descriptor as descriptor_mod |
-from google.protobuf import message |
- |
-_FieldDescriptor = descriptor_mod.FieldDescriptor |
- |
- |
-if api_implementation.Type() == 'cpp': |
- if api_implementation.Version() == 2: |
- from google.protobuf.pyext import cpp_message |
- _NewMessage = cpp_message.NewMessage |
- _InitMessage = cpp_message.InitMessage |
- else: |
- from google.protobuf.internal import cpp_message |
- _NewMessage = cpp_message.NewMessage |
- _InitMessage = cpp_message.InitMessage |
-else: |
- from google.protobuf.internal import python_message |
- _NewMessage = python_message.NewMessage |
- _InitMessage = python_message.InitMessage |
- |
- |
-class GeneratedProtocolMessageType(type): |
- |
- """Metaclass for protocol message classes created at runtime from Descriptors. |
- |
- We add implementations for all methods described in the Message class. We |
- also create properties to allow getting/setting all fields in the protocol |
- message. Finally, we create slots to prevent users from accidentally |
- "setting" nonexistent fields in the protocol message, which then wouldn't get |
- serialized / deserialized properly. |
- |
- The protocol compiler currently uses this metaclass to create protocol |
- message classes at runtime. Clients can also manually create their own |
- classes at runtime, as in this example: |
- |
- mydescriptor = Descriptor(.....) |
- class MyProtoClass(Message): |
- __metaclass__ = GeneratedProtocolMessageType |
- DESCRIPTOR = mydescriptor |
- myproto_instance = MyProtoClass() |
- myproto.foo_field = 23 |
- ... |
- |
- The above example will not work for nested types. If you wish to include them, |
- use reflection.MakeClass() instead of manually instantiating the class in |
- order to create the appropriate class structure. |
- """ |
- |
- # Must be consistent with the protocol-compiler code in |
- # proto2/compiler/internal/generator.*. |
- _DESCRIPTOR_KEY = 'DESCRIPTOR' |
- |
- def __new__(cls, name, bases, dictionary): |
- """Custom allocation for runtime-generated class types. |
- |
- We override __new__ because this is apparently the only place |
- where we can meaningfully set __slots__ on the class we're creating(?). |
- (The interplay between metaclasses and slots is not very well-documented). |
- |
- Args: |
- name: Name of the class (ignored, but required by the |
- metaclass protocol). |
- bases: Base classes of the class we're constructing. |
- (Should be message.Message). We ignore this field, but |
- it's required by the metaclass protocol |
- dictionary: The class dictionary of the class we're |
- constructing. dictionary[_DESCRIPTOR_KEY] must contain |
- a Descriptor object describing this protocol message |
- type. |
- |
- Returns: |
- Newly-allocated class. |
- """ |
- descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] |
- bases = _NewMessage(bases, descriptor, dictionary) |
- superclass = super(GeneratedProtocolMessageType, cls) |
- |
- new_class = superclass.__new__(cls, name, bases, dictionary) |
- setattr(descriptor, '_concrete_class', new_class) |
- return new_class |
- |
- def __init__(cls, name, bases, dictionary): |
- """Here we perform the majority of our work on the class. |
- We add enum getters, an __init__ method, implementations |
- of all Message methods, and properties for all fields |
- in the protocol type. |
- |
- Args: |
- name: Name of the class (ignored, but required by the |
- metaclass protocol). |
- bases: Base classes of the class we're constructing. |
- (Should be message.Message). We ignore this field, but |
- it's required by the metaclass protocol |
- dictionary: The class dictionary of the class we're |
- constructing. dictionary[_DESCRIPTOR_KEY] must contain |
- a Descriptor object describing this protocol message |
- type. |
- """ |
- descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] |
- _InitMessage(descriptor, cls) |
- superclass = super(GeneratedProtocolMessageType, cls) |
- superclass.__init__(name, bases, dictionary) |
- |
- |
-def ParseMessage(descriptor, byte_str): |
- """Generate a new Message instance from this Descriptor and a byte string. |
- |
- Args: |
- descriptor: Protobuf Descriptor object |
- byte_str: Serialized protocol buffer byte string |
- |
- Returns: |
- Newly created protobuf Message object. |
- """ |
- result_class = MakeClass(descriptor) |
- new_msg = result_class() |
- new_msg.ParseFromString(byte_str) |
- return new_msg |
- |
- |
-def MakeClass(descriptor): |
- """Construct a class object for a protobuf described by descriptor. |
- |
- Composite descriptors are handled by defining the new class as a member of the |
- parent class, recursing as deep as necessary. |
- This is the dynamic equivalent to: |
- |
- class Parent(message.Message): |
- __metaclass__ = GeneratedProtocolMessageType |
- DESCRIPTOR = descriptor |
- class Child(message.Message): |
- __metaclass__ = GeneratedProtocolMessageType |
- DESCRIPTOR = descriptor.nested_types[0] |
- |
- Sample usage: |
- file_descriptor = descriptor_pb2.FileDescriptorProto() |
- file_descriptor.ParseFromString(proto2_string) |
- msg_descriptor = descriptor.MakeDescriptor(file_descriptor.message_type[0]) |
- msg_class = reflection.MakeClass(msg_descriptor) |
- msg = msg_class() |
- |
- Args: |
- descriptor: A descriptor.Descriptor object describing the protobuf. |
- Returns: |
- The Message class object described by the descriptor. |
- """ |
- attributes = {} |
- for name, nested_type in descriptor.nested_types_by_name.items(): |
- attributes[name] = MakeClass(nested_type) |
- |
- attributes[GeneratedProtocolMessageType._DESCRIPTOR_KEY] = descriptor |
- |
- return GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), |
- attributes) |