Ë
    oj×   ã            
       óê  — d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ  e«       Zeeef   Zdedefd„Z dedefd„Z!d„  ed«      d„ d„ fd„  ed«      e e!fgZ"e"D � ���ci c]
  \  } }}}||“Œ c}}}} Z#dede$fd„Z%de$defd„Z&dedefd„Z'dedefd„Z(	 d'd ee   d!edefd"„Z)	 	 d(d$ee   d!e
e   d%e*de	e   fd&„Z+y#c c}}}} w ))zA
Tools for saving and loading log events in a structured format.
é    )ÚdumpsÚloads)ÚIOÚAnyÚAnyStrÚDictÚIterableÚOptionalÚUnionÚcast)ÚUUID)ÚNamedConstant)ÚFailureé   ©ÚFileLogObserver)ÚflattenEvent)ÚLogEvent)ÚLogLevel)ÚLoggerÚfailureÚreturnc                 óž   — t        | j                  «       t        | j                  j                  | j                  j                  ¬«      ¬«      S )zÖ
    Convert a failure to a JSON-serializable data structure.

    @param failure: A failure to serialize.

    @return: a mapping of strings to ... stuff, mostly reminiscent of
        L{Failure.__getstate__}
    )Ú
__module__Ú__name__)Útype)ÚdictÚ__getstate__r   r   r   )r   s    ú6/usr/lib/python3/dist-packages/twisted/logger/_json.pyÚfailureAsJSONr       s?   € ô Ø×ÑÓÜØ—|‘|×.Ñ.Ø—\‘\×*Ñ*ô
ôð ó    ÚfailureDictc                 óv   — t        j                  t         «      }| d   }t        |d   d|«      | d<   | |_        |S )zÌ
    Load a L{Failure} from a dictionary deserialized from JSON.

    @param failureDict: a JSON-deserialized object like one previously returned
        by L{failureAsJSON}.

    @return: L{Failure}
    r   r   © )r   Ú__new__r   Ú__dict__)r"   ÚfÚtypeInfos      r   ÚfailureFromJSONr)   .   s@   € ô 	�‰œÓ €AØ˜6Ñ"€HÜ˜x¨
