
    "hk'                    x   d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
mZ ddlmZ ddl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mZ  G d de      Z G d d      ZeefZddZ  G d d      Z! G d de      Z ee       G d d             Z" ee       G d d             Z#ddZ$ G d d      Z%y) z
Processors and tools specific to the `Twisted <https://twisted.org/>`_
networking engine.

See also :doc:`structlog's Twisted support <twisted>`.
    )annotationsN)AnyCallableSequenceTextIOlog)Failure)ILogObservertextFromEventDict)implementer   )BoundLoggerBase)_BUILTIN_DEFAULT_PROCESSORS)JSONRenderer)	EventDictWrappedLoggerc                  $    e Zd ZdZdddZdddZy)BoundLoggera  
    Twisted-specific version of `structlog.BoundLogger`.

    Works exactly like the generic one except that it takes advantage of
    knowing the logging methods in advance.

    Use it like::

        configure(
            wrapper_class=structlog.twisted.BoundLogger,
        )

    Nc                *     | j                   d|fi |S )zG
        Process event and call ``log.msg()`` with the result.
        msg_proxy_to_loggerselfeventkws      N/var/www/html/sandstorm/venv/lib/python3.12/site-packages/structlog/twisted.pyr   zBoundLogger.msg.        %t$$UE8R88    c                *     | j                   d|fi |S )zG
        Process event and call ``log.err()`` with the result.
        errr   r   s      r   r"   zBoundLogger.err4   r   r    N)r   z
str | Noner   r   returnr   )__name__
__module____qualname____doc__r   r"    r    r   r   r      s    99r    r   c                      e Zd ZdZddZy)LoggerFactoryz
    Build a Twisted logger when an *instance* is called.

    >>> from structlog import configure
    >>> from structlog.twisted import LoggerFactory
    >>> configure(logger_factory=LoggerFactory())
    c                    t         S )z
        Positional arguments are silently ignored.

        :rvalue: A new Twisted logger.

        .. versionchanged:: 0.4.0
            Added support for optional positional arguments.
        r   )r   argss     r   __call__zLoggerFactory.__call__D   s	     
r    N)r-   r   r$   r   r%   r&   r'   r(   r.   r)   r    r   r+   r+   ;   s    	r    r+   c                   | j                  dd      }| j                  dd      }| j                  dd      }t        |t              rt        |t              rt        d      |rt        |t              rt        d      t        |t              st        |t              r|xs d}|}t        |t              r|}|s!t        j                         dk7  r
t               }t        |t              rt        |t              st        |      }||| fS )	z
    Removes all possible *_why*s and *_stuff*s, analyzes exc_info and returns
    a tuple of ``(_stuff, _why, eventDict)``.

    **Modifies** *eventDict*!
    _stuffN_whyr   z3Both _stuff and event contain an Exception/Failure.z!Both `_why` and `event` supplied.error)NNN)	pop
isinstance_FAIL_TYPES
ValueErrorstrsysexc_infor
   BaseException)	eventDictr1   r2   r   s       r   _extractStuffAndWhyr=   S   s     ]]8T*F==&DMM'4(E&+&:e[+INOO 
5#&<== fk*z%/Mw%clln(:: &-(FG1L4""r    c                  (    e Zd ZdZddZddZddZy)	ReprWrappera  
    Wrap a string and return it as the ``__repr__``.

    This is needed for ``twisted.python.log.err`` that calls `repr` on
    ``_stuff``:

    >>> repr("foo")
    "'foo'"
    >>> repr(ReprWrapper("foo"))
    'foo'

    Note the extra quotes in the unwrapped example.
    c                    || _         y r#   string)r   rB   s     r   __init__zReprWrapper.__init__   s	    r    c                d    t        || j                        xr | j                  |j                  k(  S )z5
        Check for equality, just for tests.
        )r5   	__class__rB   )r   others     r   __eq__zReprWrapper.__eq__   s)    
 udnn-M$++2M	
r    c                    | j                   S r#   rA   )r   s    r   __repr__zReprWrapper.__repr__   s    {{r    N)rB   r8   r$   None)rF   objectr$   bool)r$   r8   )r%   r&   r'   r(   rC   rG   rI   r)   r    r   r?   r?   x   s    
r    r?   c                  (    e Zd ZdZ	 	 	 	 	 	 	 	 ddZy)r   a  
    Behaves like `structlog.processors.JSONRenderer` except that it formats
    tracebacks and failures itself if called with ``err()``.

    .. note::

        This ultimately means that the messages get logged out using ``msg()``,
        and *not* ``err()`` which renders failures in separate lines.

        Therefore it will break your tests that contain assertions using
        `flushLoggedErrors
        <https://docs.twisted.org/en/stable/api/
        twisted.trial.unittest.SynchronousTestCase.html#flushLoggedErrors>`_.

    *Not* an adapter like `EventAdapter` but a real formatter.  Also does *not*
    require to be adapted using it.

    Use together with a `JSONLogObserverWrapper`-wrapped Twisted logger like
    `plainJSONStdOutLogger` for pure-JSON logs.
    c                    t        |      \  }}}|dk(  r;||d<   t        |t              r+|j                  d      |d<   |j	                          n||d<   t        t        j                  | |||            fddifS )Nr"   r   verbose)detail	exception
