B
    1zfZ                 @   s  U d Z ddlZddlZddl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mZ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mZmZ dd	lmZmZ dd
lm Z  dZ!dZ"dZ#da$da%ee& e'd< ej(G dd dZ)e) a*e)e'd< dddddddddddddddgZ+ee, e'd< dd Z-edddd Z.G d!d" d"Z/ee dd#d$d%Z0edd&d'd(Z1eddd)d*Z2e,e,d+d,d-Z3e,e&d.d/d0Z4d1a5ej6d2d3d4d5 Z7eeee,e,e,f  d6d7d8Z8G d9d: d:eZ9dS );z
pytest_sugar
~~~~~~~~~~~~

pytest-sugar is a plugin for pytest that changes the default look
and feel of pytest (e.g. progressbar, show tests that fail instantly).

:copyright: see LICENSE for details
:license: BSD, see LICENSE for more details.
    N)ConfigParser)AnyDictListOptionalSequenceTupleUnion)Parser)Session)Item)
BaseReportCollectReport
TestReport)TerminalReporterformat_session_duration)coloredz0.9.7   10LEN_PROGRESS_BARc               @   s^  e Zd ZU dZee ed< dZee ed< dZee ed< dZ	ee ed< d	Z
ee ed
< d	Zee ed< dZee ed< d	Zee ed< dZee ed< d	Zee ed< dZee ed< dZee ed< dZdZeed< dZeed< dZeed< dZeed< dZeed< dZeed < d!Zeed"< dZee ed#< d$Zee ed%< dZee ed&< d'd( ZdS ))Thememagentaheaderblueskippedgreensuccessyellowwarningredfailerrorxfailedxpassedprogressbarprogressbar_failZgreyprogressbar_backgroundcyanpathNu   ✓symbol_passedssymbol_skippedu   ⨯symbol_failedu   ₓsymbol_failed_not_callxsymbol_xfailed_skippedXsymbol_xfailed_failed?symbol_unknownunknownRsymbol_rerunrerunc             C   s
   t | |S )N)getattr)selfr.    r:   O/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/pytest_sugar.py__getitem__?   s    zTheme.__getitem__)__name__
__module____qualname__r   r   str__annotations__r   r   r   r    r!   r"   r#   r$   r%   r&   r(   namer)   r+   r,   r-   r/   r1   r3   r4   r6   r7   r<   r:   r:   r:   r;   r   %   s0   
r   THEME u   ▏u   ▎u   ▍u   ▌u   ▋u   ▊u   ▉u   █PROGRESS_BAR_BLOCKSc             c   s6   x0| D ](}t |ttfr(t|E d H  q|V  qW d S )N)
isinstancelisttupleflatten)seqr.   r:   r:   r;   rI   W   s    
rI   )sessionreturnc             C   s"   | j jd}|rt| j|_d S )Nterminalreporter)configpluginmanager	getpluginlenitemstests_count)rK   reporterr:   r:   r;   pytest_collection_finish_   s    rU   c               @   s   e Zd Zdd ZdS )DeferredXdistPluginc             C   s    |j jd}|rt||_d S )NrM   )rN   rO   rP   rQ   rS   )r9   nodeZidsterminal_reporterr:   r:   r;   %pytest_xdist_node_collection_finishedf   s    z9DeferredXdistPlugin.pytest_xdist_node_collection_finishedN)r=   r>   r?   rY   r:   r:   r:   r;   rV   e   s   rV   )rR   rL   c             C   sL   t | dkrH| d jj}|d}t|drH|jdkrH| jt | 8  _dS )z2Update tests_count to not include deselected testsr   rM   rS   N)rQ   rN   rO   rP   hasattrrS   )rR   rO   rX   r:   r:   r;   pytest_deselectedl   s    


r[   )parserrL   c             C   s<   | j dddd}|jddddd	d
 |jdddddd
 d S )Nzterminal reportingZ	reportingZgeneral)afterz--old-summary
store_true
tb_summaryFz5Show tests that failed instead of one-line tracebacks)actiondestdefaulthelpz--force-sugarforce_sugarz8Force pytest-sugar output even when not in real terminal)ZgetgroupZ
_addoption)r\   groupr:   r:   r;   pytest_addoptionx   s    rf   c             C   s   t  }|dtjdg i }tt}xH|D ]@}|j}|	d|sHq0|
d| }|}|dkrhd }|||< q0W |	ddr|
ddatf |ad S )Nzpytest-sugar.confz~/.pytest-sugar.conftheme) noneZsugarZprogressbar_length)r   readosr(   
expanduserdataclassesfieldsr   rB   
has_optiongetlowerLEN_PROGRESS_BAR_SETTINGrC   )rK   rN   Ztheme_attributesrn   fieldkeyZ	value_strvaluer:   r:   r;   pytest_sessionstart   s     

