
    /i2                         d dl mZmZ d dlmZ d dlmZmZmZm	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 d	d
lmZ  G d de      Z G d dee      Z G d de      Z G d de      Z G d de      Zy)    )ABCabstractmethod)Enum)OptionalDictAnyListN)datetime)unquote)Console)Text   )create_box_messagec                   >    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZd Zy)LogLevelr   r                        	   
   c                 6    | j                   j                         S N)namelowerselfs    Q/mnt/e/genesis-system/.venv/lib/python3.12/site-packages/crawl4ai/async_logger.py__str__zLogLevel.__str__   s    yy      N)__name__
__module____qualname__DEFAULTDEBUGINFOSUCCESSWARNINGERRORCRITICALALERTNOTICE	EXCEPTIONFATALr"    r#   r!   r   r      s>    GEDGGEHEFIE!r#   r   c                   B    e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZd	 Zy
)LogColorzEnum for log colors.bright_blackcyangreenyellowredmagentazdim magentac                     | j                   S )z+Automatically convert rich color to string.)valuer   s    r!   r"   zLogColor.__str__,   s    zzr#   N)r$   r%   r&   __doc__r(   r)   r*   r+   r,   CYANGREENYELLOWMAGENTADIM_MAGENTAREDr"   r2   r#   r!   r4   r4      sA    EDGGEDEFGK
Cr#   r4   c                       e Zd Zeddedefd       Zeddedefd       Zeddedefd       Zeddedefd       Zeddedefd       Z	edded	e
d
ededef
d       Zeddedededefd       Zy)AsyncLoggerBasemessagetagc                      y r   r2   r    rF   rG   kwargss       r!   debugzAsyncLoggerBase.debug2       r#   c                      y r   r2   rI   s       r!   infozAsyncLoggerBase.info6   rL   r#   c                      y r   r2   rI   s       r!   successzAsyncLoggerBase.success:   rL   r#   c                      y r   r2   rI   s       r!   warningzAsyncLoggerBase.warning>   rL   r#   c                      y r   r2   rI   s       r!   errorzAsyncLoggerBase.errorB   rL   r#   urlrP   timing
url_lengthc                      y r   r2   )r    rU   rP   rV   rG   rW   s         r!   
url_statuszAsyncLoggerBase.url_statusF   rL   r#   rT   c                      y r   r2   )r    rU   rT   rG   rW   s        r!   error_statuszAsyncLoggerBase.error_statusJ   rL   r#   Nr(   r)   r*   r+   r,   FETCHd   r,   rc   )r$   r%   r&   r   strrK   rN   rP   rR   rT   boolfloatintrY   r[   r2   r#   r!   rE   rE   1   s   S s   C c   s    s    S s   c D % c ad    C c QT  r#   rE   c                   H   e Zd ZdZi dddddddd	d
ddddddddddddddddddddddd d!d"Zej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  iZd#ej                  d$d#d#d%fd&ee   d'ed(ed)eeeef      d*eeeef      d+efd,Zd-ed.efd/Zd-ed.efd0ZdJd1Zd2efd3Z	 	 	 	 dKd4ed2ed-ed5eeeef      d*eeeef      d6eee      d7ee   fd8ZdLd2ed-efd9ZdMd2ed-efd:ZdNd2ed-efd;ZdOd2ed-efd<ZdPd2ed-efd=ZdQd2ed-efd>ZdRd2ed-efd?Z dSd2ed-efd@Z!dTd2ed-efdAZ"dUd2ed-efdBZ#	 	 dVdCedDedEe$d-edFef
dGZ%	 dWdCedHed-edFefdIZ&y#)XAsyncLoggerz
    Asynchronous logger with support for colored console output and file logging.
    Supports templated messages with colored components.
    INITu   →READY   ✓rb   u   ↓SCRAPEu   ◆EXTRACTu   ■COMPLETEu   ●r,      ×r(   u   ⋯r)   u   ℹr+   u   ⚠r*   u   ✔r-   u   ‼r.   u   ⚡r/   r0   u   ❗r1   u   ☠r'   u   •Nr   Tlog_file	log_level	tag_widthiconscolorsverbosec                 V   || _         || _        || _        |xs | j                  | _        |xs | j
                  | _        || _        t               | _	        |rRt        j                  t        j                  j                  t        j                  j                  |            d       yy)ap  
        Initialize the logger.

        Args:
            log_file: Optional file path for logging
            log_level: Minimum log level to display
            tag_width: Width for tag formatting
            icons: Custom icons for different tags
            colors: Custom colors for different log levels
            verbose: Whether to output to console
        Texist_okN)rr   rs   rt   DEFAULT_ICONSru   DEFAULT_COLORSrv   rw   r   consoleosmakedirspathdirnameabspath)r    rr   rs   rt   ru   rv   rw   s          r!   __init__zAsyncLogger.__init__q   s    ( !""0d00
3 3 3y KK(ABTR r#   rG   returnc                 B    d| dj                  | j                  d      S )z#Format a tag with consistent width.[].)ljustrt   r    rG   s     r!   _format_tagzAsyncLogger._format_tag   s!    3%qz44r#   c                 T    | j                   j                  || j                   d         S )z=Get the icon for a tag, defaulting to info icon if not found.r)   )ru   getr   s     r!   	_get_iconzAsyncLogger._get_icon   s     zz~~c4::f#566r#   c                     t        |      |k  r|j                  |      S |t        |      z
  dz  }|d| |z   || d z   }|j                  |      S )zETruncate text in the middle if longer than length, or pad if shorter.r   N)lenr   )r    textlengthplaceholderhalf	shorteneds         r!   _shortenzAsyncLogger._shorten   s]    t9::f%%[))a/$K+-dUV<	v&&r#   rF   c                 6   | j                   rt        j                  |      }|j                  }t	        j
                         j                  d      dd }t        | j                   dd      5 }|j                  d| d| d	       ddd       yy# 1 sw Y   yxY w)
