o
    RcIi                     @   s  zd dl ZW n ey   ddlmZ Y nw 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Zd dlZejdk Zerazd dlZW n ey`   ddlmZ Y nw dd Zd	d
 Zdaejdddd Zdd Zdd Zdd ZG dd deZdd Zdd Zdd Z d8d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+d,d-d. Z*ejd/d,d0d1 Z+d2d3 Z,d4d5 Z-G d6d7 d7ej.Z/dS )9    N   )plugin_base)update_wrapper)   r   )reinvent_fixtures_py2kc                    s,   |  d  fdd}t| t  d S )NZ
sqlalchemyc                    st   | 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   HD:\Flask\env\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                       s6   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#   )r   	__class__r   r   r%   1   s   

zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__init__c                    r	   r
   r   r   )r   r   r   r   C   r   r   )FFNr
   )r   r   r   r%   r   __classcell__r   )r   r   )r&   r   r   0   s    )popargparseZActionZ	addoption)namekwgroup)r   r   r   r   make_option!   s   z%pytest_addoption.<locals>.make_option)Zgetgroupr   Zsetup_optionsZread_config)r   r.   r   r,   r   pytest_addoption   s   

+r/   c                 C   s   | j dr| j t  t| dr!t| j t| jd  n| j	j
r4tj| j	j
r4t| j	j
 t| j	 ttt| j	dd tt | j	jrSdad S d S )NZxdistworkerinputfollower_identZ
cov_sourceFT)ZpluginmanagerZ	haspluginregister
XDistHookshasattrr   Z!restore_important_follower_configr0   Zconfigure_followeroptionZwrite_identsospathexistsremoveZ	pre_beginZset_coverage_flagboolgetattrZset_fixture_functionsPytestFixtureFunctionsdump_pyannotateDUMP_PYANNOTATEconfigr   r   r   pytest_configureP   s"   

rA   FT)autousec                  c   s4    t rddlm}  |   d V  t r|   d S d S )Nr   collect_types)r>   pyannotate_runtimerD   startstoprC   r   r   r   collect_types_fixturem   s   rH   c                 C   s   ddl m} |tj d S Nr   asyncio)sqlalchemy.testingrK   Z_assume_asyncr   Z
post_begin)sessionrK   r   r   r   pytest_sessionstartx   s   rN   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   rJ   rC   )rL   rK   _maybe_async_provisioningr   Zfinal_process_cleanupr@   r5   r=   rE   rD   Z
dump_stats)rM   rK   rD   r   r   r   pytest_sessionfinish~   s   
rP   c                    sB   | j jjrddlm} tjd  fdd}|j|d d S d S )Nr   rC   lib/sqlalchemyc                    s<   t jt j| } dt j|  gvrd S d| v rd S | S )NrQ   testing)r6   r7   normpathabspath
commonpath)filenameZlib_sqlalchemyr   r   _filter   s   z)pytest_collection_finish.<locals>._filter)Zfilter_filename)	r@   r5   r=   rE   rD   r6   r7   rT   Zinit_types_collection)rM   rD   rX   r   rW   r   pytest_collection_finish   s   
rY   c                   @   s   e Zd Zdd Zdd ZdS )r3   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   	provisionrJ   ztest_%s   r1   )rL   r[   rK   r   Z!memoize_important_follower_configr0   uuiduuid4hexrO   Zcreate_follower_db)r   noder[   rK   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   rZ   rJ   r1   )rL   r[   rK   rO   Zdrop_follower_dbr0   )r   r`   errorr[   rK   r   r   r   pytest_testnodedown   s
   zXDistHooks.pytest_testnodedownN)r   r   r   ra   rc   r   r   r   r   r3      s    r3   c                    s   ddl m} tdd dd |D |d d < tdd |D  fd	d
  fdd}|| g }|D ]}|j}|v rL|| |j  q8|	| q8t
r^|D ]}t| qVt|dd d|d d < d S )Nr   rJ   c                   S   s
   t tS r
   )collectionsdefaultdictlistr   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.0itemr   r   r   
<listcomp>   s    z1pytest_collection_modifyitems.<locals>.<listcomp>c                 s   s    | ]	}| tjV  qd S r
   )ri   rj   rk   rm   r   r   r   	<genexpr>   s    z0pytest_collection_modifyitems.<locals>.<genexpr>c                 3   s<    |   D ]}t|tjr |D ]}|V  qq|V  qd S r
   )collect
isinstancerj   Z	Collector)elementZ
inst_or_fnel)rr   r   r   rr      s   z.pytest_collection_modifyitems.<locals>.collectc                     s|   D ]9} t | j| jD ].}|| jur:| j }ttjdtj}| tj} ||j	|dD ]
}||j
 | q/qqd S )Nfrom_parentr*   parent)r   Zgenerate_sub_testsclsmoduler;   rj   rk   ri   Moduler   r*   append)Z