rv   )textrL   c             C   s   t d}|d| }|S )Nz
\x1b[^m]*mrh   )recompilesub)rw   Zansi_escapestrippedr:   r:   r;   strip_colors   s    
r|   )stringrL   c             C   s   t t| S )N)rQ   r|   )r}   r:   r:   r;   real_string_length   s    r~   FT)Ztrylastc             C   s   t j s| drda| jdrzydd l}W n tk
rD   Y n6X ddl	m
} ||j}||dkrz| jt  trt| dd s| jd}t|}| j| | j|d d S )	Nrd   Txdistr   )versionz1.14Z
slaveinputrM   )sysstdoutisattygetvalueIS_SUGAR_ENABLEDrO   Z	haspluginr   ImportError	packagingr   Version__version__registerrV   r8   rP   SugarTerminalReporter
unregister)rN   r   r   Zxdist_versionZstandard_reporterZsugar_reporterr:   r:   r;   pytest_configure   s     r   )reportrL   c             C   s   t sd S | jrttjtj}nl| jr4ttjtj}nV| jrbttj	tj
}| jdkrttjtj
}n(| jdkr|ttjtj}nttjtj}t| dr| jrdttjtjdfS | jrdttjtjdfS | j|| j fS )Ncallr7   wasxfailr"   Zxfailr#   ZXPASS)r   passedr   rC   r)   r   r   r+   failedr,   r    whenr-   outcomer6   r7   r3   r4   rZ   r/   r"   r1   r#   upper)r   letterr:   r:   r;   pytest_report_teststatus   s.    


r   c               @   st  e Zd Zdd Zdd ZeddddZedd	d
dZe	e
ddddZeeef ddddZe	eddddZedddZeeef e
ddddZeeef e
dddZddddZe	dddd Zeeef edd!d"Zeddd#d$Zd5e	eed&d'd(Zddd)d*Zee	dd+d,Zeedd-d.Zddd/d0Zddd1d2Zeeef ddd3d4Z dS )6r   c             C   s>   t | |j g | _d| _d| _g | _g | _g | _| 	  d S )Nr   )
r   __init__rN   
paths_leftrS   tests_takenreportsZunreported_errorsprogress_blocksreset_tracked_lines)r9   rT   r:   r:   r;   r      s    zSugarTerminalReporter.__init__c             C   s   i | _ i | _d| _d S )Nr   )current_linescurrent_line_numscurrent_line_num)r9   r:   r:   r;   r      s    z)SugarTerminalReporter.reset_tracked_linesN)r   rL   c             C   sT   t | | |jd r6| jtjt |jd  |j	rP| 
d | | d S )Nr   rh   )r   pytest_collectreportlocationr   appendrk   r(   joingetcwdr   Zrewriteprint_failure)r9   r   r:   r:   r;   r      s    
 
z*SugarTerminalReporter.pytest_collectreport)rK   rL   c             C   s   || _ t | _| jrd S dtttjd d }| j	dtj
|tjtf dd | jjj| j| jd}|  xt|D ]}| 	| qzW d S )N.   zITest session starts (platform: %s, Python %s, pytest %s, pytest-sugar %s)T)bold)rN   Zstartdir)_sessiontime_sessionstarttimeZ	no_headerr   mapr@   r   version_info
write_lineplatformpytestr   rN   hookZpytest_report_headerZ	startpathreverserI   )r9   rK   Zverinfolinesliner:   r:   r;   rv     s"    
z)SugarTerminalReporter.pytest_sessionstart)nodeidmarkuprL   c             K   s   d S )Nr:   )r9   r   resr   r:   r:   r;   write_fspath_result  s    z)SugarTerminalReporter.write_fspath_resultc       
         s    fdd}| }  |} j|d} j| j} jj}|t| t| t }|d|  }	|	|7 }	 	|	 j|  d S )Nc                 s  t } | sdS  jr"t j j nd}t||  }tt||  | ttd  }dt|d  }|dkrz j jk rzd}dd	  jD rt	|t
j}nt	|t
j}td
 | }|dkr|t| 7 }|dt t|  7 }d}d }t
