o
    E6dm                     @  s  d dl mZ d dlZd dlZd dlm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Zd dlZzesAd dlZW n eyQ   ddlmZ Y nw dd Zd:ddZdaejdddd Zdd Zdd Zdd Zdd ZG dd dZdd Zdd Zd d! Z d;d"d#Z!d$d% Z"da#d&d' Z$ej%dd(d)d* Z&d+d, Z'da(d-d. Z)ejd/d0d1d2 Z*ejd3d0d4d5 Z+d6d7 Z,G d8d9 d9ej-Z.dS )<    )annotationsN)update_wrapper)TYPE_CHECKING   )plugin_basec                   s$   |  d  fdd}t| d S )N
sqlalchemyc                   sr   | dd   rG  fdddtj}||d< | dd r.G fdddtj}||d< j| fi | d S )Ncallbackc                      s   e Zd Z	d fdd	ZdS )=pytest_addoption.<locals>.make_option.<locals>.CallableActionNc                       ||| d S N selfparser	namespacevaluesZoption_string	callback_r   }C:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\sqlalchemy/testing/plugin/pytestplugin.py__call__$      Fpytest_addoption.<locals>.make_option.<locals>.CallableAction.__call__r   )__name__
__module____qualname__r   r   r   r   r   CallableAction#   s    r   actionzeroarg_callbackc                      s4   e Zd Z			d fdd	Z	dfdd	Z  ZS )	r	   FNc              	     s   t  j||dd|||d d S )Nr   T)option_stringsdestnargsconstdefaultrequiredhelp)super__init__)r   r   r   r"   r#   r$   	__class__r   r   r&   /   s   
zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__init__c                   r
   r   r   r   r   r   r   r   A   r   r   )FFNr   )r   r   r   r&   r   __classcell__r   r)   r'   r   r   .   s    )popargparseZActionZ	addoption)namekwr   group)r   r   r   make_option   s   z%pytest_addoption.<locals>.make_option)Zgetgroupr   Zsetup_options)r   r1   r   r/   r   pytest_addoption   s   
+r2   configpytest.Configc                 C  s
  t | j t jst jr0dtt jdd t jD  }| jjr,| j jd| 7  _n|| j_| j	
dr=| j	t  t| drQt | j t | jd  n| jjrdtj| jjrdt| jj t | j t tt| jdd t t | jjrd	ad S d S )
Nz and c                 S  s   g | ]}d | qS )znot r   ).0tagr   r   r   
<listcomp>R   s    z$pytest_configure.<locals>.<listcomp>Zxdistworkerinputfollower_identZ
cov_sourceFT)r   Zread_configZrootpathexclude_tagsZinclude_tagsjoinlistoptionZmarkexprpluginmanagerZ	haspluginregister
XDistHookshasattrZ!restore_important_follower_configr8   Zconfigure_followerZwrite_identsospathexistsremoveZ	pre_beginZset_coverage_flagboolgetattrZset_fixture_functionsPytestFixtureFunctionsdump_pyannotateDUMP_PYANNOTATE)r3   Znew_exprr   r   r   pytest_configureM   s6   

rK   FT)Zautousec                  c  s4    t rddlm}  |   d V  t r|   d S d S )Nr   collect_types)rJ   pyannotate_runtimerM   startstoprL   r   r   r   collect_types_fixturev   s   rQ   c                 C  s   dd l }ddl m} ddlm} ddlm} d}tjjrdnd}d| d	| d
d|j	 g}| rCddl
m} |d|j	 d n|d|  | jjd}	|	rf|	d| |D ]}
|	|
 q\d S td|d |D ]}
t|
 qnd S )Nr   )__version__)has_compiled_ext)_CYEXTENSION_MSGzsqlalchemy installationzno user sitezuser site loadedzSQLAlchemy z ()zPath: )utilz!compiled extension enabled, e.g.  z compiled extension not enabled; Zterminalreporter=z=========================)r   rR   Zsqlalchemy.utilrS   Zsqlalchemy.util._has_cyrT   sysflagsno_user_site__file__Zsqlalchemy.cyextensionrV   appendr3   r>   Z