z.Write a message to the log file if configured.%Y-%m-%d %H:%M:%S.%fNautf-8encodingr   ] 
)	rr   r   from_markupplainr
   nowstrftimeopenwrite)r    rF   r   
plain_text	timestampfs         r!   _write_to_filezAsyncLogger._write_to_file   s    ==##G,DJ //0FGLIdmmS7; 9q!I;bB789 9	 9 9s   ,BBlevelparamsboxes
base_colorc                    |j                   | j                  j                   k  ry|j                  dd      j                  dd      }	|r |	j                  di |}
|j	                         D ]  \  }}t        |      j                  dd      j                  dd      }|r*||v r&d||    d| d||    d}|
j                  ||      }
|}|s`||v se|
j                  |t        |t        |                  }
 n|	}
|xs | j                  |   }d| d| j                  |       d| j                  |       d|
 d	| d}| j                  s|j                  d
d      r| j                  j                  |       | j                  |       y)a  
        Core logging method that handles message formatting and output.

        Args:
            level: Log level for this message
            message: Message template string
            tag: Tag for the message
            params: Parameters to format into the message
            colors: Color overrides for specific parameters
            boxes: Box overrides for specific parameters
            base_color: Base color for the entire message
        Nr   z[[r   z]]z[/)type z [/force_verboseFr2   )r<   rs   replaceformatitemsre   r   rv   r   r   rw   r   r}   printr   )r    r   rF   rG   r   rv   r   r   rJ   parsed_messageformatted_messagekeyr<   	value_str	color_strcolorlog_lines                    r!   _logzAsyncLogger._log   s   . ;;--- !d3;;CF
 !6 5 5 ? ?$lln H
UJ..sD9AA#tL	cVm"#F3K=)Bvc{m1 MI(9(A(A)Y(W% )I SE\(9(A(A)*93u:F)H%H !/ %:E(:ugQt//45Qt~~c7J6K1M^L__bchbiijk <<6::ou=LLx( 	H%r#   c                 J     | j                   t        j                  ||fi | y)zLog a debug message.N)r   r   r(   rI   s       r!   rK   zAsyncLogger.debug       		(..'39&9r#   c                 J     | j                   t        j                  ||fi | y)zLog an info message.Nr   r   r)   rI   s       r!   rN   zAsyncLogger.info       		(--#88r#   c                 J     | j                   t        j                  ||fi | y)zLog a success message.N)r   r   r*   rI   s       r!   rP   zAsyncLogger.success       		(""GS;F;r#   c                 J     | j                   t        j                  ||fi | y)zLog a warning message.N)r   r   r+   rI   s       r!   rR   zAsyncLogger.warning   r   r#   c                 J     | j                   t        j                  ||fi | y)zLog a critical message.Nr   r   r,   rI   s       r!   criticalzAsyncLogger.critical   r   r#   c                 J     | j                   t        j                  ||fi | y)zLog an exception message.Nr   rI   s       r!   	exceptionzAsyncLogger.exception   r   r#   c                 J     | j                   t        j                  ||fi | y)zLog a fatal message.Nr   rI   s       r!   fatalzAsyncLogger.fatal   r   r#   c                 J     | j                   t        j                  ||fi | y)zLog an alert message.Nr   rI   s       r!   alertzAsyncLogger.alert  r   r#   c                 J     | j                   t        j                  ||fi | y)zLog a notice message.Nr   rI   s       r!   noticezAsyncLogger.notice  r   r#   c                 J     | j                   t        j                  ||fi | y)zLog an error message.Nr   rI   s       r!   rT   zAsyncLogger.error  r   r#   rU   rP   rV   rW   c           	         t        |      }| j                  ||      }| j                  |rt        j                  nt        j
                  d|||rdnd|d|rt        j                  nt        j
                  t        j                  d       y)a@  
        Convenience method for logging URL fetch status.

        Args:
            url: The URL being processed
            success: Whether the operation was successful
            timing: Time taken for the operation
            tag: Tag for the message
            url_length: Maximum length for URL in log
        u%   {url} | {status} | ⏱: {timing:.2f}srm   u   ✗)rU   statusrV   )r   rV   )r   rF   rG   r   rv   N)r   r   r   r   r*   r,   r4   r+   )r    rU   rP   rV   rG   rW   decoded_urlreadable_urls           r!   rY   zAsyncLogger.url_status  sx    $ cl}}[*=		&-(""8>>;##*%  /6(**8>>"** 	 	
r#   rT   c                     t        |      }| j                  ||      }| j                  t        j                  d|||d       y)z
        Convenience method for logging error status.

        Args:
            url: The URL being processed
            error: Error message
            tag: Tag for the message
            url_length: Maximum length for URL in log
        z{url} | Error: {error})rU   rT   )r   rF   rG   r   N)r   r   r   r   r,   )r    rU   rT   rG   rW   r   r   s          r!   r[   zAsyncLogger.error_status/  sC     cl}}[*=		..,'%8	 	 	
r#   )z...)NNNNr\   r]   r^   r_   )r-   )r0   )r1   )r.   )r/   r`   ra   )r,   2   )'r$   r%   r&   r=   r{   r   r(   r4   r)   r*   r+   r,   r|   r   re   rh   r   rf   r   r   r   r   r   r   r	   r   rK   rN   rP   rR   r   r   r   r   r   rT   rg   rY   r[   r2   r#   r!   rj   rj   O   s   
 	 	%	
 	5 	E 	 	 	 	5 	5 	E 	 	% 	U  	!" 	5#M* 	x}}(**(**N #'&nn*.59S3-S S 	S
 S#X'S h012S S@5s 5s 57S 7S 7'9c 9 ,004%))-<&<& <& 	<&
 c3h(<& c8m,-<& S	"<& X&<&|:S :s :9C 9c 9<s < <<s < <: :# :: :3 ::S :s ::S :s :9c 9 9:S :s : !
!
 !
 	!

 !
 !
H KM

"
),
DG
r#   rj   c                       e Zd ZdZdefdZdededefdZddedefdZddedefd	Zddedefd
Z	ddedefdZ
ddedefdZddededededef
dZddedededefdZy)AsyncFileLoggerzM
    File-only asynchronous logger that writes logs to a specified file.
    rr   c                     || _         t        j                  t        j                  j	                  t        j                  j                  |            d       y)zh
        Initialize the file logger.

        Args:
            log_file: File path for logging
        Try   N)rr   r~   r   r   r   r   )r    rr   s     r!   r   zAsyncFileLogger.__init__I  s3     !