Ñ3°R¸ÓB€K�ÑØ€A„JØ€Hr!   c                 ó`   — t        | t        «      xr t        t        | j                  d «      | u S ©N)Ú
isinstancer   Úgetattrr   Úname©Úlevels    r   ú<lambda>r1   @   s+   € Ü�uœmÓ,ò =Üœ %§*¡*¨dÓ3°uÐ<ð r!   z$02E59486-F24D-46AD-8224-3ACDF2A5732Ac                 ó.   — t        | j                  ¬«      S )N)r.   )r   r.   r/   s    r   r1   r1   E   s   € ”d §
¡
Ô+€ r!   c                 ó*   — t        t        | d   d «      S )Nr.   )r-   r   r/   s    r   r1   r1   F   s   € ”gœh¨¨f©°tÓ<€ r!   c                 ó"   — t        | t        «      S r+   )r,   r   )Úos    r   r1   r1   I   s   € ”*˜Q¤Ó(€ r!   z$E76887E2-20ED-49BF-A8F8-BA25CC586F2DÚaDictc                 óB   — d| v rt        t        | d   «         | «      S | S )a#  
    Dictionary-to-object-translation hook for certain value types used within
    the logging system.

    @see: the C{object_hook} parameter to L{json.load}

    @param aDict: A dictionary loaded from a JSON object.

    @return: C{aDict} itself, or the object represented by C{aDict}
    Ú__class_uuid__)ÚuuidToLoaderr   )r6   s    r   ÚobjectLoadHookr:   T   s,   € ð ˜5Ñ ÜœD Ð'7Ñ!8Ó9Ñ:¸5ÓAÐAØ€Lr!   ÚpythonObjectc                 ón   — t         D ])  \  }}}} || «      sŒ || «      }t        |«      |d<   |c S  ddiS )a�  
    Object-to-serializable hook for certain value types used within the logging
    system.

    @see: the C{default} parameter to L{json.dump}

    @param pythonObject: Any object.

    @return: If the object is one of the special types the logging system
        supports, a specially-formatted dictionary; otherwise, a marker
        dictionary indicating that it could not be serialized.
    r8   ÚunpersistableT)Ú	classInfoÚstr)r;   Ú	predicateÚuuidÚsaverÚloaderÚresults         r   ÚobjectSaveHookrE   d   sO   € ô +4ò Ñ&ˆ	�4˜ Ù�\Õ"Ù˜<Ó(ˆFÜ'*¨4£yˆFÐ#Ñ$ØŠMð	ð
 ˜TÐ"Ð"r!   Úeventc                 ón   — dt         dt        t        t        f   fd„}t	        | «       t        | |d¬«      S )a˜  
    Encode an event as JSON, flattening it if necessary to preserve as much
    structure as possible.

    Not all structure from the log event will be preserved when it is
    serialized.

    @param event: A log event dictionary.

    @return: A string of the serialized JSON; note that this will contain no
        newline characters, and may thus safely be stored in a line-delimited
        file.
    Úunencodabler   c                 óZ   — t        | t        «      r| j                  d«      S t        | «      S )z®
        Serialize an object not otherwise serializable by L{dumps}.

        @param unencodable: An unencodable object.

        @return: C{unencodable}, serialized
        Úcharmap)r,   ÚbytesÚdecoderE   )rH   s    r   ÚdefaultzeventAsJSON.<locals>.defaultˆ   s*   € ô �k¤5Ô)Ø×%Ñ% iÓ0Ð0Ü˜kÓ*Ð*r!   T)rM   Úskipkeys)Úobjectr   ÚJSONDictr?   r   r   )rF   rM   s     r   ÚeventAsJSONrQ   y   s7   € ð
+œVð 
+¬¬h¼¨mÑ(<ó 
+ô �ÔÜ� °$Ô7Ð7r!   Ú	eventTextc                 ó@   — t        t        t        | t        ¬«      «      S )z¦
    Decode a log event from JSON.

    @param eventText: The output of a previous call to L{eventAsJSON}

    @return: A reconstructed version of the log event.
    )Úobject_hook)r   rP   r   r:   )rR   s    r   ÚeventFromJSONrU   ˜   s   € ô ”œ% 	´~ÔFÓGÐGr!   ÚoutFileÚrecordSeparatorc                 ó"   ‡— t        | ˆfd„«      S )aÏ  
    Create a L{FileLogObserver} that emits JSON-serialized events to a
    specified (writable) file-like object.

    Events are written in the following form::

        RS + JSON + NL

    C{JSON} is the serialized event, which is JSON text.  C{NL} is a newline
    (C{"\n"}).  C{RS} is a record separator.  By default, this is a single
    RS character (C{"\x1e"}), which makes the default output conform to the
    IETF draft document "draft-ietf-json-text-sequence-13".

    @param outFile: A file-like object.  Ideally one should be passed which
        accepts L{str} data.  Otherwise, UTF-8 L{bytes} will be used.
    @param recordSeparator: The record separator to use.

    @return: A file log observer.
    c                 ó$   •— ‰› t        | «      › d�S )Nú
)rQ   )rF   rW   s    €r   r1   z%jsonFileLogObserver.<locals>.<lambda>º   s   ø€  /Ð!2´;¸uÓ3EÐ2FÀbÐI€ r!   r   )rV   rW   s    `r   ÚjsonFileLogObserverr[   £   s   ø€ ô, ØÓIóð r!   NÚinFileÚ
bufferSizec              #   ó  ‡K  — dt         dt        fd„}dt        dt        t           fd„Š|€" || j                  d«      «      }|dk(  r|}nd	}n
 ||«      }d	}|d	k(  rd
}‰}ndt        dt        t           fˆfd„}t        |«      }	 | j                  |«      }|st        |«      dkD  r ||«      }	|	�|	–— y| ||«      z  }|j                  |«      }
|
dd D ]   }t        |«      dkD  sŒ ||«      }	|	€Œ|	–— Œ" |
d   }Œz­w)aM  
    Load events from a file previously saved with L{jsonFileLogObserver}.
    Event records that are truncated or otherwise unreadable are ignored.

    @param inFile: A (readable) file-like object.  Data read from C{inFile}
        should be L{str} or UTF-8 L{bytes}.
    @param recordSeparator: The expected record separator.
        If L{None}, attempt to automatically detect the record separator from
        one of C{"\x1e"} or C{""}.
    @param bufferSize: The size of the read buffer used while reading from
        C{inFile}.

    @return: Log events as read from C{inFile}.
    Úsr   c                 óH   — t        | t        «      r| S | j                  d«      S )Núutf-8)r,   rK   Úencode)r_   s    r   ÚasBytesz&eventsFromJSONLogFile.<locals>.asBytesÒ   s    € Ü�aœÔØˆHà—8‘8˜GÓ$Ð$r!   Úrecordc                 ó  — 	 t        | «      j                  d«      }	 t        |«      S # t        $ r# t        j	                  dt        | «      ¬«       Y y w xY w# t        $ r# t        j	                  dt        | «      ¬«       Y y w xY w)Nra   z2Unable to decode UTF-8 for JSON record: {record!r}©rd   z&Unable to read JSON record: {record!r})rK   rL   ÚUnicodeDecodeErrorÚlogÚerrorrU   Ú
