U
    ñadc0  ã                   @   sv   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlZi add„ Z	dd„ Z
G d	d
„ d
ejƒZG dd„ deƒZdS )é    )Úwith_statementN)Údatetime)Úqconfigc                   C   s0   t jt ¡ kr&tt j jjr&tt j S tt j S ©N)r   ZLOGGER_META_NAMEÚ_loggersÚkeysÚ_loggerÚhandlersZLOGGER_DEFAULT_NAME© r
   r
   ú-lib/python3.8/site-packages/quast_libs/log.pyÚget_main_logger   s    
r   c                 C   s,   | t  ¡ krt |  S t| ƒt | < t |  S d S r   )r   r   ÚQLogger)Únamer
   r
   r   Ú
get_logger   s    r   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚMetaQErrorFormatterNc                 C   s"   || _ || _|| _tj | ¡ d S r   )Ú_indent_valÚ	_ref_nameÚ
_log_fpathÚloggingÚ	FormatterÚ__init__)ÚselfÚ
indent_valÚref_nameZ	log_fpathr
   r
   r   r   !   s    zMetaQErrorFormatter.__init__c                 C   s6   |j r0| jd | j d |j  d | j d |_ |j S )Nú  ú: z(details are in ú))Úmsgr   r   r   )r   Úrecordr
   r
   r   Úformat(   s    *zMetaQErrorFormatter.format)NNN)Ú__name__Ú
__module__Ú__qualname__r   r   r
   r
   r
   r   r       s   
r   c                   @   s  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d„ Zd2dd„Zd3d	d
„Zdd„ Zd4dd„Zdd„ Zd5dd„Zd6dd„Zd7dd„Zd8dd„Zd9dd„Zd:dd„Zd;dd„Zd<dd „Zd=d!d"„Zd>d$d%„Zd?d&d'„Zd@d(d)„ZdAd*d+„Zd,d-„ Z dBd.d/„Z!d0d1„ Z"dS )Cr   NÚ r   Fc                 C   s$   || _ t |¡| _| j tj¡ d S r   )Ú_namer   Z	getLoggerr   ÚsetLevelÚDEBUG)r   r   r
   r
   r   r   :   s    zQLogger.__init__c                 C   s   d| _ || _|| _d S )NT)Ú_is_metaquastÚ_is_parallel_runr   )r   Zis_parallel_runr   r
   r
   r   Úset_up_metaquast?   s    zQLogger.set_up_metaquastc                 C   sž   || _ | jjD ]}t|tjƒr| j |¡ qt tj¡}| 	t 
|d d ¡¡ | |r^tjntj¡ | jrŽ| 	t|| j| jƒ¡ | tj¡ | j |¡ d S )Nr   z%(message)s)r   r   r	   Ú
isinstancer   ZStreamHandlerÚremoveHandlerÚsysÚstdoutZsetFormatterr   r%   r&   ÚINFOr(   r   r   r   ZERRORÚ
addHandler)r   r   ÚdebugÚhandlerZconsole_handlerr
   r
   r   Úset_up_console_handlerD   s    zQLogger.set_up_console_handlerc                 C   s   | j jD ]}| tj¡ qd S r   )r   r	   r%   r   r&   )r   r1   r
   r
   r   Úset_up_debug_levelS   s    zQLogger.set_up_debug_levelc                 C   sh   | j jD ]}t|tjƒr| j  |¡ qtj || j	d ¡| _
tj| j
dd}| tj¡ | j  |¡ d S )Nz.logÚw©Úmode)r   r	   r*   r   ÚFileHandlerr+   ÚosÚpathÚjoinr$   r   r%   r&   r/   )r   Zoutput_dirpathZ	err_fpathr1   Úfile_handlerr
   r
   r   Úset_up_file_handlerW   s    zQLogger.set_up_file_handlerc                 C   sf   | j dkr8| js8| j d¡ |  ¡  | j d¡ |  ¡  |  d¡| _| j d¡ | j d| j ¡ d S )Nr   r#   z	Started: zLogging to )	r   r'   r   ÚinfoÚprint_versionÚprint_system_infoÚprint_timestampÚ_start_timer   ©r   r
   r
   r   Ústarta   s    zQLogger.startc                 C   s  d}| j sì| j d| j ¡ tjr4| j dtj ¡ |  d¡}| j dt|| j	 ƒ ¡ |rl| j