BGGOOBGGOOH$=>Nr#   r   rF   rG   c                     t        j                         j                  d      dd }t        | j                  dd      5 }|j                  d| d| d| d	| d
	       ddd       y# 1 sw Y   yxY w)z Write a message to the log file.r   Nr   r   r   r   r   z] [r   r   )r
   r   r   r   rr   r   )r    r   rF   rG   r   r   s         r!   r   zAsyncFileLogger._write_to_fileS  sr    LLN++,BCCRH	$--w7 	D1GGa	{#eWCuBwirBC	D 	D 	Ds   A''A0c                 *    | j                  d||       y)zLog a debug message to file.r(   Nr   rI   s       r!   rK   zAsyncFileLogger.debugY      GWc2r#   c                 *    | j                  d||       y)zLog an info message to file.r)   Nr   rI   s       r!   rN   zAsyncFileLogger.info]  s    FGS1r#   c                 *    | j                  d||       y)zLog a success message to file.r*   Nr   rI   s       r!   rP   zAsyncFileLogger.successa      Iw4r#   c                 *    | j                  d||       y)zLog a warning message to file.r+   Nr   rI   s       r!   rR   zAsyncFileLogger.warninge  r   r#   c                 *    | j                  d||       y)zLog an error message to file.r,   Nr   rI   s       r!   rT   zAsyncFileLogger.errori  r   r#   rU   rP   rV   rW   c                 T    |rdnd}|d|  d| d|dd}| j                  d||       y)	zLog URL fetch status to file.r*   FAILEDNz... | Status: z	 | Time: z.2fs
URL_STATUSr   )r    rU   rP   rV   rG   rW   r   rF   s           r!   rY   zAsyncFileLogger.url_statusm  s@    %8*%&nVHIfS\QRSL'37r#   rT   c                 >    |d|  d| }| j                  d||       y)zLog error status to file.Nz... | Error: r,   r   )r    rU   rT   rG   rW   rF   s         r!   r[   zAsyncFileLogger.error_statuss  s,    *%&mE7;GWc2r#   Nr\   r]   r^   r_   r`   ra   rd   )r$   r%   r&   r=   re   r   r   rK   rN   rP   rR   rT   rf   rg   rh   rY   r[   r2   r#   r!   r   r   D  s    O ODC D# DC D3S 3s 32C 2c 25s 5 55s 5 53S 3s 38c 8D 8% 8c 8ad 83 3C 3c 3QT 3r#   r   )abcr   r   enumr   typingr   r   r   r	   r~   r
   urllib.parser   rich.consoler   	rich.textr   utilsr   r   re   r4   rE   rj   r   r2   r#   r!   <module>r      sd    #  , , 	       %!t !"sD (c <s
/ s
j23o 23r#   