
    S                         d Z ddlZddl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
  ej                  dd      Z G d	 d
e      Zy)zMessage registry for apitools.    N)
descriptor)messages)extended_descriptor)utilTypeInfo	type_namevariantc                      e Zd ZdZ edej                  j                         edej                  j                         edej                  j                         edej                  j                         edej                  j                        dZ edej                  j                         edej                  j                         edej                  j                          edej                  j"                         edej                  j$                         edej                  j&                         ed	ej(                  j                         ed
ej                  j*                         edej                  j                        d	Zd Zed        Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$e%jL                  d        Z'd Z(d Z)d Z*d Z+d Z,d  Z-d! Z.e/d"        Z0d# Z1d$ Z2d% Z3d& Z4d' Z5y())MessageRegistryzRegistry for message types.

    This closely mirrors a messages.FileDescriptor, but adds additional
    attributes (such as message and field descriptions) and some extra
    code for validation and cycle detection.
    stringr   integerbooleannumberextra_types.JsonValue)r   r   r   r   anybytezextra_types.DateFieldz8apitools.base.protorpclite.message_types.DateTimeMessage)	int32uint32int64uint64doublefloatr   datez	date-timec                    || _         || _        |j                  | _        t	        j
                  |      | _        || _        || _        || _	        t        j                  | j                  | j                        | _        d| j                  z  g| j                  _        t        j                         | _        t#               | _        t#               | _        g | _        | j                  | _        y )N)packagedescriptionz$from %s import messages as _messages)_MessageRegistry__names_MessageRegistry__client_infor   _MessageRegistry__packager   CleanDescription_MessageRegistry__description"_MessageRegistry__root_package_dir$_MessageRegistry__base_files_package"_MessageRegistry__protorpc_packager   ExtendedFileDescriptor!_MessageRegistry__file_descriptoradditional_importscollectionsOrderedDict"_MessageRegistry__message_registryset_MessageRegistry__nascent_types_MessageRegistry__unknown_types_MessageRegistry__current_path_MessageRegistry__current_env)selfclient_infonamesr   root_package_dirbase_files_packageprotorpc_packages          0lib/third_party/apitools/gen/message_registry.py__init__zMessageRegistry.__init__P   s    ($,,!22;?"2$6!"2!4!K!KNN0B0B"D 3T5L5LL5
1 #."9"9";"u  #u !33    c                 :    | j                          | j                  S N)Validater'   )r1   s    r7   file_descriptorzMessageRegistry.file_descriptorl   s    %%%r9   c                     | j                          t        j                  | j                  | j                  | j
                  j                  |       y)z(Write the messages file to out as proto.N)r<   r   WriteMessagesFiler'   r    r   versionr1   printers     r7   WriteProtoFilezMessageRegistry.WriteProtoFileq   s9    --""DNND4F4F4N4N	r9   c                     | j                          t        j                  | j                  | j                  | j
                  j                  |       y)zWrite the messages file to out.N)r<   r   WritePythonFiler'   r    r   r@   rA   s     r7   	WriteFilezMessageRegistry.WriteFilex   s9    ++""DNND4F4F4N4N	r9   c                 X    | j                   xs | j                  }|rt        d|z        y )NzMalformed MessageRegistry: %s)r-   r.   
ValueError)r1   	mysteriess     r7   r<   zMessageRegistry.Validate   s1    ((@D,@,@	<yHII r9   c                 v    dj                  t        t        j                  | j                  d d  |gz               S )N.)joinmapsix	text_typer/   r1   names     r7   __ComputeFullNamez!MessageRegistry.__ComputeFullName   s.    xxCMM4+>+>q+ATF+JKLLr9   c                     || j                   j                  vr&| j                   j                  j                  |       y y r;   )r'   r(   append)r1   
new_imports     r7   __AddImportzMessageRegistry.__AddImport   s6    T33FFF""55<<ZH Gr9   c                 X    | j                   j                  | j                  |             y r;   )r-   add!_MessageRegistry__ComputeFullNamerP   s     r7   __DeclareDescriptorz#MessageRegistry.__DeclareDescriptor   s!      !7!7!=>r9   c                    t        |t        j                  t        j                  f      st	        dt        |            | j                  |j                        }|| j                  v rt	        d|z        || j                  vrt	        d      ||_
        || j                  |<   t        |t        j                        r&| j                  j                  j                  |       n?t        |t        j                        r%| j                  j                  j                  |       | j                  j!                  |       | j                  j#                  |       y)z/Register the given descriptor in this registry.zCannot add descriptor of type z$Attempt to re-register descriptor %sz&Directly adding types is not supportedN)
