o
    h_$                     @  s   U d Z ddlmZ ddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZmZmZmZ ddlmZ i Zded	< dddZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZdS )z(
Logger classes responsible for output.
    )annotationsN)PicklingError)stderrstdout)IOAnyBinaryIOTextIO)until_not_interruptedzdict[IO[Any], threading.Lock]WRITE_LOCKSfileIO[Any]returnthreading.Lockc                 C  s&   t | }|d u rt }|t | < |S N)r   get	threadingLock)r   lock r   G/var/www/html/ai/venv/lib/python3.10/site-packages/structlog/_output.py_get_lock_for_file   s
   
r   c                   @  z   e Zd ZdZddddZdd	d
ZdddZdddZdddZdddZ	e	 Z
 Z Z ZZe	 Z Z Z Z ZZdS )PrintLoggera  
    Print events into a file.

    Arguments:

        file: File to print to. (default: `sys.stdout`)

    >>> from structlog import PrintLogger
    >>> PrintLogger().info("hello")
    hello

    Useful if you follow `current logging best practices
    <logging-best-practices>`.

    Also very useful for testing and examples since `logging` is finicky in
    doctests.

    .. versionchanged:: 22.1.0
       The implementation has been switched to use `print` for better
       monkeypatchability.
    Nr   TextIO | Nonec                 C  s   |pt | _t| j| _d S r   )r   _filer   _lockselfr   r   r   r   __init__:   s   
zPrintLogger.__init__r   strc                 C  $   | j tu rdS | j tu rdS td)=
        Our __getattr__ magic makes this necessary.
        r   r   z>Only PrintLoggers to sys.stdout and sys.stderr can be pickled.r   r   r   r   r   r   r   r   __getstate__?      

zPrintLogger.__getstate__stater   Nonec                 C  &   |dkrt | _nt| _t| j| _dS r"   r   Nr   r   r   r   r   r   r'   r   r   r   __setstate__M      zPrintLogger.__setstate__memodictdict[str, object]c                 C  s4   | j ttfvrtd| | j }t|j |_|S )zY
        Create a new PrintLogger with the same attributes. Similar to pickling.
        zAOnly PrintLoggers to sys.stdout and sys.stderr can be deepcopied.)r   r   r   copyerror	__class__r   r   r   r/   newselfr   r   r   __deepcopy__X   s   zPrintLogger.__deepcopy__c                 C     d| j dS )Nz<PrintLogger(file=)>r   r$   r   r   r   __repr__h      zPrintLogger.__repr__messagec                 C  sP   | j tur| j nd}| j tt||dd W d   dS 1 s!w   Y  dS )z"
        Print *message*.
        NT)r   flush)r   r   r   r
   print)r   r<   fr   r   r   msgk   s   "zPrintLogger.msgr   r   r   r   r    r'   r   r   r(   )r/   r0   r   r   r<   r    r   r(   __name__
__module____qualname____doc__r   r%   r-   r6   r:   r@   logdebuginfowarnwarningfatalfailureerrr2   critical	exceptionr   r   r   r   r   #   s    




r   c                   @  &   e Zd ZdZddddZdddZdS )PrintLoggerFactoryz
    Produce `PrintLogger`\ s.

    To be used with `structlog.configure`\ 's ``logger_factory``.

    Arguments:

        file: File to print to. (default: `sys.stdout`)

    Positional arguments are silently ignored.

    .. versionadded:: 0.4.0
    Nr   r   c                 C  
   || _ d S r   r9   r   r   r   r   r         
zPrintLoggerFactory.__init__argsr   r   r   c                 G  
   t | jS r   )r   r   r   rX   r   r   r   __call__   rW   zPrintLoggerFactory.__call__r   rA   )rX   r   r   r   rF   rG   rH   rI   r   r[   r   r   r   r   rU   w       rU   c                   @  r   )WriteLoggera  
    Write events into a file.

    Arguments:

        file: File to print to. (default: `sys.stdout`)

    >>> from structlog import WriteLogger
    >>> WriteLogger().info("hello")
    hello

    Useful if you follow
    `current logging best practices <logging-best-practices>`.

    Also very useful for testing and examples since `logging` is finicky in
    doctests.

    A little faster and a little less versatile than `structlog.PrintLogger`.

    .. versionadded:: 22.1.0
    Nr   r   c                 C  s0   |pt j| _| jj| _| jj| _t| j| _d S r   )	sysr   r   write_writer=   _flushr   r   r   r   r   r   r      s   

