U
    Sdɍ                     @   s  d Z dZddlZddlmZ ddlZddl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
ZeejjejjejjejjgZeejjejjgZeejjejjgZdZdZdZe	 dZ!e	 dZ"G dd de#Z$G dd de$Z%G dd de$Z&dAddZ'dBddZ(dd Z)G dd  d e*Z+d!d" Z,d#d$ Z-d%d& Z.dCd(d)Z/dDd*d+Z0e1e2fZ3G d,d- d-e*Z4dEd.d/Z5d0d1 Z6d2d3 Z7d4d5 Z8d6d7gd8d9gd8d9gd:d;gd<d=gd8d9gd>d?gd@Z9dS )Fat  Contains routines for printing protocol messages in JSON format.

Simple usage example:

  # Create a proto object and serialize it to a json format string.
  message = my_proto_pb2.MyMessage(foo='bar')
  json_string = json_format.MessageToJson(message)

  # Parse a json format string to proto object.
  message = json_format.Parse(json_string, my_proto_pb2.MyMessage())
zjieluo@google.com (Jie Luo)    N)OrderedDict)methodcaller)type_checkers)
descriptor)message_factory)symbol_databasez%Y-%m-%dT%H:%M:%SInfinityz	-InfinityNaNu.   [-](?![-])|(?<![-])[-]z\[[a-zA-Z0-9\._]*\]$c                   @   s   e Zd ZdZdS )Errorz'Top-level module error for json_format.N__name__
__module____qualname____doc__ r   r   ?/tmp/pip-unpacked-wheel-1ori_g8k/google/protobuf/json_format.pyr
   O   s   r
   c                   @   s   e Zd ZdZdS )SerializeToJsonErrorz&Thrown if serialization to JSON fails.Nr   r   r   r   r   r   S   s   r   c                   @   s   e Zd ZdZdS )
ParseErrorz Thrown in case of parsing error.Nr   r   r   r   r   r   W   s   r   F   Tc	           
      C   s"   t |||||d}	|	| |||S )a  Converts protobuf message to JSON format.

  Args:
    message: The protocol buffers message instance to serialize.
    including_default_value_fields: If True, singular primitive fields,
        repeated fields, and map fields will always be serialized.  If
        False, only serialize non-empty fields.  Singular message fields
        and oneof fields are not affected by this option.
    preserving_proto_field_name: If True, use the original proto field
        names as defined in the .proto file. If False, convert the field
        names to lowerCamelCase.
    indent: The JSON object will be pretty-printed with this indent level.
        An indent level of 0 or negative will only insert newlines. If the
        indent level is None, no newlines will be inserted.
    sort_keys: If True, then the output will be sorted by field names.
    use_integers_for_enums: If true, print integers instead of enum names.
    descriptor_pool: A Descriptor Pool for resolving types. If None use the
        default.
    float_precision: If set, use this to specify float field valid digits.
    ensure_ascii: If True, strings with non-ASCII characters are escaped.
        If False, Unicode strings are returned unchanged.

  Returns:
    A string containing the JSON formatted protocol buffer message.
  float_precision)_PrinterToJsonString)
messageincluding_default_value_fieldspreserving_proto_field_nameindent	sort_keysuse_integers_for_enumsdescriptor_poolr   ensure_asciiprinterr   r   r   MessageToJson[   s    #r"   c                 C   s   t |||||d}|| S )a  Converts protobuf message to a dictionary.

  When the dictionary is encoded to JSON, it conforms to proto3 JSON spec.

  Args:
    message: The protocol buffers message instance to serialize.
    including_default_value_fields: If True, singular primitive fields,
        repeated fields, and map fields will always be serialized.  If
        False, only serialize non-empty fields.  Singular message fields
        and oneof fields are not affected by this option.
    preserving_proto_field_name: If True, use the original proto field
        names as defined in the .proto file. If False, convert the field
        names to lowerCamelCase.
    use_integers_for_enums: If true, print integers instead of enum names.
    descriptor_pool: A Descriptor Pool for resolving types. If None use the
        default.
    float_precision: If set, use this to specify float field valid digits.

  Returns:
    A dict representation of the protocol buffer message.
  r   )r   _MessageToJsonObject)r   r   r   r   r   r   r!   r   r   r   MessageToDict   s    r$   c                 C   s"   | j tjjko | jjo | j jS N)typer   FieldDescriptorZTYPE_MESSAGEmessage_typeZhas_optionsZ