isinstancer   ExtendedMessageDescriptorExtendedEnumDescriptorrH   typerY   rQ   r+   r-   	full_namer0   message_typesrT   
enum_typesr.   discardremove)r1   new_descriptorr`   s      r7   __RegisterDescriptorz$MessageRegistry.__RegisterDescriptor   s0   .#==#::+< = ^$' ( (**>+>+>?	///6BD DD000EFF#, -;	*n)CCE,,33NC+BBD))00@$$Y/##I.r9   c                 $    | j                  |      S r;   )%_MessageRegistry__GetDescriptorByNamerP   s     r7   LookupDescriptorz MessageRegistry.LookupDescriptor   s    ))$//r9   c                 H    | j                  |      }|t        d|z        |S )Nz No message descriptor named "%s")ri   rH   )r1   rQ   message_descriptors      r7   LookupDescriptorOrDiez%MessageRegistry.LookupDescriptorOrDie   s0    !2248%?$FGG!!r9   c                 B    | j                  | j                  |            S r;   )rh   rY   rP   s     r7   __GetDescriptorzMessageRegistry.__GetDescriptor   s    ))$*@*@*FGGr9   c                 v    || j                   v r| j                   |   S || j                  v rt        d|z        y )Nz0Cannot retrieve type currently being created: %s)r+   r-   rH   rP   s     r7   __GetDescriptorByNamez%MessageRegistry.__GetDescriptorByName   sI    4*****4004'''BTIK Kr9   c              #      K   | j                   }| j                  j                  |j                         || _         d  | j                  j	                          || _         y wr;   )r0   r/   rT   rQ   pop)r1   rk   previous_envs      r7   __DescriptorEnvzMessageRegistry.__DescriptorEnv   sS      ))""#5#:#:;/!)s   AA!c                    t        j                         }| j                  j                  |      |_        t        j                  |      |_        | j                  |j                         t        t        ||            D ]  \  }\  }}t        j                         }	| j                  j                  |      |	_        |	j                  |k7  rb|j                  j                  t         j                  j                  |	j                  |             | j!                  d| j"                  z         ||	_        t        j                  |xs d      |	_        |j&                  j                  |	        | j)                  |       y)z?Add a new EnumDescriptor named name with the given enum values.python_name	json_namefrom %s import encodingz<no description>N)r   r^   r   	ClassNamerQ   r   r!   r   #_MessageRegistry__DeclareDescriptor	enumeratezipExtendedEnumValueDescriptorNormalizeEnumNameenum_mappingsrT   JsonEnumMapping_MessageRegistry__AddImportr$   r   values$_MessageRegistry__RegisterDescriptor)
r1   rQ   r   enum_valuesenum_descriptionsmessageindex	enum_nameenum_description
enum_values
             r7   AddEnumDescriptorz!MessageRegistry.AddEnumDescriptor   sB    &<<>||--d3"33K@  .4=K!23550E0I/,HHJJ"ll<<YGJO)+%%,,'>>NN$.OOy O JK   !:!%!:!:"; < %J%)%:%: 6$6&8J"NN!!*-55 	!!'*r9   c                    t        j                         }| j                  j                  |d         |_        ||_        | j                  |j                         | j                  d| j                  z         | j                  |       y)z)Declare schema as an alias for alias_for.idfrom %s import extra_typesN)
r   r]   r   rz   rQ   	alias_forr{   r   r$   r   )r1   schemar   r   s       r7   __DeclareMessageAliasz%MessageRegistry.__DeclareMessageAlias   ss     &??A||--fTl;%  .5223 	4!!'*r9   c                    |d   }| j                  |j                  |      }t        j                  |j	                  d            }|d|j                  z  }d|i|dd}d}|j
                  j                  | j                  |t        |      dz   |             | j                  d	| j                  z         |j                  j                  d
|z         y)z-Add an additionalProperties field to message.additionalPropertiesr   Nz Additional properties of type %s$refarray)itemsr   r_      ry   z"encoding.MapUnrecognizedFields(%r))+_MessageRegistry__AddAdditionalPropertyTyperQ   r   r!   getfieldsrT   /_MessageRegistry__FieldDescriptorFromPropertieslenr   r$   
decorators)	r1   r   r   
propertiesadditional_properties_infoentries_type_namer   attrs
field_names	            r7   __AddAdditionalPropertiesz)MessageRegistry.__AddAdditionalProperties   s    %+,B%C" <<LL46++&**=9;<w||KK ) '
 ,
dBBJ!+U4 	52T5N5NNO!!0:=	?r9   c                    | j                  |      ry|j                  d      r| j                  ||       y|j                  d      dk(  r| j                  |d       y|j                  d      dk7  rt	        d|j                  d      z        t        j                         }| j                  j                  |d         |_	        t        j                  |j                  d	d
|j                  z              |_        | j                  |j                         | j                  |      5  |j                  di       }t        t!        |j#                                     D ]  \  }\  }}| j%                  ||dz   |      }|j&                  j)                  |       |j                  |k7  sJ|j*                  j)                  t-        |      j/                  |j                  |             | j1                  d| j2                  z          d|v r| j5                  |||       ddd       | j7                  |       y# 1 sw Y   xY w)z>Add a new MessageDescriptor named schema_name based on schema.Nenumr_   r   r   objectz-Cannot create message descriptors for type %sr   r   zA %s object.r   r   rv   ry   r   )_MessageRegistry__GetDescriptorr   _MessageRegistry__DeclareEnum%_MessageRegistry__DeclareMessageAliasrH   r   r]   r   rz   rQ   r   r!   r   r{   _MessageRegistry__DescriptorEnvr|   sortedr   r   r   rT   field_mappingsr_   JsonFieldMappingr   r$   )_MessageRegistry__AddAdditionalPropertiesr   )	r1   schema_namer   r   r   r   rQ   r   fields	            r7   AddDescriptorFromSchemaz'MessageRegistry.AddDescriptorFromSchema   s    ,::f{F3::f&&&v/FG::f)L#ZZ/0 1 1%??A||--fTl;"33FJJ>GLL85: ;  .!!'*L"5J(1&9I9I9K2L(M$}e<<%!)U,%%e,::%**11W66(-

d 7 DE $$1D4M4MMO )N &/..w
K + 	!!'* +*s   )A>H8(A6H88Ic                     d}t        |      }|j                  dd       d|z  }|d|ddd|d	d
}| j                  ||       |S )z,Add a new nested AdditionalProperty message.AdditionalPropertyr   Nz'An additional property for a %s object.r   r   z Name of the additional property.)r_   r   )keyvaluer   r_   r   r   )dictrr   r   )r1   rQ   property_schemanew_type_namer   r   s         r7   __AddAdditionalPropertyTypez+MessageRegistry.__AddAdditionalPropertyType   sl    ,/ 	M40?$F& %#E )	
 	$$]F;r9   c                 p    |j                  dd       d|z  }|d|dd|did}| j                  ||       |S )	zAdd a type for a list entry.r   NzSingle entry in a %s.r   entryr   )r_   r   r   )rr   r   )r1   entry_type_nameentry_schemaparent_namer   r   s         r7   __AddEntryTypezMessageRegistry.__AddEntryType7  sW    --;!&#)	

 	$$_f=r9   c                    t        j                         }| j                  j                  |      |_        ||_        | j                  |      |_        | j                  j                  d| j                  j                  |      z        }| j                  ||      }|j                  |_
        |j                  |_        d|v r|d   }|j                  dk(  sE|j                  t        j                  j                  k(  st        t!        j"                  |            }|j                  t        j                  j                  k(  r| j                  j%                  |      }||_        t)        j*                         }|j                  |_        t-        j.                  |j1                  dd|j                  z              |_        ||_        |S )z*Create a field descriptor for these attrs.z%sValuedefaultr   r   zA %s attribute.)r   FieldDescriptorr   	CleanNamerQ   r   _MessageRegistry__ComputeLabellabelrz   _MessageRegistry__GetTypeInfor	   r
   r   VariantENUMstrjsonloadsr   default_valuer   ExtendedFieldDescriptorr   r!   r   r   field_descriptor)	r1   rQ   r   r   r   new_type_name_hint	type_infor   extended_fields	            r7   __FieldDescriptorFromPropertiesz/MessageRegistry.__FieldDescriptorFromPropertiesI  si   **,\\++D1
))%0!\\33..t446&&u.@A	#--!))I&GOOx/MMX%5%5%:%::djj12}} 0 0 5 55,,88A")E,DDF#jj%)%:%:IIm%6%HI&K"*/'r9   c                    | j                  dd      r$t        j                  j                  j                  S | j                  d      dk(  r$t        j                  j                  j
                  S | j                  d      r$t        j                  j                  j
                  S t        j                  j                  j                  S )NrequiredFr_   r   repeated)r   r   r   LabelREQUIREDREPEATEDOPTIONAL)r   s    r7   __ComputeLabelzMessageRegistry.__ComputeLabeld  s    99Z'--33<<<YYv')--33<<<YYz"--33<<<))//888r9   c                 (   t        j                  |j                  dd            }|d   }|j                  ddgt        |      z        }| j	                  ||||       | j                  |       t        |t        j                  j                        S )Nr    r   enumDescriptionsr   )
r   r!   r   r   r   _MessageRegistry__AddIfUnknownr   r   r   r   )r1   r   r   r   r   r   s         r7   __DeclareEnumzMessageRegistry.__DeclareEnumn  s    ++EIImR,HIFm!IIs;'7 79y+*,=	?I&)X5E5E5J5JKKr9   c                    | j                   j                  |      }| j                  |      }|| j                  j	                         vr9|| j                  j	                         vr| j
                  j                  |       y y y r;   )r   rz   rY   r+   keysr.   rX   )r1   r	   full_type_names      r7   __AddIfUnknownzMessageRegistry.__AddIfUnknownx  st    LL**95	//	:$"9"9">">"@@!8!8!=!=!??  $$Y/ @ Ar9   c                    | j                   j                  |j                  d            }|j                  d      }|s|st        d|z        |r6| j	                  |       t        |t        j                  j                        S d|v rd|z  }| j                  ||      S d|v r| j                  j                  |d         }|t|j                  j                  d      r| j                  d	| j                  z         |j                  j                  d
      r| j                  d| j                  z         |S || j                   v rJ| j                   |   }|j                  j                  d
      r| j                  d| j                  z         |S |dk(  r|j                  d      }|st        d|z        | j                   j                  |j                  d      xs d|z        }| j#                  |      }	|	t$        j&                  j(                  j*                  k(  ru| j                   j                  |j                  d      xs |      }
| j-                  ||j                  d      |
      }t        |t        j                  j                        S | j/                  ||      S |dk(  r-| j                  d| j                  z         | j                   d   S |dk(  re|st        d      t1        |      }||d<   | j3                  ||       | j	                  |       t        |t        j                  j                        S t        d|z        )z;Return a TypeInfo object for attrs, creating one if needed.r   r_   zNo type found for %sr   r   z%sValuesEnumformat)z)apitools.base.protorpclite.message_types.zmessage_types.z.from %s import message_types as _message_typeszextra_types.r   r   r   z Array type with no item type: %stitlez%sListEntryr   r   z,Cannot create subtype without some name hintr   zUnknown type: %s)r   rz   r   rH   r   r   r   r   MESSAGEr   PRIMITIVE_FORMAT_MAPr	   
startswithr   r%   r$   PRIMITIVE_TYPE_INFO_MAPr   r   r   r   r   _MessageRegistry__AddEntryTyper   r   r   )r1   r   	name_hinttype_refr	   r   r   r   entry_name_hintentry_labelr   r   r   s                r7   __GetTypeInfozMessageRegistry.__GetTypeInfo  s@    <<))%))F*;<IIf%	I3e;<<) "H,<,<,D,DF F U?&2I%%i77u1155eHoFI $&&11 3* + $$H//01 &&11.A$$4t7P7PPR  44444Y?I""--n=  043L3LLNIIg&E !Ce!KLL"ll44		'"?mi&?AO--e4Kj88>>GGG"ll44IIg&3)5"&"5"5#UYYw%7#F/(0(8(8(@(@B B%%e_==%9!667 8//66(" BD D%[F$F4L((F;	*#X-=-=-E-EG G +i788r9   c                 \    | j                   j                  D ]  }| j                  |        y r;   )r=   ra   _FixupMessage)r1   message_types     r7   FixupMessageFieldsz"MessageRegistry.FixupMessageFields  s&     00>>L|, ?r9   c                    | j                  |      5  |j                  D ]  }|j                  j                  t        j
                  j                  k(  s5|j                  j                  }| j                  |      }t        |t        j                        swt        j
                  j                  |j                  _         |j                  D ]  }| j                  |        	 d d d        y # 1 sw Y   y xY wr;   )r   r   r   r
   r   r   r   r	   ri   r\   r   r^   r   ra   r   )r1   r   r   field_type_name
field_typesubmessage_types         r7   r   zMessageRegistry._FixupMessage  s    !!,/%,,))11X5E5E5M5MM&+&<&<&F&FO!%!6!6!GJ!*"5"L"LN9A9I9I9N9N..6 - $0#=#=""?3 $> 0//s   AC-AC-AC--C6N)6__name__
__module____qualname____doc__r   r   StringFieldDEFAULT_VARIANTIntegerFieldBooleanField
FloatFieldr   r   r   INT32UINT32INT64UINT64DOUBLEFLOAT
BytesFieldSTRINGr   r8   propertyr=   rC   rF   r<   rY   r   r{   r   ri   rl   r   rh   
contextlibcontextmanagerr   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r    r9   r7   r   r   !   sE    X#+#7#7#G#GIi$,$9$9$I$IKi$,$9$9$I$IKX#+#6#6#F#FH"9 ( 0 0 8 8: I"*"2"2"8"8:Y#+#3#3#:#:<H"*"2"2"8"8:X#+#3#3#:#:<X#+#3#3#:#:<H"*"2"2"8"8:6!)!4!4!D!DF#:!)!1!1!8!8:)$$,,.#.48 & &J
MI?/00"H * *+.	+?.!+F.$6 9 9L0J9X-
4r9   r   )r   r)   r  r   rN   apitools.base.protorpcliter   r   apitools.genr   r   
namedtupler   r   r   r  r9   r7   <module>r     sE   " %    
 1 / , !;!!*.FGx4f x4r9   