d|d n|  
¡  | j d¡ |rì|d k	r˜|d	 dks¢| jdkr´| j d
¡ d}n8|d k	rÈ|d dksÒ| jdkrà| j d¡ n| j d¡ | jjD ]}| j |¡ qôt| j= |S )Nr   z  Log is saved to z  Errors are saved to z
Finished: zElapsed time: zTotal )ÚprefixÚnumbersz
Thank you for using QUAST!é   zJ
TEST FAILED! Please find non-fatal errors in the log and try to fix them.é   z
TEST PASSED with WARNINGS!z
TEST PASSED!)r'   r   r=   r   r   Z
save_errorÚerror_log_fpathr@   ÚstrrA   Úprint_numbers_of_notificationsÚ_num_nf_errorsÚ_num_warningsr	   r+   r   r$   )r   rE   Z
check_testZtest_resultZfinish_timer1   r
   r
   r   Ú	finish_upl   s,    
zQLogger.finish_upc                 C   s   | j  || ¡ d S r   )r   r0   ©r   ÚmessageÚindentr
   r
   r   r0   Š   s    zQLogger.debugc                 C   s,   t jr| j || ¡ n| j || ¡ d S r   )r   Zsilentr   r0   r=   rN   r
   r
   r   r=      s    zQLogger.infoc                 C   s   | j  || ¡ d S r   )r   r=   rN   r
   r
   r   Ú	main_info”   s    zQLogger.main_infoc              	   C   s€   t | jjƒD ]}t|tjƒr| j |¡ qt| jdƒ}| 	|| d ¡ W 5 Q R X tj| jdd}| 
tj¡ | j |¡ d S )NÚaÚ
r5   )Úlistr   r	   r*   r   r7   r+   Úopenr   Úwriter%   r&   r/   )r   rO   rP   r1   Úfr;   r
   r
   r   Úinfo_to_file—   s    zQLogger.info_to_filec                 C   s2   |  j d7  _ | j ||r&dt|ƒ nd ¡ d S )NrG   zNOTICE: r#   )Ú_num_noticesr   r=   rI   rN   r
   r
   r   Únotice¤   s    zQLogger.noticec                 C   s2   |  j d7  _ | j ||r&dt|ƒ nd ¡ d S )NrG   z	WARNING: r#   )rL   r   ÚwarningrI   rN   r
   r
   r   r[   ¨   s    zQLogger.warningc              	   C   sÊ   |r&| j dkr&|  d¡ |  |¡ d S |rH|d t|ƒ }|rL|d7 }nd}|sX| jjsjtj |d ¡ n| j 	d¡ | j 	|¡ t
jrªtt
jdƒ}| |¡ W 5 Q R X |r¸t|ƒ n|  jd7  _d S )Nr   r#   zERROR! zè

In case you have troubles running QUAST, you can write to quast.support@cab.spbu.ru
or report an issue on our GitHub repository https://github.com/ablab/quast/issues
Please provide us with quast.log file from the output directory.rS   rR   rG   )r   r=   rZ   rI   r   r	   r,   ÚstderrrV   Úerrorr   rH   rU   ÚexitrK   )r   rO   Zexit_with_codeÚ	to_stderrrP   Zfake_if_nested_runr   rW   r
   r
   r   r]   ¬   s&    



zQLogger.errorc                 C   sÈ   d}t |ƒtkr^dt|ƒkr^dt|ƒkr^tjr^tjdkr^tjdkr^tjjdkr^tjj	dkr^d}| j
jr| j
 d¡ | j
 |¡ |r¸| j
 |¡ n(tj t|ƒd	 ¡ |r¸tj |d	 ¡ |rÄt|ƒ d S )
Nr#   ZNoneTypeÚintrG   Zmacosxé   é   a/  

This seems to be a known bug when using multi-threading in Python 3.8+ on macOS!
The current workarounds are
  to switch to single-thread execution (-t 1)
or
  to downgrade your Python to 3.7 or below.
Sorry for the inconvenience!
Please find more details in https://github.com/ablab/quast/issues/175
rS   )ÚtypeÚ	TypeErrorrI   r   Úmax_threadsÚplatform_namer,   Úversion_infoÚmajorÚminorr   r	   r]   Ú	exceptionr=   r\   rV   r^   )r   ÚeZ	exit_codeZextra_messager
   r
   r   rj   Ê   s$    $
ÿ
ÿzQLogger.exceptionéP   c                 C   s¼   |r| j }n|r| j}n| j}d}|}t|ƒD ]€\}	}
d|
ksFd|
krVd|
 d ||	< ||