GetOptionsZ	map_entry)fieldr   r   r   _IsMapEntry   s
    
r*   c                   @   sj   e Zd ZdZdddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )r   z)JSON format printer for protocol message.FNc                 C   s4   || _ || _|| _|| _|r*d|| _nd | _d S )Nz.{}g)r   r   r   r   formatfloat_format)selfr   r   r   r   r   r   r   r   __init__   s    z_Printer.__init__c                 C   s   |  |}tj||||dS )N)r   r   r    )r#   jsondumps)r-   r   r   r   r    jsr   r   r   r      s    
   z_Printer.ToJsonStringc                 C   sL   |j }|j}t|r| |S |tkr<tt| d || S i }| ||S )zEConverts message to an object according to Proto3 JSON Specification.r   )
DESCRIPTOR	full_name_IsWrapperMessage_WrapperMessageToJsonObject_WKTJSONMETHODSr   _RegularMessageToJsonObject)r-   r   message_descriptorr3   r1   r   r   r   r#      s    
z_Printer._MessageToJsonObjectc              
      s  |  }z|D ]\ }jr& j}n j}t r jjd }i }|D ]:}t|trf|r`d}	qnd}	nt	|}	
||| ||	< qH|||< q jtjjkr fdd|D ||< q jrd j }
 |||< q
 |||< qjr|j}
|
jD ]  jtjjkr  jtjjks jr*qjr: j}n j}||krLqt r`i ||< q jtjjkrzg ||< q
  j||< qW n8 tk
r } ztd j||W 5 d}~X Y nX |S )	z?Converts normal message according to Proto3 JSON Specification.valuetruefalsec                    s   g | ]}  |qS r   )_FieldToJsonObject).0kr)   r-   r   r   
<listcomp>   s   z8_Printer._RegularMessageToJsonObject.<locals>.<listcomp>z[%s]z#Failed to serialize {0} field: {1}.N)
ListFieldsr   name	json_namer*   r(   fields_by_name
isinstanceboolstrr<   labelr   r'   LABEL_REPEATEDis_extensionr3   r   r2   fieldscpp_typeCPPTYPE_MESSAGEcontaining_oneofdefault_value
ValueErrorr   r+   )r-   r   r1   rK   r9   rB   Zv_fieldZjs_mapkeyZrecorded_keyr8   er   r?   r   r7      sl    
 







z$_Printer._RegularMessageToJsonObjectc                 C   s@  |j tjjkr| |S |j tjjkrv| jr0|S |jjdkr@dS |jj	
|d}|dk	r^|jS |jjrptdn|S n|j tjjkr|jtjjkrt|dS |S n|j tjjkrt|S |j tkrt|S |j tkr<t| r|dk  rtS tS t|r
tS |j tjjkr<| j r2t!t"|| j S t#$|S |S )z<Converts field value according to Proto3 JSON Specification.google.protobuf.NullValueNzKEnum field contains an integer value which can not mapped to an enum value.utf-8g        )%rL   r   r'   rM   r#   CPPTYPE_ENUMr   	enum_typer3   values_by_numbergetrB   	is_closedr   CPPTYPE_STRINGr&   
TYPE_BYTESbase64	b64encodedecodeCPPTYPE_BOOLrF   _INT64_TYPESrG   _FLOAT_TYPESmathisinf_NEG_INFINITY	_INFINITYisnan_NANCPPTYPE_FLOATr,   floatr+   r   ZToShortestFloat)r-   r)   r9   
enum_valuer   r   r   r<     sB    




