o
    +if6                     @   s   d Z ddlmZmZ ddlmZ ddlZddiZdddZdd
dZG dd dZ	G dd de	Z
G dd de
ZG dd dZG dd dee
ZG dd de
Z					dddZdS )zHImplements the generic progress logger class, and the ProgressBar class.    )tqdmtqdm_notebook)OrderedDictNnotebookFonc                 C   s   | dkrdndt d< d S )Nr   TFr   )SETTINGS)turn r	   B/var/www/html/venv/lib/python3.10/site-packages/proglog/proglog.pyr   
   s      c                 C   s    t | |k r| S | d | d S )Nz...)len)s
max_lengthr	   r	   r
   troncate_string   s    r   c                   @   sT   e Zd ZdZdddZdd ZdddZd	d
 Zdd Zdd Z	dd Z
dd ZdS )ProgressLoggerzGeneric class for progress loggers.

    A progress logger contains a "state" dictionary.

    Parameters
    ----------
    init_state : dict
        Dictionary representing the initial state.
    Nc                 C   s4   i | _ i | _g | _d| _|d ur| j | d S d S )Nr   )statestoredlogs
log_indentupdate)self
init_stater	   r	   r
   __init__   s   zProgressLogger.__init__c                 C   s   | j d| j |  d S )N )r   appendr   )r   messager	   r	   r
   log&   s   zProgressLogger.logc                 C   sV   |d ur%t |d}|d| j W d    d S 1 sw   Y  d S d| jS )Na
)openwritejoinr   )r   filepathfr	   r	   r
   	dump_logs)   s
   "zProgressLogger.dump_logsc                 K      dS )zExecute something after the state has been updated by the given
        state elements.

        This default callback does nothing, overwrite it by subclassing.
        Nr	   r   kwr	   r	   r
   callback0      zProgressLogger.callbackc                 K   s    | j | | jdi | dS )a  Store objects in the logger and trigger ``self.store_callback``.

        This works exactly like ``logger()``, but the later is meant for simple
        data objects (text, numbers) that will be sent over the network or
        written to a file. The ``store`` method expects rather large objects
        which are not necessarily serializable, and will be used eg to draw
        plots on the fly.
        Nr	   )r   r   store_callbackr&   r	   r	   r
   store8   s   	zProgressLogger.storec                 K   r%   )zExecute something after the store has been updated by the given
        state elements.

        This default callback does nothing, overwrite it by subclassing
        Nr	   r&   r	   r	   r
   r*   D   r)   zProgressLogger.store_callbackc                 k   s:    |  D ]\}}|D ]}| di ||i |V  qqdS )a  Iterate through a list while updating the state.

        Examples
        --------
        >>> for username in logger.iter(user=['tom', 'tim', 'lea']):
        >>>     # At every loop, logger.state['user'] is updated
        >>>     print(username)
        Nr	   )items)r   r'   fielditerableitr	   r	   r
   iterL   s   	zProgressLogger.iterc                 K   s    | j | | jdi | d S )Nr	   )r   r   r(   r&   r	   r	   r
   __call__Z   s   zProgressLogger.__call__N)__name__
__module____qualname____doc__r   r   r$   r(   r+   r*   r0   r1   r	   r	   r	   r
   r      s    

	
r   c                   @   sj   e Zd ZdZdZ						dddZedd	 Zd
d Zdd Z	dd Z
dddZdddZdd ZdS )ProgressBarLoggera  Generic class for progress loggers.

    A progress logger contains a "state" dictionary.

    Parameters
    ----------
    init_state : dict
        Initial state of the logger.
    bars : None, list, tuple, or dict, optional
        Either None (will be initialized with no bar) or a list/tuple of bar
        names (e.g., ['main', 'sub']) which will be initialized with index -1 and
        no total, or a dictionary (possibly ordered) of bars, of the form
        `{bar_1: {title: 'bar1', index: 2, total: 23}, bar_2: {...}}`.
    ignored_bars : None, list of str, or 'all_others', optional
        Either None (newly met bars will be added) or a list of blacklisted bar
        names, or 'all_others' to signify that all bar names not already in
        `self.bars` will be ignored.
    logged_bars
    min_time_interval : int or float
        Time in seconds between progress bar updates.
    ignore_bars_under : int
       Nallr   c                 C   sx   t | | |d u rt }nt|ttfrtdd |D }t|ttfr)t|}|| _|| _|| j	d< || _
|| _d S )Nc              
   S   s"   g | ]}|t |d ddddfqS )Nr   )titleindextotalr   indent)dict).0br	   r	   r
   