get_pluginZ	write_sepZ
write_lineprint)sessionr   rR   rS   rT   ZgreetsiteZmsgsrV   Zpmmr   r   r   _log_sqlalchemy_info   s.   

rb   c                 C  s$   ddl m} t|  |tj d S Nr   asyncio)sqlalchemy.testingre   rb   Z_assume_asyncr   Z
post_begin)r_   re   r   r   r   pytest_sessionstart   s   rg   c                 C  sF   ddl m} |tj | jjjr!ddlm	} |
| jjj d S d S )Nr   rd   rL   )rf   re   _maybe_async_provisioningr   Zfinal_process_cleanupr3   r=   rI   rN   rM   Z
dump_stats)r_   re   rM   r   r   r   pytest_sessionfinish   s   
ri   c                   sB   | j jjrddlm} tjd  fdd}|j|d d S d S )Nr   rL   lib/sqlalchemyc                   s<   t jt j| } dt j|  gvrd S d| v rd S | S )Nrj   testing)rB   rC   normpathabspath
commonpath)filenameZlib_sqlalchemyr   r   _filter   s   z)pytest_collection_finish.<locals>._filter)Zfilter_filename)	r3   r=   rI   rN   rM   rB   rC   rm   Zinit_types_collection)r_   rM   rq   r   rp   r   pytest_collection_finish   s   
rr   c                   @  s   e Zd Zdd Zdd ZdS )r@   c                 C  sX   ddl m} ddl m} t|j dt jdd  |jd< |	|j
|jd  d S )Nr   	provisionrd   ztest_%s   r9   )rf   rt   re   r   Z!memoize_important_follower_configr8   uuiduuid4hexrh   Zcreate_follower_db)r   nodert   re   r   r   r   pytest_configure_node   s   z XDistHooks.pytest_configure_nodec                 C  s0   ddl m} ddl m} ||j|jd  d S )Nr   rs   rd   r9   )rf   rt   re   rh   Zdrop_follower_dbr8   )r   ry   errorrt   re   r   r   r   pytest_testnodedown   s
   zXDistHooks.pytest_testnodedownN)r   r   r   rz   r|   r   r   r   r   r@      s    r@   c                   s   ddl m} tdd dd |D |d d < dd |D  fd	d
  fdd}|| g }|D ]}|j}|v rJ|| |j  q6|| q6t	|dd d|d d < d S )Nr   rd   c                   S  s
   t tS r   )collectionsdefaultdictr<   r   r   r   r   <lambda>   s   
 z/pytest_collection_modifyitems.<locals>.<lambda>c                 S  s4   g | ]}| tjd ur| tjjds|qS )N_)	getparentpytestClassr-   
startswithr5   itemr   r   r   r7      s    z1pytest_collection_modifyitems.<locals>.<listcomp>c                 S  s   h | ]}| tjqS r   )r   r   r   r   r   r   r   	<setcomp>   s    z0pytest_collection_modifyitems.<locals>.<setcomp>c                 3  s6    |   D ]}t|tjr |E d H  q|V  qd S r   )collect
isinstancer   Z	Collector)elementZ
inst_or_fn)r   r   r   r      s   z.pytest_collection_modifyitems.<locals>.collectc            
        s  D ]} t  }t| jddst| jddrdh}nt| jddr$dh}nt }dd |  D }|| }||}|D ]}| | q;t| j| j	|D ]4}|| jur| j }| 
tj}tjj|j|d	}|D ]}|| qi |D ]
}	||	j |	 quqLqd S )
NZ__backend__FZ__only_on__backendZ__sparse_backend__Zsparse_backendc                 S  s   h | ]}|j qS r   )r-   )r5   markr   r   r   r     s    zLpytest_collection_modifyitems.<locals>.setup_test_classes.<locals>.<setcomp>r-   parent)setrG   cls	frozensetZiter_markersunionZ
add_markerr   Zgenerate_sub_testsmoduler   r   Moduler   from_parentr   r-   r]   )
Z
test_classZadd_markersZexisting_markersZall_markersmarkerZsub_clsZper_cls_dictr   Znew_clsfnr   Zrebuilt_itemsZtest_classesr   r   setup_test_classes  s@   



