3 SÉLjÇÆã @s dZdZddlZddlZddlZejr*eZddlm Z ddl m Z ddl m Z ddd d d gZ e jƒe jƒe jƒe jƒfZejd ejƒZejd ejƒZee jje jjgƒZedOƒZdZGdd„deƒZGdd„deƒZ Gdd„de!ƒZ"dPdd„Z#dd„Z$dQdd„Z%dRdd „Z&dSdd „Z'dd„Z(Gd d!„d!e!ƒZ)dTd"d#„Z*dUd$d „Z+dVd%d&„Z,dWd'd(„Z-Gd)d*„d*e!ƒZ.d+d,„Z/d-d.„Z0d/d0„Z1d1d2„Z2Gd3d4„d4e!ƒZ3e3Z4d5d6„Z5d7d8„Z6d9d:„Z7d;d<„Z8d=d>„Z9d?d@„Z:dXdAdB„Z;dYdCdD„ZdIdJ„Z?dKdL„Z@dMdN„ZAdS)\abContains routines for printing protocol messages in text format. Simple usage example: # Create a proto object and serialize it to a text proto string. message = my_proto_pb2.MyMessage(foo='bar') text_proto = text_format.MessageToString(message) # Parse a text proto string. message = text_format.Parse(text_proto, my_proto_pb2.MyMessage()) z kenton@google.com (Kenton Varda)éN)Ú type_checkers)Ú descriptor)Ú text_encodingÚMessageToStringÚ PrintMessageÚ PrintFieldÚPrintFieldValueÚMergez-?inf(?:inity)?f?znanf?ú'ú"zgoogle.protobuf.Anyc@seZdZdZdS)ÚErrorz'Top-level module error for text_format.N)Ú__name__Ú __module__Ú __qualname__Ú__doc__©rrú!/usr/lib/python3.6/text_format.pyr Isr cs2eZdZdZd ‡fdd„ Zdd„Zdd„Z‡ZS) Ú ParseErrorz3Thrown in case of text parsing or tokenizing error.Ncsr|dk r:|dk r:t|ƒ}|dk r.|dj|ƒ7}dj||ƒ}|dk rTtt|ƒj|ƒntt|ƒjƒ||_||_dS)Nz:{0}z {0} : {1})ÚstrÚformatÚsuperrÚ__init__Ú_lineÚ_column)ÚselfÚmessageÚlineÚcolumnÚloc)Ú __class__rrrPs zParseError.__init__cCs|jS)N)r)rrrrÚGetLine]szParseError.GetLinecCs|jS)N)r)rrrrÚ GetColumn`szParseError.GetColumn)NNN)r rrrrr r!Ú __classcell__rr)rrrMs rc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) Ú TextWritercCs tjrtjƒ|_n tjƒ|_dS)N)ÚsixÚPY2ÚioÚBytesIOÚ_writerÚStringIO)rÚas_utf8rrrrfs zTextWriter.__init__cCs(tjrt|tjƒr|jdƒ}|jj|ƒS)Nzutf-8)r$r%Ú isinstanceÚ text_typeÚencoder(Úwrite)rÚvalrrrr.ls  zTextWriter.writecCs |jjƒS)N)r(Úclose)rrrrr0rszTextWriter.closecCs |jjƒS)N)r(Úgetvalue)rrrrr1uszTextWriter.getvalueN)r rrrr.r0r1rrrrr#dsr#Fc CsLt|ƒ} t| ||||||||| ƒ } | j|ƒ| jƒ} | jƒ|rH| jƒS| S)a”Convert protobuf message to text format. Floating point values can be formatted compactly with 15 digits of precision (which is the most that IEEE 754 "double" can guarantee) using float_format='.15g'. To ensure that converting to text and back to a proto will result in an identical value, float_format='.17g' should be used. Args: message: The protocol buffers message. as_utf8: Produce text output in UTF8 format. as_one_line: Don't introduce newlines between fields. pointy_brackets: If True, use angle brackets instead of curly braces for nesting. use_index_order: If True, print fields of a proto message using the order defined in source code instead of the field number. By default, use the field number order. float_format: If set, use this to specify floating point number formatting (per the "Format Specification Mini-Language"); otherwise, str() is used. use_field_number: If True, print field numbers instead of names. descriptor_pool: A DescriptorPool used to resolve Any types. indent: The indent level, in terms of spaces, for pretty print. message_formatter: A function(message, indent, as_one_line): unicode|None to custom format selected sub-messages (usually based on message type). Use to pretty print parts of the protobuf for easier diffing. Returns: A string of the text formatted protocol buffer message. )r#Ú_Printerrr1r0Úrstrip) rr*Ú as_one_lineÚpointy_bracketsÚuse_index_orderÚ float_formatÚuse_field_numberÚdescriptor_poolÚindentÚmessage_formatterÚoutÚprinterÚresultrrrrys&  cCs"|jtjjko |jjo |jjƒjS)N)ÚtyperÚFieldDescriptorÚ TYPE_MESSAGEÚ message_typeZ has_optionsÚ GetOptionsZ map_entry)ÚfieldrrrÚ _IsMapEntry«srEc Cs(t||||||||| | ƒ } | j|ƒdS)N)r2r) rr<r:r*r4r5r6r7r8r9r;r=rrrr±s c Cs&t|||||||| ƒ} | j||ƒdS)z%Print a single field name/value pair.N)r2r) rDÚvaluer<r:r*r4r5r6r7r;r=rrrrÂs  c Cs&t|||||||| ƒ} | j||ƒdS)z0Print a single field value (not including name).N)r2r) rDrFr<r:r*r4r5r6r7r;r=rrrrÒs  c Csd|dkrddlm}|jƒ}ddlm}|jƒ}y|j|ƒ}Wntk rRdSX|j|ƒ}|ƒS)a!Returns a protobuf message instance. Args: type_name: Fully-qualified protobuf message type name string. descriptor_pool: DescriptorPool instance. Returns: A Message instance of type matching type_name, or None if the a Descriptor wasn't found matching type_name. Nr)r9)Úsymbol_database)Úgoogle.protobufr9ZDefaultrGZFindMessageTypeByNameÚKeyErrorZ GetPrototype)Z type_namer9Zpool_modrGZdatabaseÚmessage_descriptorrBrrrÚ_BuildMessageFromTypeNameâs    rKc @sJeZdZdZddd„Zdd„Zd d „Zd d „Zd d„Zdd„Z dd„Z dS)r2z)Text format printer for protocol message.rFNc Cs@||_||_||_||_||_||_||_||_| |_| |_ dS)aZInitialize the Printer. Floating point values can be formatted compactly with 15 digits of precision (which is the most that IEEE 754 "double" can guarantee) using float_format='.15g'. To ensure that converting to text and back to a proto will result in an identical value, float_format='.17g' should be used. Args: out: To record the text format result. indent: The indent level for pretty print. as_utf8: Produce text output in UTF8 format. as_one_line: Don't introduce newlines between fields. pointy_brackets: If True, use angle brackets instead of curly braces for nesting. use_index_order: If True, print fields of a proto message using the order defined in source code instead of the field number. By default, use the field number order. float_format: If set, use this to specify floating point number formatting (per the "Format Specification Mini-Language"); otherwise, str() is used. use_field_number: If True, print field numbers instead of names. descriptor_pool: A DescriptorPool used to resolve Any types. message_formatter: A function(message, indent, as_one_line): unicode|None to custom format selected sub-messages (usually based on message type). Use to pretty print parts of the protobuf for easier diffing. N) r<r:r*r4r5r6r7r8r9r;) rr<r:r*r4r5r6r7r8r9r;rrrrþs%z_Printer.__init__cCsht|jƒ|jƒ}|r`|j|jƒ|jjd|jd|jfƒ|j |ƒ|jj|j rVdndƒdSdSdS)z5Serializes if message is a google.protobuf.Any field.z%s[%s]ú Ú TFN) rKZTypeNamer9ÚMergeFromStringrFr<r.r:Ztype_urlÚ_PrintMessageFieldValuer4)rrZpacked_messagerrrÚ_TryPrintAsAnyMessage.s  z_Printer._TryPrintAsAnyMessagecCsV|j||j|jƒ}|dkrdS|j}|jd|jƒ|j|ƒ|j|jrLdndƒdS)NFrLrMT)r;r:r4r<r.)rrZ formattedr<rrrÚ_TryCustomFormatMessage;s z _Printer._TryCustomFormatMessagecCsÔ|jr|j|ƒrdS|jjtkr.|j|ƒr.dS|jƒ}|jrL|jdd„d�x‚|D]z\}}t |ƒr–xht |ƒD]$}|j ƒ|||d�}|j ||ƒqlWqR|j tjjkrÀx&|D]}|j ||ƒqªWqR|j ||ƒqRWdS)zeConvert protobuf message to text format. Args: message: The protocol buffers message. NcSs |djS)Nr)Úindex)ÚxrrrÚSsz'_Printer.PrintMessage..)Úkey)rUrF)r;rQÚ DESCRIPTORÚ full_nameÚ_ANY_FULL_TYPE_NAMErPZ ListFieldsr6ÚsortrEÚsortedÚ GetEntryClassrÚlabelrr@ÚLABEL_REPEATED)rrZfieldsrDrFrUZ entry_submsgÚelementrrrrFs"   z_Printer.PrintMessagecCsü|j}|jd|jƒ|jr.|jt|jƒƒnŠ|jrŽ|jdƒ|jjƒj rv|j t j j krv|jt j jkrv|j|jjƒn |j|jƒ|jdƒn*|j t j jkr¬|j|jjƒn |j|jƒ|jt j jkrÐ|jdƒ|j||ƒ|jrî|jdƒn |jdƒdS)z%Print a single field name/value pair.rLú[ú]z: rMN)r<r.r:r8rÚnumberÚ is_extensionÚcontaining_typerCZmessage_set_wire_formatr?rr@rAr\ZLABEL_OPTIONALrBrWÚ TYPE_GROUPÚnameÚcpp_typeÚCPPTYPE_MESSAGErr4)rrDrFr<rrrrds*        z_Printer.PrintFieldcCs–|jrd}d}nd}d}|jrF|jjd|ƒ|j|ƒ|jj|ƒnL|jjd|ƒ|jd7_|j|ƒ|jd8_|jjd|j|ƒdS) Nú<ú>ú{ú}z %s z %s érL)r5r4r<r.rr:)rrFZopenbZclosebrrrrO…s  z _Printer._PrintMessageFieldValuecCs<|j}|jtjjkr"|j|ƒ�n|jtjjkrf|jjj |dƒ}|dk rV|j |j ƒn|j t |ƒƒnÒ|jtjj krÒ|j dƒt|tjƒr–|jdƒ}n|}|jtjjkr®d}n|j}|j tj||ƒƒ|j dƒnf|jtjjkrü|rð|j dƒn |j dƒn<|jtk�r*|jdk �r*|j dj|j|ƒƒn|j t |ƒƒdS)zÝPrint a single field value (not including name). For repeated fields, the value should be a single element. Args: field: The descriptor of the field to be printed. value: The value of the field. Nr zutf-8FÚtrueÚfalsez{1:{0}})r<rfrr@rgrOZ CPPTYPE_ENUMÚ enum_typeÚvalues_by_numberÚgetr.rerZCPPTYPE_STRINGr+r$r,r-r?Ú TYPE_BYTESr*rZCEscapeZ CPPTYPE_BOOLÚ _FLOAT_TYPESr7r)rrDrFr<Ú enum_valueZ out_valueZ out_as_utf8rrrr˜s2       z_Printer.PrintFieldValue) rFFFFNFNN) r rrrrrPrQrrrOrrrrrr2ûs  &  !r2cCs>t|tƒs&tjr|jdƒ}n |jdƒ}t|jdƒ||||d�S)aôParses a text representation of a protocol message into a message. NOTE: for historical reasons this function does not clear the input message. This is different from what the binary msg.ParseFrom(...) does. Example a = MyProto() a.repeated_field.append('test') b = MyProto() text_format.Parse(repr(a), b) text_format.Parse(repr(a), b) # repeated_field contains ["test", "test"] # Binary version: b.ParseFromString(a.SerializeToString()) # repeated_field is now "test" Caller is responsible for clearing the message as needed. Args: text: Message text representation. message: A protocol buffer message to merge into. allow_unknown_extension: if True, skip over missing extensions and keep parsing allow_field_number: if True, both field number and field name are allowed. descriptor_pool: A DescriptorPool used to resolve Any types. Returns: The same message passed as argument. Raises: ParseError: On text parsing problems. zutf-8rM)r9)r+rr$ÚPY3Údecoder-Ú ParseLinesÚsplit)ÚtextrÚallow_unknown_extensionÚallow_field_numberr9rrrÚParseÂs%    r|cCs>t|tƒs&tjr|jdƒ}n |jdƒ}t|jdƒ||||d�S)a^Parses a text representation of a protocol message into a message. Like Parse(), but allows repeated values for a non-repeated field, and uses the last one. Args: text: Message text representation. message: A protocol buffer message to merge into. allow_unknown_extension: if True, skip over missing extensions and keep parsing allow_field_number: if True, both field number and field name are allowed. descriptor_pool: A DescriptorPool used to resolve Any types. Returns: The same message passed as argument. Raises: ParseError: On text parsing problems. zutf-8rM)r9)r+rr$rurvr-Ú MergeLinesrx)ryrrzr{r9rrrr ós   cCst|||d�}|j||ƒS)aParses a text representation of a protocol message into a message. Args: lines: An iterable of lines of a message's text representation. message: A protocol buffer message to merge into. allow_unknown_extension: if True, skip over missing extensions and keep parsing allow_field_number: if True, both field number and field name are allowed. descriptor_pool: A DescriptorPool used to resolve Any types. Returns: The same message passed as argument. Raises: ParseError: On text parsing problems. )r9)Ú_Parserrw)Úlinesrrzr{r9ÚparserrrrrwsrwcCst|||d�}|j||ƒS)aParses a text representation of a protocol message into a message. Args: lines: An iterable of lines of a message's text representation. message: A protocol buffer message to merge into. allow_unknown_extension: if True, skip over missing extensions and keep parsing allow_field_number: if True, both field number and field name are allowed. descriptor_pool: A DescriptorPool used to resolve Any types. Returns: The same message passed as argument. Raises: ParseError: On text parsing problems. )r9)r~r})rrrzr{r9r€rrrr}3sr}c@sneZdZdZddd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z e dd„ƒZdd„ZdS)r~z(Text format parser for protocol message.FNcCs||_||_||_dS)N)rzr{r9)rrzr{r9rrrrQsz_Parser.__init__cCs&t|tƒs|jdƒ}|j|jdƒ|ƒS)zBParses a text representation of a protocol message into a message.zutf-8rM)r+rrvrwrx)rryrrrrÚParseFromStringYs  z_Parser.ParseFromStringcCsd|_|j||ƒ|S)zBParses a text representation of a protocol message into a message.F)Ú_allow_multiple_scalarsÚ _ParseOrMerge)rrrrrrrw_s z_Parser.ParseLinescCs|j|jdƒ|ƒS)zBMerges a text representation of a protocol message into a message.rM)Z _MergeLinesrx)rryrrrrrNesz_Parser.MergeFromStringcCsd|_|j||ƒ|S)zBMerges a text representation of a protocol message into a message.T)r‚rƒ)rrrrrrr}is z_Parser.MergeLinescCs&t|ƒ}x|jƒs |j||ƒq WdS)züConverts a text representation of a protocol message into a message. Args: lines: Lines of a message's text representation. message: A protocol buffer message to merge into. Raises: ParseError: On text parsing problems. N)Ú TokenizerÚAtEndÚ _MergeField)rrrÚ tokenizerrrrrƒos  z_Parser._ParseOrMergec Cs€|j}|jdƒr®|jƒg}x|jdƒr6|j|jƒƒqWdj|ƒ}|jsX|jd|jƒ‚|jj |ƒ}|s„|j rtd}q¢|jd|ƒ‚n||j kr¢|jd||jfƒ‚|j dƒnÌ|j ƒ}|jrø|jƒrøt|ddƒ}|jj|dƒ}| rö|jrö|jj|ƒ}nh|jj|dƒ}|�s8|jj|jƒdƒ}|�r8|jtjjk�r8d}|�r`|jtjjk�r`|jj|k�r`d}|�sz|jd |j|fƒ‚|�r^|j �rÔ|j�rÔ|j|jjƒ}|dk �rÔ||jk�rÔ|jd |j||jj|jfƒ‚|jtjj k�rö|jd ƒ|j!}n|j d ƒ|j"}|j#tjj$k�rP|jdƒ�rPx8||||ƒ|jdƒ�r>P|j d ƒ�q$Wn ||||ƒnt%|ƒ|jd ƒ�s||jd ƒdS)zþMerges a single protocol message field into a message. Args: tokenizer: A tokenizer to parse the field name and values. message: A protocol message to record the data. Raises: ParseError: In case of text parsing problems. r_Ú.z+Message type "%s" does not have extensions.NzþExtension "%s" not registered. Did you import the _pb2 module which defines it? If you are trying to place the extension in the MessageSet field of another message that is in an Any or MessageSet field, that message's _pb2 module must be imported as wellz1Extension "%s" does not extend message type "%s".r`Tz*Message type "%s" has no field named "%s".zbField "%s" is specified along with field "%s", another member of oneof "%s" for message type "%s".ú:ú,ú;)&rVÚ TryConsumeÚConsumeIdentifierÚappendÚjoinZ is_extendableÚParseErrorPreviousTokenrWÚ ExtensionsZ_FindExtensionByNamerzrcÚConsumeÚConsumeIdentifierOrNumberr{ÚisdigitÚ ParseIntegerZfields_by_numberrqZ_FindExtensionByNumberÚfields_by_nameÚlowerr?rr@rdrBrer‚Zcontaining_oneofZ WhichOneofrfrgÚ_MergeMessageFieldÚ_MergeScalarFieldr\r]Ú_SkipFieldContents) rr‡rrJrerDraZ which_oneofZmergerrrrr†}s€                    z_Parser._MergeFieldcCs€|jƒg}|jdƒ|j|jƒƒ|jdƒ|j|jƒƒ|jdƒ|jƒg}x|jdƒrj|j|jƒƒqPWdj|ƒdj|ƒfS)zBConsumes a google.protobuf.Any type URL and returns the type name.rˆú/)r�r’rŽrŒr�)rr‡ÚprefixrerrrÚ_ConsumeAnyTypeUrlês      z_Parser._ConsumeAnyTypeUrlcCst|ƒ}|jdƒrd}n|jdƒd}|jjtko:|jdƒ�r |j|ƒ\}}|jdƒ|jdƒ|jdƒrpd}n|jdƒd}t||jƒ} | sšt d|ƒ‚x2|j|ƒsÌ|j ƒr¾|j d |fƒ‚|j || ƒqœW|j tjjkrît||jƒjƒ} n t||jƒ} | j| |d �n||j tjjk�r^|j�r2|j|jƒ} n*|�rLt||jƒjƒƒ} nt||jƒjƒ} n(|j�rr|j|} n t||jƒ} | jƒx8|j|ƒ�s¾|j ƒ�r®|j d |fƒ‚|j || ƒ�qˆW|�r|jjd j} | tjjk�rt||jƒ| j} | j| jƒn| jt||jƒ| j<d S) a"Merges a single scalar field into a message. Args: tokenizer: A tokenizer to parse the field value. message: The message of which field is a member. field: The descriptor of the field to be merged. Raises: ParseError: In case of text parsing problems. rhrirjrkr_r`r‰z$Type %s not found in descriptor poolzExpected "%s".)Útype_url_prefixrFN)rErŒr’rBrWrXr�rKr9rr…r�r†r\rr@r]ÚgetattrreÚaddZPackrbr‘r[Z SetInParentr–rfrgrUZ MergeFromrF)rr‡rrDZ is_map_entryZ end_tokenržZpacked_type_nameZexpanded_any_end_tokenZexpanded_any_sub_messageZ any_messageZ sub_messageZ value_cpptyperFrrrr˜ùsb                z_Parser._MergeMessageFieldcCs|j}t|dƒo|jdkS)NÚsyntaxÚproto3)rVÚhasattrr¡)rrJrrrÚ_IsProto3SyntaxAs z_Parser._IsProto3SyntaxcCs|j}d}|jtjjtjjtjjfkr0t|ƒ}nø|jtjjtjj tjj fkrVt |ƒ}nÒ|jtjj tjj fkrvt|ƒ}n²|jtjjtjjfkr–t|ƒ}n’|jtjjtjjfkr¶|jƒ}nr|jtjjkrÎ|jƒ}nZ|jtjjkræ|jƒ}nB|jtjjkrþ|jƒ}n*|jtjjk�r|j|ƒ}ntd|jƒ‚|jtjjk�rf|j �rR|j!|j"|ƒnt#||j$ƒj"|ƒnœ|j%|ƒ }|j �r¼|j& �r°|�r°|j'|ƒ�r°|j(d|j)j*|j*fƒ‚n ||j!|<nF|j& �rô|�rô|j+|j$ƒ�rô|j(d|j)j*|j$fƒ‚nt,||j$|ƒdS)aHMerges a single scalar field into a message. Args: tokenizer: A tokenizer to parse the field value. message: A protocol message to record the data. field: The descriptor of the field to be merged. Raises: ParseError: In case of text parsing problems. RuntimeError: On runtime errors. NzUnknown field type %dz;Message type "%s" should not have multiple "%s" extensions.z7Message type "%s" should not have multiple "%s" fields.)-rzr?rr@Z TYPE_INT32Z TYPE_SINT32Z TYPE_SFIXED32Ú _ConsumeInt32Z TYPE_INT64Z TYPE_SINT64Z TYPE_SFIXED64Ú _ConsumeInt64Z TYPE_UINT32Z TYPE_FIXED32Ú_ConsumeUint32Z TYPE_UINT64Z TYPE_FIXED64Ú_ConsumeUint64Z TYPE_FLOATZ TYPE_DOUBLEÚ ConsumeFloatZ TYPE_BOOLÚ ConsumeBoolZ TYPE_STRINGÚ ConsumeStringrrÚConsumeByteStringZ TYPE_ENUMÚ ConsumeEnumÚ RuntimeErrorr\r]rbr‘rŽrŸrer¤r‚Z HasExtensionr�rVrWZHasFieldÚsetattr)rr‡rrDÚ_rFZcan_check_presencerrrr™Gs\                       z_Parser._MergeScalarField)FFN)r rrrrr�rwrNr}rƒr†r�r˜Ú staticmethodr¤r™rrrrr~Ns mH r~cCs8|jdƒr,|jdƒ r,|jdƒ r,t|ƒnt|ƒdS)z}Skips over contents (value or message) of a field. Args: tokenizer: A tokenizer to parse the field name and values. r‰rjrhN)rŒÚ LookingAtÚ_SkipFieldValueÚ_SkipFieldMessage)r‡rrrrš�s  ršcCs^|jdƒr6|jƒx|jdƒr(|jƒqW|jdƒn|jƒt|ƒ|jdƒsZ|jdƒdS)z€Skips over a complete field (name and value/message). Args: tokenizer: A tokenizer to parse the field name and values. r_rˆr`rŠr‹N)rŒr�r’rš)r‡rrrÚ _SkipField s     rµcCsR|jdƒrd}n|jdƒd}x$|jdƒ rB|jdƒ rBt|ƒq W|j|ƒdS)zfSkips over a field message. Args: tokenizer: A tokenizer to parse the field name and values. rhrirjrkN)rŒr’r²rµ)r‡Z delimiterrrrr´·s   r´cCsT|jƒrx |jƒrq WdS|jƒ rPt|ƒ rPt|ƒ rP|jƒ rPtd|jƒ‚dS)z¨Skips over a field value. Args: tokenizer: A tokenizer to parse the field name and values. Raises: ParseError: In case an invalid field value is found. NzInvalid field value: )ÚTryConsumeByteStringÚTryConsumeIdentifierÚ_TryConsumeInt64Ú_TryConsumeUint64ÚTryConsumeFloatrÚtoken)r‡rrrr³Ês    r³c@sHeZdZdZejdƒZejdejƒZejdejƒZ ejdj ddgdd „e DƒƒƒZ ejd ƒZ ejd ƒZdEd d„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„ZdFd*d+„Zd,d-„Zd.d/„Zd0d1„Z d2d3„Z!d4d5„Z"d6d7„Z#d8d9„Z$d:d;„Z%dd?„Z'd@dA„Z(dBdC„Z)dDS)Gr„zÍProtocol buffer text representation tokenizer. This class handles the lower level string parsing by splitting it into meaningful tokens. It was directly ported from the Java protocol buffer API. z\s+z (\s*#.*$)z (\s|(#.*$))+ú|z[a-zA-Z_][0-9a-zA-Z_+-]*z#([0-9+-]|(\.[0-9]))[0-9a-zA-Z_.+-]*cCsg|]}dj|d�‘qS)z!{qt}([^{qt}\n\\]|\\.)*({qt}|\\?$))Zqt)r)Ú.0Zmarkrrrú ðszTokenizer.z [^\d\W]\w*z\w+TcCsld|_d|_d|_d|_d|_t|ƒ|_d|_d|_d|_ d|_ ||_ |rP|j pT|j |_|jƒ|jƒdS)NréÚTéÿÿÿÿ)Z _positionrrZ _token_startr»ÚiterÚ_linesÚ _current_lineÚ_previous_lineÚ_previous_columnÚ _more_linesÚ_skip_commentsÚ_WHITESPACE_OR_COMMENTÚ _WHITESPACEÚ_whitespace_patternÚ_SkipWhitespaceÚ NextToken)rrZ skip_commentsrrrrös  zTokenizer.__init__cCs |j|kS)N)r»)rr»rrrr²szTokenizer.LookingAtcCs|j S)z^Checks the end of the text was reached. Returns: True iff the end was reached. )r»)rrrrr… szTokenizer.AtEndc Cs`xZt|jƒ|jkrZyt|jƒ|_Wn tk rBd|_d|_dSX|jd7_d|_qWdS)NrÀFr¿r)ÚlenrÄrÚnextrÃÚ StopIterationrÇr)rrrrÚ_PopLineszTokenizer._PopLinecCsFx@|jƒ|jj|j|jƒ}|s"Pt|jdƒƒ}|j|7_qWdS)Nr)rÑrËÚmatchrÄrrÎÚgroup)rrÒZlengthrrrrÌszTokenizer._SkipWhitespacecCs|j|kr|jƒdSdS)z‰Tries to consume a given piece of text. Args: token: Text to consume. Returns: True iff the text was consumed. TF)r»rÍ)rr»rrrrŒ's zTokenizer.TryConsumecCs|j|ƒs|jd|ƒ‚dS)zˆConsumes a piece of text. Args: token: Text to consume. Raises: ParseError: If the text couldn't be consumed. zExpected "%s".N)rŒr)rr»rrrr’5s zTokenizer.ConsumecCs(|j}|jj|ƒs|jdƒ‚|jƒ|S)NzExpected comment.)r»Ú_COMMENTrÒrrÍ)rr>rrrÚConsumeCommentAs   zTokenizer.ConsumeCommentcCs:|jdko|jdk}|j}|jƒ}|j|ko0| }||fS)zCConsumes a comment, returns a 2-tuple (trailing bool, comment str).r)rrrÅrÕ)rZ just_startedZbefore_parsingZcommentZtrailingrrrÚConsumeCommentOrTrailingCommentHs  z)Tokenizer.ConsumeCommentOrTrailingCommentc Cs&y |jƒdStk r dSXdS)NTF)r�r)rrrrr·Xs zTokenizer.TryConsumeIdentifiercCs(|j}|jj|ƒs|jdƒ‚|jƒ|S)z�Consumes protocol message field identifier. Returns: Identifier string. Raises: ParseError: If an identifier couldn't be consumed. zExpected identifier.)r»Ú _IDENTIFIERrÒrrÍ)rr>rrrr�_s   zTokenizer.ConsumeIdentifierc Cs&y |jƒdStk r dSXdS)NTF)r“r)rrrrÚTryConsumeIdentifierOrNumberns z&Tokenizer.TryConsumeIdentifierOrNumbercCs,|j}|jj|ƒs |jd|ƒ‚|jƒ|S)z�Consumes protocol message field identifier. Returns: Identifier string. Raises: ParseError: If an identifier couldn't be consumed. z&Expected identifier or number, got %s.)r»Ú_IDENTIFIER_OR_NUMBERrÒrrÍ)rr>rrrr“us  z#Tokenizer.ConsumeIdentifierOrNumberc Cs&y |jƒdStk r dSXdS)NTF)ÚConsumeIntegerr)rrrrÚTryConsumeInteger„s zTokenizer.TryConsumeIntegerFcCsPyt|j|d�}Wn0tk rB}z|jt|ƒƒ‚WYdd}~XnX|jƒ|S)zÜConsumes an integer number. Args: is_long: True if the value should be returned as a long integer. Returns: The integer parsed. Raises: ParseError: If an integer couldn't be consumed. )Úis_longN)Ú_ParseAbstractIntegerr»Ú ValueErrorrrrÍ)rrÜr>ÚerrrrÚŒs  zTokenizer.ConsumeIntegerc Cs&y |jƒdStk r dSXdS)NTF)r©r)rrrrrºžs zTokenizer.TryConsumeFloatcCsLyt|jƒ}Wn0tk r>}z|jt|ƒƒ‚WYdd}~XnX|jƒ|S)zžConsumes an floating point number. Returns: The number parsed. Raises: ParseError: If a floating point number couldn't be consumed. N)Ú ParseFloatr»rÞrrrÍ)rr>rßrrrr©¥s  zTokenizer.ConsumeFloatcCsLyt|jƒ}Wn0tk r>}z|jt|ƒƒ‚WYdd}~XnX|jƒ|S)z‹Consumes a boolean value. Returns: The bool parsed. Raises: ParseError: If a boolean value couldn't be consumed. N)Ú ParseBoolr»rÞrrrÍ)rr>rßrrrrªµs  zTokenizer.ConsumeBoolc Cs&y |jƒdStk r dSXdS)NTF)r¬r)rrrrr¶Ås zTokenizer.TryConsumeByteStringcCsF|jƒ}y tj|dƒStk r@}z|j|ƒ‚WYdd}~XnXdS)z‹Consumes a string value. Returns: The string parsed. Raises: ParseError: If a string value couldn't be consumed. zutf-8N)r¬r$r,ÚUnicodeDecodeErrorÚ_StringParseError)rZ the_bytesrßrrrr«Ìs  zTokenizer.ConsumeStringcCs<|jƒg}x&|jr0|jdtkr0|j|jƒƒq Wdj|ƒS)z Consumes a byte array value. Returns: The array parsed (as a string). Raises: ParseError: If a byte array value couldn't be consumed. ró)Ú_ConsumeSingleByteStringr»Ú_QUOTESrŽr�)rZthe_listrrrr¬Ûs zTokenizer.ConsumeByteStringcCs®|j}t|ƒdks|dtkr.|jd|fƒ‚t|ƒdksJ|d|dkrZ|jd|fƒ‚ytj|dd…ƒ}Wn0tk r }z|jt|ƒƒ‚WYdd}~XnX|jƒ|S) aOConsume one token of a string literal. String literals (whether bytes or text) can come in multiple adjacent tokens which are automatically concatenated, like in C or Python. This method only consumes one token. Returns: The token parsed. Raises: ParseError: When the wrong format data is found. r¿rzExpected string but found: %rrlzString missing ending quote: %rNrÁrÁ) r»rÎrærrZ CUnescaperÞrrÍ)rryr>rßrrrråés  z"Tokenizer._ConsumeSingleByteStringcCsNyt||jƒ}Wn0tk r@}z|jt|ƒƒ‚WYdd}~XnX|jƒ|S)N)Ú ParseEnumr»rÞrrrÍ)rrDr>rßrrrr­s  zTokenizer.ConsumeEnumcCst||jd|jdƒS)z¯Creates and *returns* a ParseError for the previously read token. Args: message: A message to set for the exception. Returns: A ParseError instance. r¿)rrÅrÆ)rrrrrr� s z!Tokenizer.ParseErrorPreviousTokencCst||jd|jdƒS)z9Creates and *returns* a ParseError for the current token.r¿)rrr)rrrrrrszTokenizer.ParseErrorcCs|jdt|ƒƒS)NzCouldn't parse string: )rr)rrßrrrrãszTokenizer._StringParseErrorcCs–|j|_|j|_|jt|jƒ7_|jƒ|jsrßrrrríŒs  rícCs2t||d�}tdt|ƒt|ƒ}|j|ƒ|S)aParses an integer. Args: text: The text to parse. is_signed: True if a signed integer must be parsed. is_long: True if a long integer must be parsed. Returns: The integer value. Raises: ValueError: Thrown Iff the text is not a valid integer. )rÜrl)rÝÚ_INTEGER_CHECKERSÚintZ CheckValue)ryrìrÜr>Zcheckerrrrr•¢s  r•c CsBy|rt|dƒSt|dƒSWn tk r<td|ƒ‚YnXdS)a Parses an integer without checking size/signedness. Args: text: The text to parse. is_long: True if the value should be returned as a long integer. Returns: The integer value. Raises: ValueError: Thrown Iff the text is not a valid integer. rzCouldn't parse integer: %sN)ÚlongrðrÞ)ryrÜrrrrݹs  rÝcCsŒyt|ƒStk r†tj|ƒr@|ddkr6tdƒStdƒSnBtj|ƒrRtdƒSyt|jdƒƒStk r€td|ƒ‚YnXYnXdS) z°Parse a floating point number. Args: text: Text to parse. Returns: The number parsed. Raises: ValueError: If a floating point number couldn't be parsed. rú-z-infÚinfÚnanÚfzCouldn't parse float: %sN)ÚfloatrÞÚ_FLOAT_INFINITYrÒÚ _FLOAT_NANr3)ryrrrràÓs     ràcCs$|d kr dS|dkrd Std ƒ‚d S)zœParse a boolean value. Args: text: Text to parse. Returns: Boolean values parsed Raises: ValueError: If text is not a valid boolean. rmÚtÚ1ÚTrueTrnrõÚ0ÚFalseFzExpected "true" or "false".N)rmrùrúrû)rnrõrürý)rÞ)ryrrrráós rác Csœ|j}yt|dƒ}Wn<tk rP|jj|dƒ}|dkrLtd|j|fƒ‚YnFXt|jdƒrn|jjdkrn|S|j j|dƒ}|dkr–td|j|fƒ‚|j S)a&Parse an enum value. The value can be specified by a number (the enum value), or by a string literal (the enum name). Args: field: Enum field descriptor. value: String value. Returns: Enum value number. Raises: ValueError: If the enum value could not be parsed. rNz%Enum type "%s" has no value named %s.r¡r¢z+Enum type "%s" has no value with number %d.) rorðrÞZvalues_by_namerqrWr£Úfiler¡rpra)rDrFZenum_descriptorrartrrrrçs   rç)r r ) FFFFNFNrN) rFFFFNFNN)rFFFFNN)rFFFFNN)FFN)FFN)FFN)FFN)FF)FF)FF)F)BrÚ __author__r&rér$rurðrñZgoogle.protobuf.internalrrHrrÚ__all__ZUint32ValueCheckerZInt32ValueCheckerZUint64ValueCheckerZInt64ValueCheckerrïrêÚ IGNORECASEr÷røÚ frozensetr@Z CPPTYPE_FLOATZCPPTYPE_DOUBLErsrærXÚ Exceptionr rÚobjectr#rrErrrrKr2r|r rwr}r~ršrµr´r³r„Z _Tokenizerr¥r§r¸r¦r¹r¨rîrír•rÝràrárçrrrrÚ)sÀ      )   J / #  AW