j}|d krd }	nd| }	xj jD ]`\}
}|rt
j}nt
j}||
k rB|t	|||
 ||	7 }|t	||
 ||	7 }|
d }|}qW |t|k r|t	||t| ||	7 }|S )Nrh   r      z%i%% d   z100% z99% c             S   s   g | ]\}}|sd qS )r   r:   ).0blockr   r:   r:   r;   
<listcomp>1  s    zSSugarTerminalReporter.insert_progress.<locals>.get_progress_bar.<locals>.<listcomp>rD   Zon_)r   rS   floatr   introundrQ   rE   r   r   rC   r    r   r&   r$   r%   )lengthpZflooredremr$   barlastZ
last_themer&   Zon_colorr   r   rg   )r9   r:   r;   get_progress_bar"  sD     

z?SugarTerminalReporter.insert_progress.<locals>.get_progress_barrh   rD   )

report_keyr   rp   r   r   _tw	fullwidthr~   LEN_RIGHT_MARGIN	overwrite)
r9   r   r   Zappend_stringr(   current_lineline_numZconsole_width
num_spacesZ	full_liner:   )r9   r;   insert_progress!  s    4
z%SugarTerminalReporter.insert_progress)r   rel_line_numrL   c             C   s@   |dkr|  d|  |  d|  |dkr<|  d|  d S )Nr   z[%dAz[%dB)write)r9   r   r   r:   r:   r;   r   h  s
    zSugarTerminalReporter.overwrite)rL   c             C   s   t st| jjt t  t S )N)r   AssertionErrorr   r   LEN_PROGRESS_PERCENTAGEr   )r9   r:   r:   r;   get_max_column_for_test_statust  s    z4SugarTerminalReporter.get_max_column_for_test_status)r   print_filenamerL   c             C   s  |  |}|  jd7  _t|j|  d krPd|j|  d d  d   }n|j}tj|}|r| jr|j	d }|j	d }n$|dt|  }|t| d  }|rdt
|tj | jdkrdnd t
|tj d | j|< nddt|  | j|< | j| j|< | d	 d S )
Nr   r   z...r      rD   z::rh   z
)r   r   rQ   fspathr   rk   r(   basenameshowlongtestinfor   r   rC   	verbosityrB   r   r   r   )r9   r   r   r(   r   r   Ztest_locationZ	test_namer:   r:   r;   begin_new_line~  s$    
 
:z$SugarTerminalReporter.begin_new_linec             C   s    t | j| | }||  kS )N)r~   r   r   r   )r9   r   Zlen_liner:   r:   r;   #reached_last_column_for_test_status  s    z9SugarTerminalReporter.reached_last_column_for_test_statusc             C   s   d S )Nr:   )r9   r   r   r:   r:   r;   pytest_runtest_logstart  s    z-SugarTerminalReporter.pytest_runtest_logstart)r   rL   c             C   s   d S )Nr:   )r9   r   r:   r:   r;   pytest_runtest_logfinish  s    z.SugarTerminalReporter.pytest_runtest_logfinishc             C   s   | j r|jpdS |jpdS )z@Returns a key to identify which line the report should write to.rh   )r   r   r   )r9   r   r:   r:   r;   r     s    z SugarTerminalReporter.report_keyc             C   s  t |d}|st|\}}}| j|g | tsdtdr\| jj	t
td d  d ant
ta| j| |jdkrtd | | |jdkr|  jd7  _| | tjt |jd	 }|jd
ks|jr| |}|| jkr| j|dd n.| |r*| j| | | jk}| || | j| | | j|< t
| jr\t| jt | j nd	}|j r| j!r| j!d d	 |kr| j!|dg n*| j!r| j!d d	 |krd| j!d d< n,| j!r| j!d d	 |kr| j!|dg |s |s d S | j"d	krddi}	t#|t$r*|\}}	nF|j%r<ddi}	n4|jrNddi}	n"t&|drpt#|j't
rpddi}	| j(t)|j*f|j }
t&|dr| j+d |  jd7  _t&|dr| j+d|j,j-j. d | jj+|f|	 | j+d|
  d| _/d S )N)r   %r   r   r   rh   teardownr   r   r   T)r   Fr   r   r   r7   r   rW   z
[z] rD   )0r   r   stats
setdefaultr   r   rr   endswithr   r   r   r   r   printr   r   r   r   rk   r(   r   r   r   r   r   r   r   r   r   r   rS   r   r   r   r   rF   rH   r   rZ   r7   Z_locationliner@   r   r   rW   ZgatewayidZcurrentfspath)r9   r   r   catr   wordr(   r   r   r   r   r:   r:   r;   pytest_runtest_logreport  sp    











z.SugarTerminalReporter.pytest_runtest_logreportr   )rt   r   rL   c                s*   | j |}|r&t fdd|D S dS )Nc                s$   g | ]}t |d r|j kr|qS )r   )rZ   r   )r   r.   )r   r:   r;   r   
  s    z/SugarTerminalReporter.count.<locals>.<listcomp>r   )r   rp   rQ   )r9   rt   r   ru   r:   )r   r;   count  s    zSugarTerminalReporter.countc          
   C   sR  t   | j }tdt| d | ddkrL| td| d tj | ddkrv| td| d tj	 | jdd	d
dkrb| td| jdd	d
 tj
 x| jd D ]}|jdkrq| jjjr| |}nrtj|jd }tj|jd }| |}dt|tj|r"dndt|tj|r8|ndt|jd tj
}| d|  qW | jddd
dkr| td| jddd
 tj | ddkr| td| d tj | jddd
dkr| td| jddd
 tj | ddkr"| td| d tj | ddkrN| td| d tj d S )Nz

Results (z):r   r   z   % 5d passedr#   z   % 5d xpassedr   )r   )r   z   % 5d failedr   z{}{}{}:{} {}/rh   r2   r   z         - )setupr   z   % 5d errorr"   z   % 5d xfailedr   )r   r   r   z   % 5d skippedr7   z   % 5d rerunZ
deselectedz   % 5d deselected)r   r   r   r   r   r   r   rC   r   r#   r    r   r   rN   optionr_   _get_decoded_crashlinerk   r(   dirnamer   r   _get_lineno_from_reportformatrB   r!   r"   r   r7   r   )r9   Zsession_durationr   	crashliner(   rB   linenor:   r:   r;   summary_stats  s`    