z_Printer._FieldToJsonObjectc                 C   s   |  si S t }|j}||d< t|| j}||j |j}|j}t	|r^| 
||d< |S |tkrtt| d || |d< |S | ||S )z<Converts Any message according to Proto3 JSON Specification.@typer9   r   )rA   r   type_url_CreateMessageFromTypeUrlr   ZParseFromStringr9   r2   r3   r4   r5   r6   r   r7   )r-   r   r1   rl   sub_messager8   r3   r   r   r   _AnyMessageToJsonObjectB  s(    z _Printer._AnyMessageToJsonObjectc                 C   s   |  S )z8Converts message according to Proto3 JSON Specification.)r   r-   r   r   r   r   _GenericMessageToJsonObjectW  s    z$_Printer._GenericMessageToJsonObjectc                 C   s   | d}|dks|dkrdS |dkr2| |jS |dkrf|j}t|rRtdt|rptdn
t||}|j	j
| }| ||S )z>Converts Value message according to Proto3 JSON Specification.kindN
null_value
list_valuenumber_valuezTFail to serialize Infinity for Value.number_value, which would parse as string_valuezOFail to serialize NaN for Value.number_value, which would parse as string_value)Z
WhichOneof_ListValueMessageToJsonObjectrt   ru   rb   rc   rP   rf   getattrr2   rD   r<   )r-   r   whichr9   Zoneof_descriptorr   r   r   _ValueMessageToJsonObject]  s    




z"_Printer._ValueMessageToJsonObjectc                    s    fdd|j D S )zBConverts ListValue message according to Proto3 JSON Specification.c                    s   g | ]}  |qS r   )ry   )r=   r9   r-   r   r   r@   u  s   z:_Printer._ListValueMessageToJsonObject.<locals>.<listcomp>)valuesrp   r   rz   r   rv   s  s    
z&_Printer._ListValueMessageToJsonObjectc                 C   s*   |j }i }|D ]}| || ||< q|S )z?Converts Struct message according to Proto3 JSON Specification.)rK   ry   )r-   r   rK   retrQ   r   r   r   _StructMessageToJsonObjectx  s
    z#_Printer._StructMessageToJsonObjectc                 C   s   |  |jjd |jS )Nr9   )r<   r2   rD   r9   rp   r   r   r   r5     s    
 z$_Printer._WrapperMessageToJsonObject)FFFNN)r   r   r   r   r.   r   r#   r7   r<   ro   rq   ry   rv   r}   r5   r   r   r   r   r      s"        
@,r   c                 C   s   | j jdkS )Nzgoogle/protobuf/wrappers.proto)filerB   )r8   r   r   r   r4     s    r4   c                 C   s4   i }| D ]&\}}||kr&t d||||< q|S )Nz'Failed to load JSON: duplicate key {0}.)r   r+   )r1   resultrB   r9   r   r   r   _DuplicateChecker  s    
r   c              
   C   sz   t  }|dkr|jn|}| dd }z||}W n2 tk
rh } ztd| |W 5 d}~X Y nX t	|}| S )z"Creates a message from a type URL.N/z0Can not find message descriptor by type_url: {0})
r   ZDefaultpoolsplitZFindMessageTypeByNameKeyError	TypeErrorr+   r   ZGetMessageClass)rl   r   dbr   	type_namer8   rR   Zmessage_classr   r   r   rm     s    
rm   d   c              
   C   sn   t | ts| d} ztj| td}W n6 tk
r\ } ztdt||W 5 d}~X Y nX t	|||||S )al  Parses a JSON representation of a protocol message into a message.

  Args:
    text: Message JSON representation.
    message: A protocol buffer message to merge into.
    ignore_unknown_fields: If True, do not raise errors for unknown fields.
    descriptor_pool: A Descriptor Pool for resolving types. If None use the
      default.
    max_recursion_depth: max recursion depth of JSON message to be
      deserialized. JSON messages over this depth will fail to be
      deserialized. Default value is 100.

  Returns:
    The same message passed as argument.

  Raises::
    ParseError: On JSON parsing problems.
  rT   )object_pairs_hookzFailed to load JSON: {0}.N)
rE   rG   r^   r/   loadsr   rP   r   r+   	ParseDict)textr   ignore_unknown_fieldsr   max_recursion_depthr1   rR   r   r   r   Parse  s    