test_classZsub_clsZper_cls_dictctorrz   fnrr   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
   )ri   rj   r{   r*   rk   )ro   r   r   r   rg      s   )key)rL   rK   rd   re   setrO   ry   extendr*   r|   py2kr   Z"scan_for_fixtures_to_use_for_classsorted)rM   r@   itemsrK   r   Znewitemsro   Zcls_r   r   r   pytest_collection_modifyitems   s0   	
r   c                    s   t |r.t||r.ddlm} |jrt|}tt	j
dt	j
 fddt j|D S t |rA jd urAt j|rAd S g S )Nr   r?   rv   c                    s   g | ]	}|j  d qS )rw   )r   )rn   Zparametrize_cls	collectorr}   r   r   rp     s    z-pytest_pycollect_makeitem.<locals>.<listcomp>)inspectisclassr   Z
want_classrL   r@   	any_async_apply_maybe_asyncr;   rj   rk   _parametrize_clsrz   
isfunctionry   Zwant_method)r   r*   objr@   r   r   r   pytest_pycollect_makeitem  s    
r   c                 C   s$   t | dr| j} t | dst| S )N__wrapped__)r4   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   rJ   _maybe_async_appliedFZtest_Tc                    s    j | g|R i |S r
   )_maybe_asyncr~   argskwargsrJ   r   r   
make_async5  s   z&_apply_maybe_async.<locals>.make_asyncr   )rL   rK   varsr   callablers   classmethodr;   rl   r   __func___pytest_fn_decoratorr   setattrmroobjectr   )r   recurser*   valueZis_classmethodr   Zdo_asyncry   r   rJ   r   r   &  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   )rn   argnameparamsr   r   r   rp   O      z$_parametrize_cls.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )rn   Z	_sa_paramr   r   r   rp   T  r   z*need argnames for class-based combinationsz,\s*rh   c                 s   s4    | ]}|j d D ]}ttdd|V  q
qdS )-z\W N)idsplitstrresub)rn   paramtokenr   r   r   rq   [  s    
z#_parametrize_cls.<locals>.<genexpr>z%s_%s)__dict__r   	itertoolsproductzip	TypeErrorr   r   r   joinr   type__new__r   r|   )rz   ry   r   classesZfull_param_setZcls_variablesr   r   Zargname_splitargvalZparametrized_namer*   Znewclsr   r   r   r   F  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 rI   )rL   rK   rs   rj   Function_current_classrO   r   Z!start_test_class_outside_fixturesry   ri   rk   ro   rK   r   r   r   pytest_runtest_setupl  s   
r   )Zhookwrapperc              
   c   s   ddl m} 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y| } z<tjrw|jsJdtj f|_ |jd rmt|jd |rmt|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   rJ   )string_typesz__Original test failure__:
z
__Original test failure__:
z__Original test failure__)rL   rK   Zsqlalchemy.utilr   r   r   Z
after_testr   ri   rj   rk   rO   Z stop_test_class_outside_fixturesry   	Exception_current_reportfailedr   Zlongreprtextrs   rf   tuple)ro   ZnextitemrK   r   er   r   r   r   pytest_runtest_teardown  sT   

r   c                 C   s,   ddl m} |tj| | jj| j| j d S rI   )	rL   rK   r   r   Zbefore_testrz   r   ry   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   st    ddl m} | j}t|dr||j trt|  d V  tr&t	|  t|dr1||j
 |tj| d S )Nr   rJ   setup_test_classteardown_test_class)rL   rK   ry   r4   r   r   r   r   Zrun_class_fixture_setupZrun_class_fixture_teardownr   r   Zstop_test_class)requestrK   ry   r   r   r   setup_class_methods  s   



r   functionc                 c   s    ddl m} | j}trt|  t|dr||j t|dr'||j	 d V  |t
j| t|dr<||j t|drG||j trPt|  d S d S )Nr   rJ   
setup_testsetUptearDownteardown_test)rL   rK   instancer   r   Zrun_fn_fixture_setupr4   r   r   r   r   Zafter_test_fixturesr   r   Zrun_fn_fixture_teardown)r   rK   r   r   r   r   setup_test_methods  s$   





r   c                 C   s    t jjdkrt| S t| S )Nr   )sysversion_infomajorr   getfullargspec
getargspecr   r   r   r   r   '  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_env4  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)groupedzPdef %(name)s(%(args)s):
    return %(__target_fn)s(%(__orig_fn)s, %(apply_kw)s)
)r   r   r   
pytestmark)r   r   dictr   updater;   __defaults__r   r   r   r4   r   )r~   add_positional_parametersspecmetadatar   Z	decoratedr   r   r   targetr   r   decorate8  s.   