z9pytest_collection_modifyitems.<locals>.setup_test_classesc                 S  s    |  tjj|  tjj| jfS r   )r   r   r   r-   r   )r   r   r   r   r   9  s   )key)
rf   re   r}   r~   rh   r   extendr-   r]   sorted)r_   r3   itemsre   r   Znewitemsr   Zcls_r   r   r   pytest_collection_modifyitems   s*   
*r   c                   st   t |r%t||r%ddlm} |jrt|} fddt j	|D S t 
|r8 jd ur8t j|r8d S g S )Nr   r3   c                   s   g | ]}t jj|j d qS )r   )r   r   r   r   )r5   Zparametrize_cls	collectorr   r   r7   H  s    z-pytest_pycollect_makeitem.<locals>.<listcomp>)inspectisclassr   Z
want_classrf   r3   	any_async_apply_maybe_async_parametrize_clsr   
isfunctionr   Zwant_method)r   r-   objr3   r   r   r   pytest_pycollect_makeitemA  s   


r   c                 C  s$   t | dr| j} t | dst| S )N__wrapped__)rA   r   r   iscoroutinefunctionr   r   r   r   _is_wrapped_coroutine_function[  s   


r   c                   s   ddl m  t|  D ]C\}}t|st|trOt|ddsO|drOt	|sOd}t|tr4|j
}d}t fdd}||}|rFt|}d|_t| || q|rf|  d	d  D ]}|tkret|d qZ| S )
Nr   rd   _maybe_async_appliedFZtest_Tc                   s    j | g|R i |S r   )_maybe_asyncr   argskwargsrd   r   r   
make_asyncq  s   z&_apply_maybe_async.<locals>.make_asyncr   )rf   re   varsr   callabler   classmethodrG   r   r   __func___pytest_fn_decoratorr   setattrmroobjectr   )r   recurser-   valueZis_classmethodr   Zdo_asyncr   r   rd   r   r   b  s<   


r   c                 C  s   d|j vr|gS |j}g }tjdd |D  D ]S}i }tdd |D |D ]\}}|s/tdtd|}t||jD ]\}	}
|
||	< q;q%d	dd	 |D }d
|j
|f }tt||f|}t| || || q|S )z6implement a class-based version of pytest parametrize._sa_parametrizec                 S  s   g | ]\}}|qS r   r   )r5   argnameparamsr   r   r   r7         z$_parametrize_cls.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )r   r   )r5   Z	_sa_paramr   r   r   r7     r   z*need argnames for class-based combinationsz,\s*r   c                 s  s0    | ]}|j d D ]
}tdd|V  q
qdS )-z\W N)idsplitresub)r5   paramtokenr   r   r   	<genexpr>  s    
z#_parametrize_cls.<locals>.<genexpr>z%s_%s)__dict__r   	itertoolsproductzip	TypeErrorr   r   r   r;   r   type__new__r   r]   )r   r   r   classesZfull_param_setZcls_variablesr   r   Zargname_splitargvalZparametrized_namer-   Znewclsr   r   r   r     s2   


r   c                 C  sH   ddl m} t| tjr td u r"|tj| j	 | 
tjad S d S d S rc   )rf   re   r   r   Function_current_classrh   r   Z!start_test_class_outside_fixturesr   r   r   r   re   r   r   r   pytest_runtest_setup  s   
r   )Zhookwrapperc              
   c  s   ddl m} |tj|  d V  td ur|d u s!|tjturd azXz
|	tj
| j W nH tyv } z<tjrq|jsDdtj f|_ |jd rgt|jd trgt|j}|d  dtj 7  < t||_ | jdtjf7  _ d }~ww W d ad S d aw d S d S )Nr   rd   z__Original test failure__:
z
__Original test failure__:
z__Original test failure__)rf   re   r   r   Z
after_testr   r   r   r   rh   Z stop_test_class_outside_fixturesr   	Exception_current_reportfailedr   Zlongreprtextr   strr<   tuple)r   Znextitemre   er   r   r   r   pytest_runtest_teardown  sP   