&
r   c                 C   s   t |||}|| |d |S )a8  Parses a JSON dictionary representation into a message.

  Args:
    js_dict: Dict representation of a JSON message.
    message: A protocol buffer message to merge into.
    ignore_unknown_fields: If True, do not raise errors for unknown fields.
    descriptor_pool: A Descriptor Pool for resolving types. If None use the
      default.
    max_recursion_depth: max recursion depth of JSON message to be
      deserialized. JSON messages over this depth will fail to be
      deserialized. Default value is 100.

  Returns:
    The same message passed as argument.
   )_ParserConvertMessage)Zjs_dictr   r   r   r   parserr   r   r   r     s    r   c                   @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )r   z(JSON format parser for protocol message.c                 C   s   || _ || _|| _d| _d S )Nr   )r   r   r   recursion_depth)r-   r   r   r   r   r   r   r.     s    z_Parser.__init__c                 C   s   |  j d7  _ | j | jkr*td| j|j}|j}|s@|j}t|rX| ||| n2|t	kr|t
t	| d ||||  n| ||| |  j d8  _ dS )a  Convert a JSON object into a message.

    Args:
      value: A JSON object.
      message: A WKT or regular protocol message to record the data.
      path: parent path to log parse error info.

    Raises:
      ParseError: In case of convert problems.
       z,Message too deep. Max recursion depth is {0}N)r   r   r   r+   r2   r3   rB   r4   _ConvertWrapperMessager6   r   _ConvertFieldValuePair)r-   r9   r   pathr8   r3   r   r   r   r     s    z_Parser.ConvertMessagec                 C   sh  g }|j }tdd |jD }|D ]>}zv||d}|sJ|j|d}|st|r|jsptd	|j
||dd }	|j|	}|sd|	ddd }	|j|	}|s| jrW q"td	|j
||d	d
 |jD ||krtd	|j j
