ķ
Xž÷Xc           @   s   d  Z  d Z d d l m Z d d l m Z e j   d k rQ d d l m Z	 n d d l m
 Z	 e	 j Z d   Z d	   Z d
 S(   s  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*.
s#   robinson@google.com (Will Robinson)i˙˙˙˙(   t   api_implementation(   t   messaget   cpp(   t   cpp_message(   t   python_messagec         C   s&   t  |   } |   } | j |  | S(   sę   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.
  (   t	   MakeClasst   ParseFromString(   t
   descriptort   byte_strt   result_classt   new_msg(    (    s<   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/reflection.pyt   ParseMessageA   s    
	c         C   sb   i  } x- |  j  j   D] \ } } t |  | | <q W|  | t j <t t |  j  t j f |  S(   s  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.
  (	   t   nested_types_by_namet   itemsR   t   GeneratedProtocolMessageTypet   _DESCRIPTOR_KEYt   strt   nameR   t   Message(   R   t
   attributesR   t   nested_type(    (    s<   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/reflection.pyR   Q   s    N(   t   __doc__t
   __author__t   google.protobuf.internalR    t   google.protobufR   t   Typet   google.protobuf.pyextR   t   message_implR   R   R   R   (    (    (    s<   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/reflection.pyt   <module>.   s   		