7 }|	t|ƒd krx||7 }q.|d k	r¦t|ƒ|kr¦||d 7 }dt|ƒ }q.|d7 }q.||ƒ d S )Nr#   ú ú	ú'rG   z \
)r0   rQ   r=   Ú	enumerateÚlen)r   ÚargsrP   Ú
wrap_afterÚonly_if_debugZis_mainÚoutÚtextÚlineÚiÚargr
   r
   r   Úprint_command_lineæ   s$    

zQLogger.print_command_linec           
      C   s&  | j  dt ¡  ¡ | j  d¡ d}|}dt ¡ fdtjfdtj fdtjfdtj	fd	tj
fd
tjfdtjfdtjfdtjfdtjfg}t|ƒD ]„\}\}}	|	dk	r||d t|	ƒ ¡  7 }|t|ƒd krÖ||7 }q|d k	rt|ƒ|kr||d 7 }dt|ƒ d }q|d7 }q| j  |¡ d S )NzCWD: zMain parameters: r   ZMODEZthreadsZ
eukaryoticzsplit scaffoldszmin contig lengthzmin alignment lengthzmin alignment IDYZ	ambiguityzuse all alignmentszmin local misassembly lengthz min extensive misassembly lengthFr   rG   z, \
rm   z, )r   r=   r8   Úgetcwdr   Zget_modere   Z
prokaryoteZsplit_scaffoldsZ
min_contigZmin_alignmentZmin_IDYZambiguity_usageZuse_all_alignmentsZlocal_misassembly_min_lengthZextensive_misassembly_thresholdrp   rI   Úlowerrq   )
r   rP   rs   rt   rv   rw   Zoptionsrx   ZoptionÚvaluer
   r
   r   Úprint_params  s4    
 
   ú

zQLogger.print_paramsc                 C   s.   t  ¡ }| d¡}|  d¡ |  || ¡ |S )Nz%Y-%m-%d %H:%M:%Sr#   )r   ÚnowÚstrftimerQ   )r   rO   r   Zcurrent_timer
   r
   r   r@   !  s
    

zQLogger.print_timestampc                 C   s4   |rt j dt ¡  d ¡ n|  dt ¡  ¡ d S )Nz	Version: rS   )r,   r\   rV   r   Zquast_versionr=   )r   r_   r
   r
   r   r>   (  s    zQLogger.print_versionc                 C   sº   | j  d¡ dd l}| j  d| ¡  dtj  ¡ | j  dttjd ƒ d ttjd ƒ d ttjd ƒ ¡ z$dd l}| j  d	t| 	¡ ƒ ¡ W n  t
k
r´   | j  d
¡ Y nX d S )NzSystem information:r   z  OS: z (%s)z  Python version: Ú.rG   rF   z  CPUs number: z7  Problem occurred when getting CPUs number information)r   r=   Úplatformr   rf   rI   r,   rg   ÚmultiprocessingÚ	cpu_countÚImportError)r   r‚   rƒ   r
   r
   r   r?   .  s    ,ÿzQLogger.print_system_infoc                 C   s,   |s| j | j| jf}| j |d|  ¡ d S )Nz/NOTICEs: %d; WARNINGs: %d; non-fatal ERRORs: %d)rY   rL   rK   r   r=   )r   rD   rE   r
   r
   r   rJ   :  s
    
ÿz&QLogger.print_numbers_of_notificationsc                 C   s   | j | j| jfS r   )rY   rL   rK   rB   r
   r
   r   Úget_numbers_of_notifications@  s    z$QLogger.get_numbers_of_notifications)FN)r   F)N)NF)r#   r#   )r#   r#   )r#   r#   )r#   r#   )r#   r#   )r#   r#   )r#   r   Fr#   F)r   )r#   rl   FF)r#   rl   F)r#   )F)r#   N)#r    r!   r"   r   r$   r   rA   r   rY   rL   rK   r'   r(   r   r)   r2   r3   r<   rC   rM   r0   r=   rQ   rX   rZ   r[   r]   rj   rz   r~   r@   r>   r?   rJ   r†   r
   r
   r
   r   r   .   sN   












      ÿ
    ÿ



r   )Z
__future__r   r8   r,   r   Z
quast_libsr   r   r   r   r   r   r   Úobjectr   r
   r
   r
   r   Ú<module>   s   