|||| || }
|jdk	rX|
dk	rX|jj}||krNtd	|j j
|||| |
dkr|jtjjkr|jj
dkrt||j}d|_n:|jtjjkr|jj
dkrt||jd n||j W q"t|r||j | |
||d	|| n|j tjj!kr||j t"|
t#s>td	||
||jtjjkrt$|
D ]\\}}t||j% }|dkr|j j
dkrtd	|||| &||d	||| qVnTt$|
D ]J\}}|dkrtd	|||t||jt'||d	||| qn|jtjjkr\|j(r0|j| }nt||j}|)  | &|
|d	|| nB|j(rt'|
|d	|||j|< nt||jt'|
|d	|| W q" tk
r } z8|r|jdkrtd	|||ntt*||W 5 d}~X Y q" t+k
r, } ztd	|||W 5 d}~X Y q" t,k
r` } ztd	|||W 5 d}~X Y q"X q"dS )a'  Convert field value pairs into regular message.

    Args:
      js: A JSON object to convert the field value pairs.
      message: A regular protocol message to record the data.
      path: parent path to log parse error info.

    Raises:
      ParseError: In case of problems converting.
    c                 s   s   | ]}|j |fV  qd S r%   rC   r=   fr   r   r   	<genexpr>  s   z1_Parser._ConvertFieldValuePair.<locals>.<genexpr>Nz0Message type {0} does not have extensions at {1}r   r   .zaMessage type "{0}" has no field named "{1}" at "{2}".
 Available Fields(except extensions): "{3}"c                 S   s   g | ]
}|j qS r   r   r   r   r   r   r@   .  s     z2_Parser._ConvertFieldValuePair.<locals>.<listcomp>zBMessage type "{0}" should not have multiple "{1}" fields at "{2}".zHMessage type "{0}" should not have multiple "{1}" oneof fields at "{2}".google.protobuf.Valuer   rS   {0}.{1}z4repeated field {0} must be in [] which is {1} at {2}zPnull is not allowed to be used as an element in a repeated field at {0}.{1}[{2}]z{0}.{1}[{2}]zFailed to parse {0} field: {1}.)-r2   dictrK   rX   rD   _VALID_EXTENSION_NAMEmatchZis_extendabler   r+   r3   Z
ExtensionsZ_FindExtensionByNamejoinr   r   appendrN   rB   rL   r   r'   rM   r(   rw   rs   rU   rV   setattr
ClearFieldr*   _ConvertMapFieldValuerH   rI   rE   list	enumerateaddr   _ConvertScalarFieldValuerJ   ZSetInParentrG   rP   r   )r-   r1   r   r   namesr8   Zfields_by_json_namerB   r)   
identifierr9   Z
oneof_namern   indexitemrR   r   r   r   r     s   
     

 






  

  

    
  
 



z_Parser._ConvertFieldValuePairc           	   
   C   s$  t |tr|sdS z|d }W n2 tk
rP } ztd||W 5 d}~X Y nX zt|| j}W n4 tk
r } ztd|||W 5 d}~X Y nX |j}|j	}t
|r| |d |d| nJ|tkrtt| d |d |d||  n|d= | ||| ||d< | |_||_dS )z/Convert a JSON representation into Any message.Nrk   z0@type is missing when parsing any message at {0}
{0} at {1}r9   	{0}.valuer   )rE   r   r   r   r+   rm   r   r   r2   r3   r4   r   r6   r   r   ZSerializeToStringr9   rl   )	r-   r9   r   r   rl   rR   rn   r8   r3   r   r   r   _ConvertAnyMessage  s>    $
z_Parser._ConvertAnyMessagec              
   C   sH   z| | W n4 tk
rB } ztd|||W 5 d}~X Y nX dS )z?Convert a JSON representation into message with FromJsonString.r   N)ZFromJsonStringrP   r   r+   )r-   r9   r   r   rR   r   r   r   _ConvertGenericMessage  s    z_Parser._ConvertGenericMessagec                 C   s   t |tr| ||j| nxt |tr8| ||j| n\|dkrHd|_nLt |trZ||_	n:t |t
rl||_n(t |tr~||_ntd|t||dS )z1Convert a JSON representation into Value message.Nr   z(Value {0} has unexpected type {1} at {2})rE   r   _ConvertStructMessageZstruct_valuer   _ConvertListValueMessagert   rs   rF   Z
bool_valuerG   Zstring_value_INT_OR_FLOATru   r   r+   r&   )r-   r9   r   r   r   r   r   _ConvertValueMessage  s"    




  z_Parser._ConvertValueMessagec              	   C   sV   t |tstd|||d t|D ]$\}}| ||j d|| q,dS )z5Convert a JSON representation into ListValue message.z+ListValue must be in [] which is {0} at {1}r{   {0}[{1}]N)	rE   r   r   r+   r   r   r   r{   r   )r-   r9   r   r   r   r   r   r   r   r     s    
 

z _Parser._ConvertListValueMessagec              	   C   sP   t |tstd|||  |D ]$}| || |j| d|| q&dS )z2Convert a JSON representation into Struct message.z,Struct must be in a dict which is {0} at {1}r   N)rE   r   r   r+   ZClearr   rK   )r-   r9   r   r   rQ   r   r   r   r     s    
 
z_Parser._ConvertStructMessagec              	   C   s,   |j jd }t|dt||d|d dS )z3Convert a JSON representation into Wrapper message.r9   r   r   N)r2   rD   r   r   r+   )r-   r9   r   r   r)   r   r   r   r     s     z_Parser._ConvertWrapperMessagec           	   	   C   s   t |tstd|j|||jjd }|jjd }|D ]t}t||d|d}|jt	j
jkr| || t||j| d|| q:t|| |d||dt||j|< q:dS )	af  Convert map field value for a message map field.

    Args:
      value: A JSON object to convert the map field value.
      message: A protocol message to record the converted data.
      field: The descriptor of the map field to be converted.
      path: parent path to log parse error info.

    Raises:
      ParseError: In case of convert problems.
    z3Map field {0} must be in a dict which is {1} at {2}rQ   r9   z{0}.keyTr   r   N)rE   r   r   r+   rB   r(   rD   r   rL   r   r'   rM   r   rw   )	r-   r9   r   r)   r   Z	key_fieldZvalue_fieldrQ   	key_valuer   r   r   r     s2    
   

  
z_Parser._ConvertMapFieldValueN)r   r   r   r   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    	 	
r   c           	   
   C   s  zv|j tkrt| W S |j tkr.t| |W S |j tjjkrHt| |W S |j tjj	kr|j
tjjkrt| trz| d}n| }|ddt|d    }t|W S t| rtd| W S n|j tjjkrv|jj| d}|dkrnzt| }|jj|d}W n: tk
r< } ztd| |jj|W 5 d}~X Y nX |dkrn|jjrhtd| |jjn|W S |jW S W n6 tk
r } ztd|||W 5 d}~X Y nX dS )aq  Convert a single scalar field value.

  Args:
    value: A scalar value to convert the scalar field value.
    field: The descriptor of the field to convert.
    path: parent path to log parse error info.
    require_str: If True, the field value must be a str.

  Returns:
    The converted scalar field value

  Raises:
    ParseError: In case of convert problems.
  rT      =   zUnpaired surrogateNz(Invalid enum value {0} for enum type {1}r   ) rL   
_INT_TYPES_ConvertIntegerra   _ConvertFloatr   r'   r_   _ConvertBoolrZ   r&   r[   rE   rG   encodelenr\   urlsafe_b64decode_UNPAIRED_SURROGATE_PATTERNsearchr   rU   rV   Zvalues_by_namerX   intrW   rP   r+   r3   rY   number)	r9   r)   r   require_strencodedZpadded_valuerj   r   rR   r   r   r   r     sP    





 

 r   c                 C   sf   t | tr |  s td| t | trF| ddkrFtd| t | tr^td| t| S )zConvert an integer.

  Args:
    value: A scalar value to convert.

  Returns:
    The integer value.

  Raises:
    ParseError: If an integer couldn't be consumed.
  zCouldn't parse integer: {0} r   zCouldn't parse integer: "{0}"z2Bool value {0} is not acceptable for integer field)	rE   ri   
is_integerr   r+   rG   findrF   r   )r9   r   r   r   r   <  s    
r   c              
   C   s  t | trrt| rtdt| r@| dkr8tdntd|jtjj	krr| t
jkr`td| t
jk rrtd| dkrtdz
t| W S  tk
r } z\| tkrtd	 W Y FS | tkrtd
 W Y .S | tkrtd W Y S td| |W 5 d}~X Y nX dS )z!Convert an floating point number.z,Couldn't parse NaN, use quoted "NaN" insteadr   zICouldn't parse Infinity or value too large, use quoted "Infinity" insteadzKCouldn't parse -Infinity or value too small, use quoted "-Infinity" insteadzFloat value too largezFloat value too smallnanz-Couldn't parse float "nan", use "NaN" insteadz-infinfzCouldn't parse float: {0}N)rE   ri   rb   rf   r   rc   rL   r   r'   rh   r   Z