r   c                 C  s,   ddl m} |tj| | jj| j| j d S rc   )	rf   re   r   r   Zbefore_testr   r   r   r-   r   r   r   r   pytest_runtest_call  s   r   c                 C  s   | j dkr	| ad S d S )Ncall)whenr   )reportr   r   r   pytest_runtest_logreport  s   
r   class)scopec                 c  sX    ddl m} | j}t|dr||j d V  t|dr#||j |tj| d S )Nr   rd   setup_test_classteardown_test_class)	rf   re   r   rA   r   r   r   r   Zstop_test_class)requestre   r   r   r   r   setup_class_methods  s   

r   functionc                 c  s    ddl m} | j}t|dr||j t|dr ||j d V  |tj| t|dr5||j	 t|drB||j
 d S d S )Nr   rd   
setup_testsetUptearDownteardown_test)rf   re   instancerA   r   r   r   r   Zafter_test_fixturesr   r   )r   re   r   r   r   r   setup_test_methods  s   





r   c                   s8   ddl m ddlm dd  d
 fdd	}|S )z:Port of langhelpers.decorator with pytest-specific tricks.r   )format_argspec_plus)inspect_getfullargspecc                 S  s   t | | || S r   )exec)codeenvfn_namer   r   r   _exec_code_in_env]  s   
z/_pytest_fn_decorator.<locals>._exec_code_in_envr   c                   s   | }|r|j | tdd| jd}||dd d| } || d| j}|s=t| d| j|_| |_t|| S | j	|_	| j|_t
| d	rN| j|_|S )
N__target_fn	__orig_fn)r   r   r-   F)groupedzVdef %(name)s%(grouped_args)s:
    return %(__target_fn)s(%(__orig_fn)s, %(apply_kw)s)
)r   r   r   
pytestmark)r   r   dictr   updaterG   __defaults__r   r   r   rA   r   )r   add_positional_parametersspecmetadatar   Z	decoratedr   r   r   targetr   r   decoratee  s.   

z&_pytest_fn_decorator.<locals>.decorateN)r   )Zsqlalchemy.util.langhelpersr   Zsqlalchemy.util.compatr   )r  r  r   r  r   r   W  s
   !r   c                   @  sf   e Zd Zdd Zedd Zdd Zdd eed	d d
Z	dd Z
dd Zdd Zdd Zdd ZdS )rH   c                 O  s   t jj|i |S r   )r   skipr   )r   r   r.   r   r   r   skip_test_exception  s   z*PytestFixtureFunctions.skip_test_exceptionc                 C  s   t jS r   )r   r   r   r   r   r   add_to_marker  s   z$PytestFixtureFunctions.add_to_markerc                 C  s   t jddS )Nr   r   )r   r   Zusefixturesr	  r   r   r   mark_base_test_class  s   z+PytestFixtureFunctions.mark_base_test_classc                 C  s   | S r   r   r   r   r   r   r     s    zPytestFixtureFunctions.<lambda>c                 C  s   t | dr| jS t| jS )Nr   )rA   r   r   r  r   r   r   r     s   
)irsnc              
     s  ddl m t|dkrt|d drt|d }|ddfdd}|d	d}g }d
|r| j tjdgdd t	|D R  } fddt	|D }|D ].t
ts[f|\}}	||dd }
|	rmd||
|	dfdd|D f qQn|D ]t
tsf|\}}	|	rd|||	df qg |D ]\}
}	}r|
|	f7 }
tj|
d|i}| qfdd}|S )a  Facade for pytest.mark.parametrize.

        Automatically derives argument names from the callable which in our
        case is always a method on a class with positional arguments.

        ids for parameter sets are derived using an optional template.

        r   
