U
    42i                     @  s   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	 d dl
mZ d dlmZ dZd	d
dddZdd
dddZdd
dddZG dd dZdS )    )annotations)nodes)Cache)Config)Parser)Session)
TestReportzcache/stepwiser   None)parserreturnc                 C  s:   |  d}|jddddddd |jd	d
ddddd d S )NZgeneralz--swz
--stepwise
store_trueFstepwisezBExit on test failure and continue from last failing test next time)actiondefaultdesthelpz	--sw-skipz--stepwise-skipstepwise_skipz_Ignore the first failing test but stop on the next failing test. Implicitly enables --stepwise.)ZgetgroupZ	addoption)r
   group r   4/tmp/pip-unpacked-wheel-7n2p7kht/_pytest/stepwise.pypytest_addoption   s"    
r   r   configr   c                 C  s0   | j jrd| j _| dr,| jt| d d S )NTr   Zstepwiseplugin)optionr   r   	getoptionZpluginmanagerregisterStepwisePlugin)r   r   r   r   pytest_configure#   s    
r   r   sessionr   c                 C  s@   | j ds<| j jd k	stt| j dr,d S | j jtg  d S )Nr   workerinput)r   r   cacheAssertionErrorhasattrsetSTEPWISE_CACHE_DIRr   r   r   r   pytest_sessionfinish+   s
    r'   c                   @  sj   e Zd ZdddddZddddd	Zdd
ddddZdddddZddddZddddZdS )r   r   r	   r   c                 C  sH   || _ d | _d| _|jd k	s t|j| _| jtd | _|d| _	d S )N r   )
r   r   report_statusr!   r"   getr%   
lastfailedr   skip)selfr   r   r   r   __init__7   s    zStepwisePlugin.__init__r   r   c                 C  s
   || _ d S )Nr&   )r-   r   r   r   r   pytest_sessionstart@   s    z"StepwisePlugin.pytest_sessionstartzlist[nodes.Item])r   itemsr   c                 C  s   | j sd| _d S d }t|D ]\}}|j| j kr|} q:q|d krJd| _n2d| d| _|d | }|d |= |jj|d d S )Nz)no previously failed tests, not skipping.z/previously failed test not found, not skipping.z	skipping z already passed items.)r0   )r+   r)   	enumeratenodeidhookZpytest_deselected)r-   r   r0   Zfailed_indexindexitemZ
deselectedr   r   r   pytest_collection_modifyitemsC   s    
z,StepwisePlugin.pytest_collection_modifyitemsr   )reportr   c                 C  sf   |j rF| jr&|j| jkrd | _d| _qb|j| _| jd k	s<td| j_n|jdkrb|j| jkrbd | _d S )NFz0Test failed, continuing from this test next run.call)failedr,   r2   r+   r   r"   Z
shouldstopwhen)r-   r7   r   r   r   pytest_runtest_logreport[   s    
z'StepwisePlugin.pytest_runtest_logreportz
str | None)r   c                 C  s$   | j  dkr | jr d| j S d S )Nr   z
stepwise: )r   Zget_verbosityr)   r-   r   r   r   pytest_report_collectionfinishs   s    z-StepwisePlugin.pytest_report_collectionfinishc                 C  s$   t | jdrd S | jt| j d S )Nr    )r#   r   r!   r$   r%   r+   r<   r   r   r   r'   x   s    z#StepwisePlugin.pytest_sessionfinishN)	__name__
__module____qualname__r.   r/   r6   r;   r=   r'   r   r   r   r   r   6   s   	r   N)
__future__r   Z_pytestr   Z_pytest.cacheproviderr   Z_pytest.configr   Z_pytest.config.argparsingr   Z_pytest.mainr   Z_pytest.reportsr   r%   r   r   r'   r   r   r   r   r   <module>   s   