U
    Sd                     @   sn   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 dd	 Z
dd
dZdd ZdS )zDynamic Protobuf class creator.    )OrderedDictN)descriptor_pb2)
descriptor)descriptor_pool)message_factoryc                 C   s   |  |}t|}|S )a-  Get a proto class from the MessageFactory by name.

  Args:
    pool: a descriptor pool.
    full_name: str, the fully qualified name of the proto type.
  Returns:
    A class, for the type identified by full_name.
  Raises:
    KeyError, if the proto is not found in the factory's descriptor pool.
  )ZFindMessageTypeByNamer   ZGetMessageClass)pool	full_nameZproto_descriptor	proto_cls r
   A/tmp/pip-unpacked-wheel-1ori_g8k/google/protobuf/proto_builder.py_GetMessageFromFactory+   s    

r   c           
      C   s   |p
t  }|dk	r:zt||}|W S  tk
r8   Y nX |  }t| tsTt|}t	 }|D ],\}}|
|d |
t|d q`| d }	|dkrd|  }zt||}|W S  tk
r   Y nX |t|	|| t||S )a  Create a Protobuf class whose fields are basic types.

  Note: this doesn't validate field names!

  Args:
    fields: dict of {name: field_type} mappings for each field in the proto. If
        this is an OrderedDict the order will be maintained, otherwise the
        fields will be sorted by name.
    full_name: optional str, the fully-qualified name of the proto type.
    pool: optional DescriptorPool instance.
  Returns:
    a class, the new protobuf class with a FileDescriptor.
  Nzutf-8z.protoz6net.proto2.python.public.proto_builder.AnonymousProto_)r   ZDescriptorPoolr   KeyErroritems
isinstancer   sortedhashlibsha1updateencodestr	hexdigestZAdd_MakeFileDescriptorProto)
fieldsr   r   Zpool_instancer	   field_itemsZfields_hashf_namef_typeproto_file_namer
   r
   r   MakeSimpleProtoClass;   s8    



r   c                 C   s   | dd\}}t }tj|dd| |_||_|j	
 }||_t|dD ]V\}\}}	|j
 }
||
_|tjjkr|tjjtjj d 7 }||
_tjj|
_|	|
_qP|S )zAPopulate FileDescriptorProto for MessageFactory's DescriptorPool..   /)rsplitr   ZFileDescriptorProtoospathjoinreplacenamepackageZmessage_typeadd	enumeratefieldr   ZFieldDescriptorZFIRST_RESERVED_FIELD_NUMBERZLAST_RESERVED_FIELD_NUMBERnumberZFieldDescriptorProtoZLABEL_OPTIONALlabeltype)r   r   r   r'   r&   Z
file_protoZ
desc_protoZf_numberr   r   Zfield_protor
   r
   r   r   r   s*    


r   )NN)__doc__collectionsr   r   r"   Zgoogle.protobufr   r   r   r   r   r   r   r
   r
   r
   r   <module>   s   
7