exclusionsr   __next__argnamesNc                   s<   g }g }| D ]}t | jr|| q|| q||fS r   )r   compoundr]   )r   resultZgathered_exclusionsar  r   r   _filter_exclusions  s   z?PytestFixtureFunctions.combinations.<locals>._filter_exclusionsid_Fc                 S  s   g | ]
\}}|d v r|qS ))r  r  r  r  r   r5   idxcharr   r   r   r7     s
    z7PytestFixtureFunctions.combinations.<locals>.<listcomp>c                   s*   g | ]\}}| v rt | | fqS r   )operator
itemgetterr  )_combination_id_fnsr   r   r7     s
    Tr   c                 3  s     | ]\}}|| V  qd S r   r   )r5   getterZcomb_fn)r   r   r   r     s    
z6PytestFixtureFunctions.combinations.<locals>.<genexpr>r   c                   s   t | rrtdd| jvrg | _| j f | S t | jdd  } d u r.|}nt	d }rXt
dd |D }d| }||g7 }tfdd	}|| |fd
} tj|| S )Nz5exclusions not supported for class level combinationsr   r   z, *c                 s  s    | ]
}| d rdV  qdS )_exclusionsr   N)r   )r5   r  r   r   r   r     s    

zHPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.<genexpr>Z_exclusions_c                   s8   |d }|r   j| }|| } | |d d i |S )Nr   )r  add)r   r   r.   r!  Zexlur  r   r   check_exclusions  s
   zOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.check_exclusions)r  )r   r   NotImplementedErrorr   r   r]   getfullargspecr   r   r   sumr   r   r   Zparametrize)r   Z_fn_argnamesZ	_argnamesZexisting_exlZcurrent_exclusion_namer#  )r  r  has_exclusionspytest_paramsr   r   r    s2   



z5PytestFixtureFunctions.combinations.<locals>.decorate)rf   r  lenrA   r<   r+   r  r  r  	enumerater   r   r]   r;   r   r   )r   Zarg_setsr.   r  r  Ztobuild_pytest_paramsZ_arg_getterfnsZ	fn_paramsZparam_exclusions
parametersr   r  r   )r  r   r  r  r'  r(  r   combinations  sj   	



&z#PytestFixtureFunctions.combinationsc                 G  s    |d }t j|dd  d|iS )Nr   r   r   )r   r   )r   r,  identr   r   r   param_ident%  s   z"PytestFixtureFunctions.param_identc                   sz   ddl m ddl m  t|dkr#t|d r#|d }|dd  }nd }tj|i | fdd}|r;||S |S )Nr   r   rd   r   c                   s   j r | } | } | S r   )r   Z_maybe_async_wrapperr   re   r3   fixturer   r   wrap?  s   
z,PytestFixtureFunctions.fixture.<locals>.wrap)rf   r3   re   r)  r   r   r1  )r   r   r.   r   r2  r   r0  r   r1  )  s   
zPytestFixtureFunctions.fixturec                 C  s   t jdS )NZPYTEST_CURRENT_TEST)rB   environgetr	  r   r   r   get_current_test_nameN  s   z,PytestFixtureFunctions.get_current_test_namec                   s$   ddl m  t fdd}||S )Nr   rd   c                   s    j | g|R i | d S r   )Z_run_coroutine_functionr   rd   r   r   r  T  s   z3PytestFixtureFunctions.async_test.<locals>.decorate)rf   re   r   )r   r   r  r   rd   r   
async_testQ  s   z!PytestFixtureFunctions.async_testN)r   r   r   r  propertyr
  r  reprr   r  r-  r/  r1  r5  r6  r   r   r   r   rH     s     
	 %rH   )r3   r4   )T)/
__future__r   r,   r}   	functoolsr   r   r   r  rB   r   rY   typingr   rv   r   Zsqla_plugin_baser   ImportErrorr   r2   rK   rJ   r1  rQ   rb   rg   ri   rr   r@   r   r   r   r   r   r   r   Zhookimplr   r   r   r   r   r   r   ZFixtureFunctionsrH   r   r   r   r   <module>   s`   
1&


 a
 !

5



>2