o
    h	                     @  s   d dl 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 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 erNd dlmZ dZd!ddZd"ddZd#ddZejG dd dZG dd  d ZdS )$    )annotationsN)datetime)	timedelta)Any)TYPE_CHECKING)nodes)Cache)Config)Parser)Session)
TestReport)Selfzcache/stepwiseparserr
   returnNonec                 C  sP   |  d}|jddddddd |jd	d
ddddd |jddddddd d S )N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
--sw-resetz--stepwise-resetstepwise_resetzWResets stepwise state, restarting the stepwise workflow. Implicitly enables --stepwise.)getgroup	addoption)r   group r   Q/var/www/html/openai_agents/venv/lib/python3.10/site-packages/_pytest/stepwise.pypytest_addoption   s2   
	
r   configr	   c                 C  s<   | j js| j jrd| j _| dr| jt| d d S d S )NTr   stepwiseplugin)optionr   r   r   	getoptionpluginmanagerregisterStepwisePlugin)r    r   r   r   pytest_configure5   s
   
r'   sessionr   c                 C  s4   | j ds| j jd usJ t| j drd S d S d S )Nr   workerinput)r    r#   cachehasattrr(   r   r   r   pytest_sessionfinish=   s   r-   c                   @  sL   e Zd ZU ded< ded< ded< edd	d
ZedddZdddZdS )StepwiseCacheInfoz
str | Nonelast_failedz
int | Nonelast_test_countstrlast_cache_date_strr   r   c                 C  s   t | jS N)r   fromisoformatr2   selfr   r   r   last_cache_dateS   s   z!StepwiseCacheInfo.last_cache_dater   c                 C  s   | d d t   dS )N)r/   r0   r2   )r   now	isoformat)clsr   r   r   emptyW   s
   
zStepwiseCacheInfo.emptyr   c                 C  s   t   | _d S r3   )r   r8   r9   r2   r5   r   r   r   update_date_to_now_   s   z$StepwiseCacheInfo.update_date_to_nowN)r   r   )r   r   r   r   )	__name__
__module____qualname____annotations__propertyr7   classmethodr;   r<   r   r   r   r   r.   F   s   
 r.   c                   @  sR   e Z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	dS )#r&   r    r	   r   r   c                 C  sN   || _ d | _g | _|jd usJ |j| _|d| _|d| _|  | _d S )Nr   r   )	r    r(   report_statusr*   r#   skipreset_load_cached_infocached_info)r6   r    r   r   r   __init__d   s   zStepwisePlugin.__init__r.   c              
   C  s   | j td }|rBzt|d |d |d W S  ttfyA } zt|j d| }| j	d| d W Y d }~t
 S d }~ww t
 S )Nr/   r0   r2   z: z!error reading cache, discarding ())r*   getSTEPWISE_CACHE_DIRr.   KeyError	TypeErrortyper>   rD   appendr;   )r6   cached_dicteerrorr   r   r   rG   n   s   z StepwisePlugin._load_cached_infor(   r   c                 C  s
   || _ d S r3   r,   )r6   r(   r   r   r   pytest_sessionstart~   s   
z"StepwisePlugin.pytest_sessionstartitemslist[nodes.Item]c           	      C  s0  | j j}t|| j _| jr| jd d | j _d S | j js%| jd d S |d urD|t|krD| jdt| d| d d | j _d S d }t|D ]\}}|j| j jkrY|} nqJ|d u rf| jd d S t	
 | j j }tt| d}| jd| d	| d
 |d | }|d |= |jj|d d S )Nzresetting state, not skipping.z)no previously failed tests, not skipping.z&test count changed, not skipping (now z tests, previously z).z/previously failed test not found, not skipping.)secondsz	skipping z" already passed items (cache from z! ago, use --sw-reset to discard).)rU   )rH   r0   lenrF   rD   rP   r/   	enumeratenodeidr   r8   r7   r   inttotal_secondshookpytest_deselected)	r6   r    rU   r0   failed_indexindexitem	cache_age
deselectedr   r   r   pytest_collection_modifyitems   s>   
z,StepwisePlugin.pytest_collection_modifyitemsreportr   c                 C  s|   |j r(| jr|j| jjkrd | j_d| _d S |j| j_| jd us"J d| j_d S |jdkr:|j| jjkr<d | j_d S d S d S )NFz0Test failed, continuing from this test next run.call)failedrE   rZ   rH   r/   r(   
shouldstopwhen)r6   re   r   r   r   pytest_runtest_logreport   s   



z'StepwisePlugin.pytest_runtest_logreportlist[str] | Nonec                 C  s(   | j  dkr| jrdd | jD S d S )Nr   c                 S  s   g | ]}d | qS )z
stepwise: r   ).0xr   r   r   
<listcomp>   s    zAStepwisePlugin.pytest_report_collectionfinish.<locals>.<listcomp>)r    get_verbosityrD   r5   r   r   r   pytest_report_collectionfinish   s   z-StepwisePlugin.pytest_report_collectionfinishc                 C  s4   t | jdrd S | j  | jtt| j d S )Nr)   )	r+   r    rH   r<   r*   setrL   dataclassesasdictr5   r   r   r   r-      s   
z#StepwisePlugin.pytest_sessionfinishNr    r	   r   r   )r   r.   r(   r   r   r   )r    r	   rU   rV   r   r   )re   r   r   r   )r   rk   r=   )
r>   r?   r@   rI   rG   rT   rd   rj   rp   r-   r   r   r   r   r&   c   s    





-
r&   )r   r
   r   r   rt   ru   )
__future__r   rr   r   r   typingr   r   _pytestr   _pytest.cacheproviderr   _pytest.configr	   _pytest.config.argparsingr
   _pytest.mainr   _pytest.reportsr   typing_extensionsr   rL   r   r'   r-   	dataclassr.   r&   r   r   r   r   <module>   s*    


	