_FLOAT_MAXZ
_FLOAT_MINrP   rd   re   rg   r+   )r9   r)   rR   r   r   r   r   U  s0    






r   c                 C   s@   |r*| dkrdS | dkrdS t d| t| ts<t d| S )zConvert a boolean value.

  Args:
    value: A scalar value to convert.
    require_str: If True, value must be a str.

  Returns:
    The bool parsed.

  Raises:
    ParseError: If a boolean value couldn't be consumed.
  r:   Tr;   Fz#Expected "true" or "false", not {0}z%Expected true or false without quotes)r   r+   rE   rF   )r9   r   r   r   r   r   y  s    
r   ro   r   rq   r   rv   r   r}   r   ry   r   )zgoogle.protobuf.Anyzgoogle.protobuf.Durationzgoogle.protobuf.FieldMaskzgoogle.protobuf.ListValuezgoogle.protobuf.Structzgoogle.protobuf.Timestampr   )FFr   FFNNT)FFFNN)FNr   )FNr   )F):r   
__author__r\   collectionsr   r/   rb   operatorr   resysZgoogle.protobuf.internalr   Zgoogle.protobufr   r   r   Z_TIMESTAMPFOMAT	frozensetr'   ZCPPTYPE_INT32ZCPPTYPE_UINT32ZCPPTYPE_INT64ZCPPTYPE_UINT64r   r`   rh   ZCPPTYPE_DOUBLEra   re   rd   rg   compiler   r   	Exceptionr
   r   r   r"   r$   r*   objectr   r4   r   rm   r   r   r   ri   r   r   r   r   r   r   r6   r   r   r   r   <module>   s   
        
.     
& S	   
#   
  &
:$