<listcomp>   s    z.ProgressBarLogger.__init__.<locals>.<listcomp>bars)r   r   r   
isinstancelisttuplesetignored_barslogged_barsr   min_time_intervalignore_bars_under)r   r   rC   rH   rI   rJ   rK   r	   r	   r
   r   y   s    	

zProgressBarLogger.__init__c                 C   s
   | j d S )zReturn ``self.state['bars'].``rC   )r   )r   r	   r	   r
   rC      s   
zProgressBarLogger.barsc                 C   s,   | j d u rdS | j dkr|| jvS || j v S )NF
all_others)rH   rC   r   barr	   r	   r
   bar_is_ignored   s
   



z ProgressBarLogger.bar_is_ignoredc                 C   s"   | j sdS | j dkrdS || j v S )NFr9   T)rI   rM   r	   r	   r
   bar_is_logged   s
   

zProgressBarLogger.bar_is_loggedc                 C   s(   t |dr	t|nd }|d uo|| jk S )N__len__)hasattrr   rK   )r   r.   lengthr	   r	   r
   iterable_is_too_short   s   z'ProgressBarLogger.iterable_is_too_short c                    s   d|v r
| dnd| \  srS |   tdr4di  d ti  fdd}| S )a  Iterate through a list while updating a state bar.

        Parameters
        ----------
        bar_prefix : str
            Bar prefix.

        Examples
        --------
        >>> for username in logger.iter_bar(user=['tom', 'tim', 'lea']):
        >>>     # At every loop, logger.state['bars']['user'] is updated
        >>>     # to {index: i, total: 3, title:'user'}
        >>>     print (username)

        bar_messageNrQ   __totalc                  3   s    t   } d}tD ]4\}}t   }|dks||  jkr<d ur/di  d |i di  d |i |} |V  qj  d |krTdi  d |i di  d |d i d S )Nr   	__message__indexr<      r	   )time	enumeraterJ   rC   )	last_timeir/   now_timerN   rV   r.   r   r	   r
   new_iterable   s   z0ProgressBarLogger.iter_bar.<locals>.new_iterabler	   )poppopitemrO   rT   rR   r   )r   
bar_prefixr'   ra   r	   r`   r
   iter_bar   s   
zProgressBarLogger.iter_barc                 C   r%   )a  Execute a custom action after the progress bars are updated.

        Parameters
        ----------
        bar
          Name/ID of the bar to be modified.

        attr
          Attribute of the bar attribute to be modified

        value
          New value of the attribute

        old_value
          Previous value of this bar's attribute.

        This default callback does nothing, overwrite it by subclassing.
        Nr	   )r   rN   attrvalue	old_valuer	   r	   r
   bars_callback   s   zProgressBarLogger.bars_callbackc           	      K   s&  t | dd d}|D ]v\}}d|v r|d\}}| |r!q|| || jvr6t|dd d d| j|< | j| | }| |rs|dkoI||k }|dksP|rY| j| j| d	< n| j| d	 | _| 	d
|||f  |  j| j
7  _|| j| |< | |||| q| j| | jdi | d S )Nc                 S   s   | d  d S )Nr   r=   )endswith)kvr	   r	   r
   <lambda>   s    z,ProgressBarLogger.__call__.<locals>.<lambda>)key__r:   )r;   r<   r=   r   r<   r=   r>   z[%s] %s: %sr	   )sortedr,   splitrO   rb   rC   r?   rP   r   r   
bar_indentri   r   r   r(   )	r   r'   r,   rm   rg   rN   rf   rh   new_barr	   r	   r
   r1      s,   



zProgressBarLogger.__call__)NNNr9   r   r   )rU   r2   )r3   r4   r5   r6   rq   r   propertyrC   rO   rP   rT   re   ri   r1   r	   r	   r	   r
   r7   _   s$    