z#SugarTerminalReporter.summary_statsc             C   sV   |  |}t|drRt }y||}W n& tk
rP   d}|j|dd}Y nX |S )Ndecodezutf-8replace)errors)_getcrashlinerZ   localegetpreferredencodingr   UnicodeDecodeError)r9   r   r   encodingr:   r:   r;   r   S  s    

z,SugarTerminalReporter._get_decoded_crashlinec             C   sj   y|j jd \}}|jS  tk
r*   Y nX y
|j jjS  tk
rd   |jd }|d k	r`|d7 }|S X d S )Nr   r   )ZlongreprZreprlocation_linesr   AttributeErrorZreprlocationr   )r9   r   r   r   r   r:   r:   r;   r   `  s    

z-SugarTerminalReporter._get_lineno_from_reportc             C   s   d S )Nr:   )r9   r:   r:   r;   summary_failuresr  s    z&SugarTerminalReporter.summary_failuresc             C   s   d S )Nr:   )r9   r:   r:   r;   summary_errorsw  s    z$SugarTerminalReporter.summary_errorsc             C   s   t |drd S | jjjdkr| jjjdkr@| |}| | nj| |}t|dd}|dkrhd| }n"|dkrzd| }n|d	krd
| }| d | d| | 	| | 
  d S )Nr   nor   r   ZcollectzERROR collecting r   zERROR at setup of r   zERROR at teardown of rh   u   ―)rZ   rN   r   Ztbstyler   r   Z_getfailureheadliner8   Z	write_sepZ_outrep_summaryr   )r9   r   r   msgr   r:   r:   r;   r   |  s$    






z#SugarTerminalReporter.print_failure)r   )!r=   r>   r?   r   r   r   r   r   rv   r@   boolr   r	   r   r   r   r   r   r   r   r   r   r   r   r   rH   r   r   r   r   r  r  r   r:   r:   r:   r;   r      s.   
G%
MFr   ):__doc__rm   r   rk   rx   r   r   configparserr   typingr   r   r   r   r   r   r	   r   Z_pytest.config.argparsingr
   Z_pytest.mainr   Z_pytest.nodesr   Z_pytest.reportsr   r   r   Z_pytest.terminalr   r   Z	termcolorr   r   r   r   rr   r   r   rA   	dataclassr   rC   rE   r@   rI   rU   rV   r[   rf   rv   r|   r~   r   Zhookimplr   r   r   r:   r:   r:   r;   <module>
   sb   $"