_structlogT)r=   r5   r
   getTracebackcleanFailurer?   GenericJSONRendererr.   r   loggernamer<   r1   r2   s         r   r.   zJSONRenderer.__call__   s     #6i"@i5=!%Ig&'*)/)<)<I)<)N	+&##%!%Ig '00fdI 4 	
 		
r    N)rW   r   rX   r8   r<   r   r$   z$tuple[Sequence[Any], dict[str, Any]]r/   r)   r    r   r   r      s2    *

 
 	

 
.
r    r   c                       e Zd ZdZddZddZy)PlainFileLogObserverz
    Write only the plain message without timestamps or anything else.

    Great to just print JSON to stdout where you catch it with something like
    runit.

    Args:
        file: File to print to.

    .. versionadded:: 0.2.0
    c                H    |j                   | _        |j                  | _        y r#   )write_writeflush_flush)r   files     r   rC   zPlainFileLogObserver.__init__   s    jjjjr    c                ^    | j                  t        |      dz          | j                          y )N
)r]   r   r_   r   r<   s     r   r.   zPlainFileLogObserver.__call__   s)    i(	
 	r    N)r`   r   r$   rJ   )r<   r   r$   rJ   r%   r&   r'   r(   rC   r.   r)   r    r   rZ   rZ      s    
!r    rZ   c                       e Zd ZdZddZddZy)JSONLogObserverWrappera  
    Wrap a log *observer* and render non-`JSONRenderer` entries to JSON.

    Args:
        observer (ILogObserver):
            Twisted log observer to wrap.  For example
            :class:`PlainFileObserver` or Twisted's stock `FileLogObserver
            <https://docs.twisted.org/en/stable/api/
            twisted.python.log.FileLogObserver.html>`_

    .. versionadded:: 0.2.0
    c                    || _         y r#   )	_observer)r   observers     r   rC   zJSONLogObserverWrapper.__init__   s	    !r    c                    d|vr9t        j                  t        |      |j                  d      d      f|d<   d|d<   | j	                  |      S )NrR   system)r   rk   messageT)jsondumpsr   getrh   rc   s     r   r.   zJSONLogObserverWrapper.__call__   s[    y(

!2%" #,--"9		$Ii  '+Il#~~i((r    N)ri   r   r$   rJ   )r<   r   r$   r8   rd   r)   r    r   rf   rf      s    ")r    rf   c                 F    t        t        t        j                              S )a  
    Return a logger that writes only the message to stdout.

    Transforms non-`JSONRenderer` messages to JSON.

    Ideal for JSONifying log entries from Twisted plugins and libraries that
    are outside of your control::

        $ twistd -n --logger structlog.twisted.plainJSONStdOutLogger web
        {"event": "Log opened.", "system": "-"}
        {"event": "twistd 13.1.0 (python 2.7.3) starting up.", "system": "-"}
        {"event": "reactor class: twisted...EPollReactor.", "system": "-"}
        {"event": "Site starting on 8080", "system": "-"}
        {"event": "Starting factory <twisted.web.server.Site ...>", ...}
        ...

    Composes `PlainFileLogObserver` and `JSONLogObserverWrapper` to a usable
    logger.

    .. versionadded:: 0.2.0
    )rf   rZ   r9   stdoutr)   r    r   plainJSONStdOutLoggerrr     s    , ""6szz"BCCr    c                  :    e Zd ZdZ	 d	 	 	 ddZ	 	 	 	 	 	 	 	 ddZy)EventAdapterar  
    Adapt an ``event_dict`` to Twisted logging system.

    Particularly, make a wrapped `twisted.python.log.err
    <https://docs.twisted.org/en/stable/api/twisted.python.log.html#err>`_
    behave as expected.

    Args:
        dictRenderer:
            Renderer that is used for the actual log message. Please note that
            structlog comes with a dedicated `JSONRenderer`.

    **Must** be the last processor in the chain and requires a *dictRenderer*
    for the actual formatting as an constructor argument in order to be able to
    fully support the original behaviors of ``log.msg()`` and ``log.err()``.
    Nc                (    |xs	 t         d   | _        y )N)r   _dictRenderer)r   dictRenderers     r   rC   zEventAdapter.__init__.  s     *L-H-Lr    c                    |dk(  r,t        |      \  }}}||d<   d|| j                  |||      dfS | j                  |||      S )Nr"   r   r)   )r1   r2   )r=   rw   rV   s         r   r.   zEventAdapter.__call__6  sh     5=
 ':)&D#FD)!%Ig $ ..vtYG  !!&$	::r    r#   )rx   z5Callable[[WrappedLogger, str, EventDict], str] | Noner$   rJ   )rW   r   rX   r8   r<   r   r$   r   rd   r)   r    r   rt   rt     sN    * 	M BM
 
M;#;+.;;D;	;r    rt   )r<   r   r$   ztuple[Any, Any, EventDict])r$   rf   )&r(   
__future__r   rm   r9   typingr   r   r   r   twisted.pythonr	   twisted.python.failurer
   twisted.python.logr   r   zope.interfacer   _baser   _configr   
processorsr   rU   r   r   r   r+   r;   r6   r=   r?   rZ   rf   rr   rt   r)   r    r   <module>r      s    #  
 2 2  * > & " 0 ; ,9/ 98 * g&"#J <-
& -
` \  2 \) ) )DD2-; -;r    