zWriteLogger.__init__r   r    c                 C  r!   )r"   r   r   z>Only WriteLoggers to sys.stdout and sys.stderr can be pickled.r#   r$   r   r   r   r%      r&   zWriteLogger.__getstate__r'   r   r(   c                 C  r)   r*   r+   r,   r   r   r   r-      r.   zWriteLogger.__setstate__r/   r0   c                 C  sL   | j tjtjfvrtd| | j }|j j|_|j j	|_
t|j |_|S )zY
        Create a new WriteLogger with the same attributes. Similar to pickling.
        zAOnly WriteLoggers to sys.stdout and sys.stderr can be deepcopied.)r   r_   r   r   r1   r2   r3   r`   ra   r=   rb   r   r   r4   r   r   r   r6      s   

zWriteLogger.__deepcopy__c                 C  r7   )Nz<WriteLogger(file=r8   r9   r$   r   r   r   r:      r;   zWriteLogger.__repr__r<   c                 C  F   | j  t| j|d  t| j W d   dS 1 sw   Y  dS )z,
        Write and flush *message*.
        
Nr   r
   ra   rb   r   r<   r   r   r   r@         "zWriteLogger.msgr   rA   rB   rC   )r/   r0   r   r^   rD   rE   r   r   r   r   r^      s    




r^   c                   @  rT   )WriteLoggerFactoryz
    Produce `WriteLogger`\ s.

    To be used with `structlog.configure`\ 's ``logger_factory``.

    Arguments:

        file: File to print to. (default: `sys.stdout`)

    Positional arguments are silently ignored.

    .. versionadded:: 22.1.0
    Nr   r   c                 C  rV   r   r9   r   r   r   r   r      rW   zWriteLoggerFactory.__init__rX   r   r   r^   c                 G  rY   r   )r^   r   rZ   r   r   r   r[      rW   zWriteLoggerFactory.__call__r   rA   )rX   r   r   r^   r\   r   r   r   r   rh      r]   rh   c                   @  s~   e Zd ZdZdZddddZdd
dZdddZdddZdddZ	d ddZ
e
 Z Z Z ZZe
 Z Z Z Z ZZdS )!BytesLoggeraQ  
    Writes bytes into a file.

    Arguments:
        file: File to print to. (default: `sys.stdout`\ ``.buffer``)

    Useful if you follow `current logging best practices
    <logging-best-practices>` together with a formatter that returns bytes
    (e.g. `orjson <https://github.com/ijl/orjson>`_).

    .. versionadded:: 20.2.0
    )r   ra   rb   r   Nr   BinaryIO | Nonec                 C  s2   |pt jj| _| jj| _| jj| _t| j| _	d S r   )
r_   r   bufferr   r`   ra   r=   rb   r   r   r   r   r   r   r   
  s   

zBytesLogger.__init__r   r    c                 C  s,   | j tjju r	dS | j tjju rdS td)r"   r   r   z>Only BytesLoggers to sys.stdout and sys.stderr can be pickled.)r   r_   r   rk   r   r   r$   r   r   r   r%     s   zBytesLogger.__getstate__r'   r   r(   c                 C  sB   |dkr
t jj| _nt jj| _| jj| _| jj| _t	| j| _
dS r*   )r_   r   rk   r   r   r`   ra   r=   rb   r   r   r,   r   r   r   r-     s   


zBytesLogger.__setstate__r/   r0   c                 C  sP   | j tjjtjjfvrtd| | j }|j j|_	|j j
|_t|j |_|S )zY
        Create a new BytesLogger with the same attributes. Similar to pickling.
        zAOnly BytesLoggers to sys.stdout and sys.stderr can be deepcopied.)r   r_   r   rk   r   r1   r2   r3   r`   ra   r=   rb   r   r   r4   r   r   r   r6   ,  s   

zBytesLogger.__deepcopy__c                 C  r7   )Nz<BytesLogger(file=r8   r9   r$   r   r   r   r:   >  r;   zBytesLogger.__repr__r<   bytesc                 C  rc   )z"
        Write *message*.
           
Nre   rf   r   r   r   r@   A  rg   zBytesLogger.msgr   r   rj   rB   rC   )r/   r0   r   ri   )r<   rl   r   r(   )rF   rG   rH   rI   	__slots__r   r%   r-   r6   r:   r@   rJ   rK   rL   rM   rN   rO   rP   rQ   r2   rR   rS   r   r   r   r   ri      s    




ri   c                   @  s*   e Zd ZdZdZddddZdddZdS )BytesLoggerFactorya
  
    Produce `BytesLogger`\ s.

    To be used with `structlog.configure`\ 's ``logger_factory``.

    Arguments:

        file: File to print to. (default: `sys.stdout`\ ``.buffer``)

    Positional arguments are silently ignored.

    .. versionadded:: 20.2.0
    r9   Nr   rj   c                 C  rV   r   r9   r   r   r   r   r   ]  rW   zBytesLoggerFactory.__init__rX   r   r   ri   c                 G  rY   r   )ri   r   rZ   r   r   r   r[   `  rW   zBytesLoggerFactory.__call__r   rn   )rX   r   r   ri   )rF   rG   rH   rI   ro   r   r[   r   r   r   r   rp   M  s
    rp   )r   r   r   r   )rI   
__future__r   r1   r_   r   pickler   r   r   typingr   r   r   r	   structlog._utilsr
   r   __annotations__r   r   rU   r^   rh   ri   rp   r   r   r   r   <module>   s"   
	TXR