o
    Šågl  ã                   @  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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/d0„ Z*ejd1d2�d3d4„ ƒZ+ejd5d2�d6d7„ ƒZ,d8d9„ Z-G d:d;„ d;e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ÚvaluesÚoption_string©Ú	callback_r   úb/var/www/html/flaskapp/venv/lib/python3.10/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'   5   s   
ùzFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__init__c                   r
   r   r   r   ©r   r   r   r   G   r   r   )FFNr   )r   r   r   r'   r   Ú__classcell__r   r*   r(   r   r   4   s    úÿ)ÚpopÚargparseÚActionÚ	addoption)ÚnameÚkwr   ©Úgroup)r   r   r   Úmake_option%   s   z%pytest_addoption.<locals>.make_option)Úgetgroupr   Úsetup_options)r   r4   r   r2   r   Úpytest_addoption"   s   
+r7   Ú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rƒd	ad S d S )
Nz and c                 S  s   g | ]}d |› �‘qS )znot r   )Ú.0Útagr   r   r   Ú
<listcomp>X   s    z$pytest_configure.<locals>.<listcomp>ÚxdistÚworkerinputÚfollower_identÚ
cov_sourceFT)r   Úread_configÚrootpathÚexclude_tagsÚinclude_tagsÚjoinÚlistÚoptionÚmarkexprÚpluginmanagerÚ	haspluginÚregisterÚ
XDistHooksÚhasattrÚ!restore_important_follower_configr>   Úconfigure_followerÚwrite_identsÚosÚpathÚexistsÚremoveÚ	pre_beginÚset_coverage_flagÚboolÚgetattrÚset_fixture_functionsÚPytestFixtureFunctionsÚdump_pyannotateÚDUMP_PYANNOTATE)r8   Únew_exprr   r   r   Úpytest_configureS   s6   ÿÿ
ÿÿ
þr^   FT)Úautousec                  c  s4   � t rddlm}  |  ¡  d V  t r|  ¡  d S d S )Nr   ©Úcollect_types)r\   Úpyannotate_runtimera   ÚstartÚstopr`   r   r   r   Úcollect_types_fixture|   s   €ÿre   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; Úterminalreporterú=z=========================)r   rf   Úsqlalchemy.utilrg   Úsqlalchemy.util._has_cyrh   ÚsysÚflagsÚno_user_siteÚ__file__Úsqlalchemy.cyextensionrj   Úappendr8   rI   Ú
get_pluginÚ	write_sepÚ
write_lineÚprint)Úsessionr   rf   rg   rh   ÚgreetÚsiteÚmsgsrj   ÚpmÚmr   r   r   Ú_log_sqlalchemy_info‡   s.   
þÿ
ÿr€   c                 C  s$   ddl m} t| ƒ | tj¡ d S ©Nr   ©Úasyncio)Úsqlalchemy.testingrƒ   r€   Ú_assume_asyncr   Ú
post_begin)rz   rƒ   r   r   r   Úpytest_sessionstart§   s   r‡   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   r‚   r`   )r„   rƒ   Ú_maybe_async_provisioningr   Úfinal_process_cleanupr8   rG   r[   rb   ra   Ú
dump_stats)rz   rƒ   ra   r   r   r   Úpytest_sessionfinish®   s   
ýr‹   c                 C  s   ddl m} | ¡  d S r�   )r„   rƒ   Ú	_shutdown)r8   rƒ   r   r   r   Úpytest_unconfigure¹   s   r�   c                   sB   | j jjrddlm} tj d¡‰ ‡ fdd„}|j|d� d S d S )Nr   r`   úlib/sqlalchemyc                   s<   t j t j | ¡¡} dt j | ˆ g¡vrd S d| v rd S | S )NrŽ   Útesting)rQ   rR   ÚnormpathÚabspathÚ
commonpath)Úfilename©Úlib_sqlalchemyr   r   Ú_filterÅ   s   ÿz)pytest_collection_finish.<locals>._filter)Úfilter_filename)	r8   rG   r[   rb   ra   rQ   rR   r‘   Úinit_types_collection)rz   ra   r–   r   r”   r   Úpytest_collection_finish¿   s   
ðr™   c                   @  s   e Zd Zdd„ Zdd„ ZdS )rL   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   ©Ú	provisionr‚   ztest_%sé   r?   )r„   r›   rƒ   r   Ú!memoize_important_follower_configr>   ÚuuidÚuuid4Úhexrˆ   Úcreate_follower_db)r   Únoder›   rƒ   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   rš   r‚   r?   )r„   r›   rƒ   rˆ   Údrop_follower_dbr>   )r   r¢   Úerrorr›   rƒ   r   r   r   Úpytest_testnodedownã   s
   ÿzXDistHooks.pytest_testnodedownN)r   r   r   r£   r¦   r   r   r   r   rL   Ó   s    rL   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   r‚   c                   S  s
   t  t¡S r   )ÚcollectionsÚdefaultdictrF   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ÚClassr0   Ú
startswith©r:   Úitemr   r   r   r<   ý   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¬   Ú	Collector)ÚelementÚ
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 )
NÚ__backend__FÚ__only_on__ÚbackendÚ__sparse_backend__Úsparse_backendc                 S  s   h | ]}|j ’qS r   )r0   )r:   Úmarkr   r   r   r±     s    ÿzLpytest_collection_modifyitems.<locals>.setup_test_classes.<locals>.<setcomp>©r0   Úparent)ÚsetrX   ÚclsÚ	frozensetÚiter_markersÚunionÚ
add_markerr   Úgenerate_sub_testsÚmoduler«   r¬   ÚModuler­   Úfrom_parentr   r0   ru   )
Ú
test_classÚadd_markersÚexisting_markersÚall_markersÚmarkerÚsub_clsÚper_cls_dictrÆ   Únew_clsÚfn©r²   Úrebuilt_itemsÚ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Ç   r0   r­   )r°   r   r   r   r©   E  s   ý)Úkey)
r„   rƒ   r§   r¨   rˆ   rÀ   Úextendr0   ru   Úsorted)rz   r8   Úitemsrƒ   rÕ   Únewitemsr°   Ú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   ©r8   c                   s   g | ]}t jj|jˆ d �‘qS )r½   )r¬   r­   rÈ   r   )r:   Úparametrize_cls©Ú	collectorr   r   r<   T  s    ýÿÿz-pytest_pycollect_makeitem.<locals>.<listcomp>)ÚinspectÚisclassr   Ú
want_classr„   r8   Ú	any_asyncÚ_apply_maybe_asyncÚ_parametrize_clsrÆ   Ú
isfunctionrÀ   Úwant_method)rà   r0   Úobjr8   r   rß   r   Úpytest_pycollect_makeitemM  s   

üÿ
ÿrê   c                 C  s$   t | dƒr| j} t | dƒst | ¡S )NÚ__wrapped__)rM   rë   rá   Úiscoroutinefunction©rÑ   r   r   r   Ú_is_wrapped_coroutine_functiong  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   r‚   Ú_maybe_async_appliedFÚtest_Tc                   s   ˆ j | g|¢R i |¤ŽS r   )Ú_maybe_async©rÑ   ÚargsÚkwargsr‚   r   r   Ú
make_async}  s   z&_apply_maybe_async.<locals>.make_asyncr   )r„   rƒ   ÚvarsrÙ   Úcallabler³   ÚclassmethodrX   r®   rî   Ú__func__Ú_pytest_fn_decoratorrï   ÚsetattrÚmroÚobjectrå   )ré   Úrecurser0   ÚvalueÚis_classmethodrõ   Údo_asyncrÀ   r   r‚   r   rå   n  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   )r:   ÚargnameÚparamsr   r   r   r<   —  ó    z$_parametrize_cls.<locals>.<listcomp>c                 S  s   g | ]}|d  ‘qS )r   r   )r:   Ú	_sa_paramr   r   r   r<   œ  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)r:   ÚparamÚtokenr   r   r   Ú	<genexpr>£  s   € 
ýþÿz#_parametrize_cls.<locals>.<genexpr>z%s_%s)Ú__dict__r  Ú	itertoolsÚproductÚzipÚ	TypeErrorr  r
  r   rE   r   ÚtypeÚ__new__rû   ru   )rÆ   rÀ   r  ÚclassesÚfull_param_setÚcls_variablesr  r  Úargname_splitÚargÚvalÚparametrized_namer0   Ú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 r�   )r„   rƒ   r³   r¬   ÚFunctionÚ_current_classrˆ   r   Ú!start_test_class_outside_fixturesrÀ   r«   r­   ©r°   rƒ   r   r   r   Úpytest_runtest_setup²  s   
þûr#  )Úhookwrapperc              
   c  s  � ddl m} | tj| ¡ d V  td ur|d u s!| tj¡tur�d 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   r‚   z__Original test failure__:
éÿÿÿÿz
__Original test failure__:
z__Original test failure__)r„   rƒ   rñ   r   Ú
after_testr   r«   r¬   r­   rˆ   Ú stop_test_class_outside_fixturesrÀ   Ú	ExceptionÚ_current_reportÚfailedró   Úlongreprtextr³   ÚstrrF   Útuple)r°   Únextitemrƒ   Úeró   r   r   r   Úpytest_runtest_teardownÅ  sP   €ÿÿÿô
ÿÿ
üþ€ëýÞr0  c                 C  s,   ddl m} | tj| | jj| j| j¡ d S r�   )	r„   rƒ   rñ   r   Úbefore_testrÆ   r   rÀ   r0   r"  r   r   r   Úpytest_runtest_callû  s   ûr2  c                 C  s   | j dkr	| ad S d S )NÚcall)Úwhenr)  )Úreportr   r   r   Úpytest_runtest_logreport  s   
ÿr6  Úclass)Úscopec                 c  sX   � ddl m} | j}t|dƒr| |j¡ d V  t|dƒr#| |j¡ | tj|¡ d S )Nr   r‚   Úsetup_test_classÚteardown_test_class)	r„   rƒ   rÀ   rM   rñ   r9  r:  r   Ústop_test_class)Úrequestrƒ   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   r‚   Ú
setup_testÚsetUpÚtearDownÚteardown_test)r„   rƒ   ÚinstancerM   rñ   r?  r@  r   Úafter_test_fixturesrA  rB  )r<  rƒ   r   r   r   r   Úsetup_test_methods$  s   €





ÿrE  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_envi  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)rM  rN  r0   F)ÚgroupedzVdef %(name)s%(grouped_args)s:
    return %(__target_fn)s(%(__orig_fn)s, %(apply_kw)s)
)rM  rN  rù   Ú
pytestmark)ró   r×   Údictr   ÚupdaterX   Ú__defaults__rë   r   r   rM   rP  )rÑ   Úadd_positional_parametersÚspecÚmetadatarI  Ú	decorated©rL  rF  rG  Útargetr   r   Údecorateq  s.   ÿüÿÿ

z&_pytest_fn_decorator.<locals>.decorateN)r   )Úsqlalchemy.util.langhelpersrF  Úsqlalchemy.util.compatrG  )rY  rZ  r   rX  r   rú   c  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 )rZ   c                 O  s   t jj|i |¤ŽS r   )r¬   Úskipr(  )r   r  r1   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=  rE  )r¬   r¼   Ú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   )rM   r   r  rc  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‰|ˆƒ\}}	|	r—d‰| ||	df¡ qƒg ‰|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³   Úcompoundru   )ró   ÚresultÚgathered_exclusionsÚarh  r   r   Ú_filter_exclusions»  s   z?PytestFixtureFunctions.combinations.<locals>._filter_exclusionsÚid_Fc                 S  s   g | ]
\}}|d v r|‘qS ))rg  re  rf  ro  r   ©r:   ÚidxÚcharr   r   r   r<   Ò  s
    þz7PytestFixtureFunctions.combinations.<locals>.<listcomp>c                   s*   g | ]\}}|ˆ v rt  |¡ˆ | f‘qS r   )ÚoperatorÚ
itemgetterrr  )Ú_combination_id_fnsr   r   r<   Ø  s
    þTr  c                 3  s    � | ]\}}||ˆ ƒƒV  qd S r   r   )r:   ÚgetterÚ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®   )r:   rg  r   r   r   r    s   € 
ÿ
ÿzHPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.<genexpr>Ú_exclusions_c                   s8   |d }|rˆ   ¡ j|Ž }|| ƒ} | |d d… i |¤ŽS )Nr%  )rl  Úadd)rÑ   ró   r1   rz  Úexlurh  r   r   Úcheck_exclusions!  s
   zOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.check_exclusions)rT  )rá   râ   ÚNotImplementedErrorr  r  ru   Úgetfullargspecró   r  r
  Úsumrú   r¬   r¼   Úparametrize)rÑ   Ú_fn_argnamesÚ	_argnamesÚexisting_exlÚcurrent_exclusion_namer~  )rk  ri  Úhas_exclusionsÚpytest_paramsr   r   rZ  	  s2   
ÿ
ÿ

ÿz5PytestFixtureFunctions.combinations.<locals>.decorate)r„   ri  ÚlenrM   rF   r,   rw  ru  rv  Ú	enumerater³   r-  ru   rE   r¬   r  )r   Úarg_setsr1   rp  rq  Útobuild_pytest_paramsÚ_arg_getterÚfnsÚ	fn_paramsÚparam_exclusionsÚ
parametersr  rZ  r   )rw  r  rk  ri  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_ident1  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Ý   r‚   r   c                   s   ˆj rˆ  | ¡} ˆ| ƒ} | S r   )rä   Ú_maybe_async_wrapperrí   ©rƒ   r8   Úfixturer   r   ÚwrapK  s   
z,PytestFixtureFunctions.fixture.<locals>.wrap)r„   r8   rƒ   r‰  r÷   r¬   r—  )r   r  r1   rÑ   r˜  r   r–  r   r—  5  s   
zPytestFixtureFunctions.fixturec                 C  s   t j d¡S )NÚPYTEST_CURRENT_TEST)rQ   ÚenvironÚgetr_  r   r   r   Úget_current_test_nameZ  s   z,PytestFixtureFunctions.get_current_test_namec                   s$   ddl m‰  t‡ fdd„ƒ}||ƒS )Nr   r‚   c                   s   ˆ j | g|¢R i |¤Ž d S r   )Ú_run_coroutine_functionrò   r‚   r   r   rZ  `  s   z3PytestFixtureFunctions.async_test.<locals>.decorate)r„   rƒ   rú   )r   rÑ   rZ  r   r‚   r   Ú
async_test]  s   z!PytestFixtureFunctions.async_testN)r   r   r   r^  Úpropertyr`  rb  Úreprr,  rw  r’  r”  r—  rœ  rž  r   r   r   r   rZ   •  s     
ü	 %rZ   )r8   r9   )T)0Ú
__future__r   r-   r§   Ú	functoolsr   rá   r  ru  rQ   r  rp   Útypingr   rž   r¬   Úsqla_plugin_baser   ÚImportErrorr  r7   r^   r\   r—  re   r€   r‡   r‹   r�   r™   rL   rÜ   rê   rî   rå   ræ   r   r#  Úhookimplr0  r2  r)  r6  r=  rE  rú   ÚFixtureFunctionsrZ   r   r   r   r   Ú<module>   sb   €þ
1&


 a
 !

5



>2