.r7   c                   @   sL   e Zd ZdZ									ddd	Zd
d Zdd Zdd Zdd ZdS )TqdmProgressBarLoggera^  Tqdm-powered progress bar for console or Notebooks.

    Parameters
    ----------
    init_state : dict
        Initial state of the logger.
    bars : None, list, tuple, or dict, optional
        Either None (will be initialized with no bar) or a list/tuple of bar
        names (e.g., ['main', 'sub']) which will be initialized with index -1 and
        no total, or a dictionary (possibly ordered) of bars, of the form
        `{bar_1: {title: 'bar1', index: 2, total: 23}, bar_2: {...}}`.
    leave_bars : bool, optional
        Whether to leave the progress bars displayed upon completion.
    ignored_bars : None, list of str, or 'all_others', optional
        Either None (newly met bars will be added) or a list of blacklisted bar
        names, or 'all_others' to signify that all bar names not already in
        `self.bars` will be ignored.
    notebook : bool, optional
        True will make the bars look nice (HTML) in the Jupyter notebook. It is
        advised to leave to 'default' as the default can be globally set from
        inside a notebook with `import proglog; proglog.notebook_mode()`.
    print_messages : bool
        If True, every `logger(message='something')` will print a message in
        the console or notebook.
    min_time_interval : int or float
        Time in seconds between progress bar updates.
    ignore_bars_under : int
    NFr9   defaultTr   c
           
   	   C   sj   t j| |||||	|d || _tdd | jD | _|dkr"td }|| _|| _| jr0t	| _
d S t
| _
d S )N)r   rC   rH   rI   rK   rJ   c                 S   s   g | ]}|d fqS r2   r	   )r@   rN   r	   r	   r
   rB   @  s    z2TqdmProgressBarLogger.__init__.<locals>.<listcomp>ru   r   )r7   r   
leave_barsr   rC   	tqdm_barsr   r   print_messagesr   r   )
r   r   rC   rv   rH   rI   r   rx   rJ   rK   r	   r	   r
   r   *  s    	zTqdmProgressBarLogger.__init__c                 C   sd   || j v r| j | dur| | | j| }| j|d |d ttt|d d| jd| j |< dS )z:Create a new tqdm bar, possibly replacing an existing one.Nr=   r;   r   now)r=   descpostfixleave)rw   close_tqdm_barrC   r   r?   r   strrv   )r   rN   infosr	   r	   r
   new_tqdm_barG  s   

z"TqdmProgressBarLogger.new_tqdm_barc                 C   s&   | j |   | jsd| j |< dS dS )zClose and erase the tqdm bar.N)rw   closer   rM   r	   r	   r
   r~   S  s   z$TqdmProgressBarLogger.close_tqdm_barc                 C   s   || j vs| j | d u r| | |dkrJ||kr9| j| d }|r-||kr-| | d S | j | ||  d S | | | j | |d  d S |dkre| j | jtt|d | j | d d S d S )Nr<   r=   rZ   r   ry   r   )rw   r   rC   r~   r   set_postfixr   r   )r   rN   rf   rg   rh   r=   r	   r	   r
   ri   Y  s   

z#TqdmProgressBarLogger.bars_callbackc                 K   sL   | j r d|v r"|d r$| jrt|d  d S | j|d  d S d S d S d S )Nr   )rx   r   printr   r    r&   r	   r	   r
   r(   j  s
   zTqdmProgressBarLogger.callback)	NNFNr9   ru   Tr   r   )	r3   r4   r5   r6   r   r   r~   ri   r(   r	   r	   r	   r
   rt     s     
rt   c                   @   s   e Zd Zdd Zdd ZdS )RqWorkerProgressLoggerc                 C   s0   || _ d| j jvri | j jd< | j   d S d S Nprogress_data)jobmetasave)r   r   r	   r	   r
   r   s  s
   zRqWorkerProgressLogger.__init__c                 K   s   | j | jjd< | j  d S r   )r   r   r   r   r&   r	   r	   r
   r(   y  s   zRqWorkerProgressLogger.callbackN)r3   r4   r5   r   r(   r	   r	   r	   r
   r   r  s    r   c                   @   s    e Zd Z					dddZdS )RqWorkerBarLoggerNr	   r9   r   c                 C   s&   t | | tj| |||||d d S )N)r   rC   rH   rI   rJ   )r   r   r7   )r   r   r   rC   rH   rI   rJ   r	   r	   r
   r     s   	
zRqWorkerBarLogger.__init__)NNr	   r9   r   )r3   r4   r5   r   r	   r	   r	   r
   r   ~  s    r   c                   @   s   e Zd Zdd ZdS )MuteProgressBarLoggerc                 C   r%   )NTr	   rM   r	   r	   r
   rO     s   z$MuteProgressBarLogger.bar_is_ignoredN)r3   r4   r5   rO   r	   r	   r	   r
   r     s    r   r9   c                 C   s,   | dkrt |||||dS | d u rt S | S )NrN   )rC   rH   rI   rJ   rK   )rt   r   )loggerrC   rH   rI   rJ   rK   r	   r	   r
   default_bar_logger  s   r   )r   )r   )NNr9   r   r   )r6   r   r   collectionsr   r[   r   r   r   r   r7   rt   r   r   r   r   r	   r	   r	   r
   <module>   s(    

M .f