z&_pytest_fn_decorator.<locals>.decorateN)r   )Zsqlalchemy.util.langhelpersr   Zsqlalchemy.util.compatr   )r   r   r   r   r   r   .  s
   "r   c                   @   sZ   e Zd Z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 )r<   c                 O   s   t jj|i |S r
   )rj   skipr   )r   r   r+   r   r   r   skip_test_exception^  s   z*PytestFixtureFunctions.skip_test_exceptionc                 C   s   t jddS )Nr   r   )rj   markZusefixturesr   r   r   r   mark_base_test_classa  s   z+PytestFixtureFunctions.mark_base_test_classc                 C   s   | S r
   r   r   r   r   r   rg   g  s    zPytestFixtureFunctions.<lambda>c                 C   s   t | dr| jS t| jS )Nr   )r4   r   r   r   r   r   r   rg   j  s   
)irsnc              
      s  ddl m tjjdkr t|dkrt|d drt|d }nt|dkr3t|d dr3t|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suf|\}}	||dd }
|	rd||
|	dfdd|D f qkn|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   r   __next__nextargnamesNc                    s<   g }g }| D ]}t | jr|| q|| q||fS r
   )rs   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   rn   idxcharr   r   r   rp     s    z7PytestFixtureFunctions.combinations.<locals>.<listcomp>c                    s*   g | ]\}}| v rt | | fqS r   )operator
itemgetterr	  )_combination_id_fnsr   r   rp     s    Tr   c                 3   s     | ]\}}|| V  qd S r
   r   )rn   getterZcomb_fn)r   r   r   rq     s    
z6PytestFixtureFunctions.combinations.<locals>.<genexpr>r   c                    s   t | rrtdd| jvrg | _| j f | S  d u r+t| jdd  }nt	d }rJ|dg7 }t
fdd}dd	 }|| d
d} tj|| S )Nz5exclusions not supported for class level combinationsr   r   z, *_exclusionsc                    s8   |d }|r   j| }|| } | |dd i |S )Nr   r   )r  add)r~   r   r+   r  Zexlur   r   r   check_exclusions  s
   zOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.check_exclusionsc                 S   s   | j d d S )Nr  )r   r|   )r   r   r   r   process_metadata  s   zOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.process_metadata)r  )r   )r   r   NotImplementedErrorr   r   r|   r   r   r   r   r   rj   r   Zparametrize)r~   Z	_argnamesr  r  )r  r   has_exclusionspytest_paramsr   r   r     s*   


z5PytestFixtureFunctions.combinations.<locals>.decorate)rL   r   r   r   r   lenr4   rf   r(   r  r  r  	enumeraters   r   r|   r   rj   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   combinationso  sr   	



$z#PytestFixtureFunctions.combinationsc                 G   s    |d }t j|dd  d|iS )Nr   r   r   )rj   r   )r   r  identr   r   r   param_ident  s   z"PytestFixtureFunctions.param_identc                    s|   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?   rJ   r   c                    s8   j r | } trdv rt|  | S | } | S )NrB   )r   Z_maybe_async_wrapperr   r   Zadd_fixturer   rK   r@   fixturer+   r   r   wrap  s   
z,PytestFixtureFunctions.fixture.<locals>.wrap)rL   r@   rK   r  r   rj   r  )r   r   r+   r~   r   r   r  r   r    s   zPytestFixtureFunctions.fixturec                 C   s   t jdS )NZPYTEST_CURRENT_TEST)r6   environgetr   r   r   r   get_current_test_name*  s   z,PytestFixtureFunctions.get_current_test_namec                    s$   ddl m  t fdd}||S )Nr   rJ   c                    s    j | g|R i | d S r
   )Z_run_coroutine_functionr   rJ   r   r   r   0  s   z3PytestFixtureFunctions.async_test.<locals>.decorate)rL   rK   r   )r   r~   r   r   rJ   r   
async_test-  s   z!PytestFixtureFunctions.async_testN)r   r   r   r   r   reprr   r  r  r  r  r#  r$  r   r   r   r   r<   ]  s    	 
.r<   )T)0Zsqla_plugin_baser   ImportErrorr   r)   rd   	functoolsr   r   r   r  r6   r   r   r]   rj   r   r   Zsqla_reinvent_fixturesr   r/   rA   r>   r  rH   rN   rP   rY   r   r3   r   r   r   r   r   r   r   Zhookimplr   r   r   r   r   r   r   r   ZFixtureFunctionsr<   r   r   r   r   <module>   sf    
2


P
 #

5



B/