U
    H$xe                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZeeZzd	e
  dZW n ek
rh   dZY nX dd ZG dd dZG dd	 d	eZdS )
    N   µuc               	   C   s   zjt d} |  }W 5 Q R X td|}|rhtt|ddddd}|dkrht	|t
 W S W n tk
r~   Y nX t
 S )	a3  
    Return the number of available virtual or physical CPUs on this system.
    The number of available CPUs can be smaller than the total number of CPUs
    when the cpuset(7) mechanism is in use, as is the case on some cluster
    systems.

    Adapted from http://stackoverflow.com/a/1006301/715090
    z/proc/self/statusz(?m)^Cpus_allowed:\s*(.*)$   ,    1r   )openreadresearchbinintgroupreplacecountminmultiprocessing	cpu_countOSError)fZstatusmres r   -lib/python3.8/site-packages/cutadapt/utils.pyavailable_cpu_count   s    	
"r   c                   @   sB   e Zd ZdZdddZdd Zeddd	ZdddZdd Z	dS )Progressz9
    Print an animated progress report to sys.stderr
    r   c                 C   s2   || _ |  | _d| _t | _| j| _d| _dS )zQ
        every: minimum time to wait in seconds between progress updates
        r   N)_everyscissors
_animation_ntime_start_time
_last_time_last_n)selfZeveryr   r   r   __init__.   s    

zProgress.__init__c                 C   s   d| j  d| j| j ddS )NzProgress(_n=z
, elapsed=z.3f))r    r#   r"   r%   r   r   r   __repr__:   s    zProgress.__repr__
   c                 c   s   dt | d fdt | d ffD ]n\}}|D ]`}dD ]V}d| }d| |  }|rh|rXdnd}|| }}n|rpd	nd
}d| | | d V  q4q,q q d S )NFr   T)TF -z>8z=8z8<z8=[])range)widthZ
is_reverseZrangZpositionZis_openleftrightZscr   r   r   r   ?   s    zProgress.scissorsFc                 C   s  |  j |7  _ t }|r,|| j }| j }n|| j }| j | j }|dk rNd S |dkrZd S |sl|| jk rld S || j }t|d }t||d  d }t|d }	|| }
|| }t| j}|rd	t
|}tdj|||	| j |d t|
d d |dd	tjd
 || _| j | _d S )Nr   r   i  <   ZDonez{animation} {hours:02d}:{minutes:02d}:{seconds:02d} {total:13,d} reads @ {per_item:5.1F} {micro}s/read; {per_minute:6.2F} M reads/minuteg    .A)hoursminutessecondsZtotalper_itemmicroZ
per_minute	animationr   )endfile)r    r!   r"   r#   r$   r   r   nextr   ljustlenprintformatMICROsysstderr)r%   	increment_finalZcurrent_timeZ
time_deltaZdeltatr4   r5   r6   Z
per_secondr7   r9   r   r   r   updateQ   sN    





zProgress.updatec                 C   s   | j ddd ttjd dS )zA
        Print final progress reflecting the final total
        r   T)rE   )r;   N)rG   r?   rB   rC   r(   r   r   r   close   s    zProgress.closeN)r   )r*   )F)
__name__
__module____qualname____doc__r&   r)   staticmethodr   rG   rH   r   r   r   r   r   )   s   

/r   c                   @   s"   e Zd ZdZdddZdd ZdS )	DummyProgressz!
    Does not print anything
    Fc                 C   s   d S Nr   )r%   rD   rE   r   r   r   rG      s    zDummyProgress.updatec                 C   s   d S rO   r   r(   r   r   r   rH      s    zDummyProgress.closeN)F)rI   rJ   rK   rL   rG   rH   r   r   r   r   rN      s   
rN   )r   rB   r!   r   ZloggingZlocaleZ	getLoggerrI   ZloggerencodegetpreferredencodingrA   UnicodeEncodeErrorr   r   rN   r   r   r   r   <module>   s   

_