ValueError)rd   Útexts     r   ÚeventFromBytearrayz1eventsFromJSONLogFile.<locals>.eventFromBytearrayØ   s„   € ð	Ü˜“=×'Ñ'¨Ó0ˆDð	Ü  Ó&Ð&øô "ò 	Ü�I‰IØDÜ˜V“}ð ô ñ ð	ûô ò 	Ü�I‰IÐ>ÄuÈVÃ}ˆIÔUÙð	ús    ‚( �
A ¨)AÁAÁ)BÂBNr   ó   r!   ó   
c                 óx   •— | d   t        d«      k(  r ‰| «      S t        j                  dt        | «      ¬«       y )NéÿÿÿÿrZ   z0Unable to read truncated JSON record: {record!r}rf   )Úordrh   ri   rK   )rd   rl   s    €r   ÚeventFromRecordz.eventsFromJSONLogFile.<locals>.eventFromRecordþ   s>   ø€ Ø�b‰zœS ›YÒ&Ù)¨&Ó1Ð1ä—	‘	ØFÜ  ›=ð ô ð r!   r   rp   )r   rK   Ú	bytearrayr
   r   ÚreadÚlenÚsplit)r\   rW   r]   rc   ÚfirstÚrecordSeparatorBytesrr   ÚbufferÚnewDatarF   Úrecordsrd   rl   s               @r   ÚeventsFromJSONLogFiler|   ¾   sE  øè ø€ ð(%”6ð %œeó %ð¤9ð ´¼(Ñ1Có ð  ÐÙ˜Ÿ™ A›Ó'ˆà�GÒà#(Ñ ð $'Ñ ñ  ' Ó7ÐØˆà˜sÒ"Ø$Ðà,‰ð	¤Ið 	´(¼8Ñ2Dõ 	ô �uÓ€Fà
Ø—+‘+˜jÓ)ˆáÜ�6‹{˜QŠÙ'¨Ó/�ØÐ$Ø’KØà‘'˜'Ó"Ñ"ˆØ—,‘,Ð3Ó4ˆà˜c˜r�lò 	 ˆFÜ�6‹{˜Q‹Ù'¨Ó/�ØÑ$Ø“Kð		 ð ˜‘ˆð' ùs   ƒC'DÃ+
DÃ6D)ú)Ni   ),Ú__doc__Újsonr   r   Útypingr   r   r   r   r	   r
   r   r   rA   r   Ú
constantlyr   Útwisted.python.failurer   Ú_filer   Ú_flattenr   Ú_interfacesr   Ú_levelsr   Ú_loggerr   rh   r?   rP   r    r)   r>   r9   rO   r:   rE   rQ   rU   r[   Úintr|   )r@   rA   rB   rC   s   0000r   ú<module>r‰      sŠ  ðñ
÷ ß I× IÓ IÝ å $å *Ý "Ý "Ý !Ý Ý áƒh€ð ��S�‰>€ð˜7ð  xó ð$ ð ¨gó ñ$	
ñ 	Ð3Ó4Ù+Ù<ðñ 	)ÙÐ3Ó4ØØð	ð€	ð& FO×OÑOÑ!A )¨T°5¸&��f‘ÕO€ð˜(ð  vó ð # ð #¨Hó #ð*8�xð 8 Có 8ð>H˜Sð H Xó Hð .4ñØ�‰WðØ'*ðàóð: &*Øñ_Øˆs‰Gð_à˜c‘]ð_ð ð_ð ˆhÑô	_ùõ[ Ps   ÂC-
