o
    i=?                     @   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zd dlZW n	 eyO   Y n
w ejrYd dlmZ zd dlZdZW n eyl   dZY nw dd	 Zd
d Zdd Zdd Zerd dlZdd Zdd Zdd Zdd Zdadd Zdd Zdd Z dd Z!d d! Z"d"d# Z#d$d% Z$d&d' Z%d(d) Z&G d*d+ d+ej'Z(dS ),    N   )plugin_base)update_wrapper)SequenceTFc                    s,   |  d  fdd}t| t  d S )N
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valuesoption_string	callback_r   a/var/www/edux/Edux_v2/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                       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&   7   s   

zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__init__c                    r	   r
   r   r   )r   r   r   r   I   r   r   )FFNr
   )r   r   r   r&   r   __classcell__r   )r   r   )r'   r   r   6   s    )popargparseAction	addoption)namekwgroup)r   r   r   r   make_option'   s   z%pytest_addoption.<locals>.make_option)getgroupr   setup_optionsread_config)r   r1   r   r/   r   pytest_addoption$   s   

+r5   c                 C   s   t d t| drt| j t| jd  n| jjr,t	j
| jjr,t	| jj t| j ttt| jdd tt d S )Nzsqlalchemy.testing.assertions
slaveinputfollower_ident
cov_sourceF)pytestregister_assert_rewritehasattrr   !restore_important_follower_configr6   configure_followeroptionwrite_identsospathexistsremove	pre_beginset_coverage_flagboolgetattrset_fixture_functionsPytestFixtureFunctions)configr   r   r   pytest_configureV   s   

rK   c                 C      t   d S r
   )r   
post_beginsessionr   r   r   pytest_sessionstartk      rP   c                 C   rL   r
   )r   final_process_cleanuprN   r   r   r   pytest_sessionfinisho   rQ   rS   c                 C   sH   t | j dt jdd  | jd< ddlm} || jd  d S )Nztest_%sr      r7   	provision)	r   !memoize_important_follower_configr6   uuiduuid4hexsqlalchemy.testingrV   create_follower_db)noderV   r   r   r   pytest_configure_nodev   s   r^   c                 C   s    ddl m} || jd  d S )Nr   rU   r7   )r[   rV   drop_follower_dbr6   )r]   errorrV   r   r   r   pytest_testnodedown   s   ra   c                 C   s  t dd }dd |D |d d < tdd |D }|D ]6}t|j|jjD ]*}||jurR||j }tj	|j
|jjd D ]}| D ]
}	||	j |	 qFq@q(qg }
|D ]}|jj|v rm|
||jj |j  qX|
| qXt|
dd d	|d d < d S )
Nc                   S   s
   t tS r
   )collectionsdefaultdictlistr   r   r   r   <lambda>   s   
 z/pytest_collection_modifyitems.<locals>.<lambda>c                 S   s.   g | ]}t |jtjr|jjjd s|qS )_)
isinstanceparentr9   Instancer-   
startswith.0itemr   r   r   
<listcomp>   s    z1pytest_collection_modifyitems.<locals>.<listcomp>c                 s   s    | ]}|j V  qd S r
   rh   rk   r   r   r   	<genexpr>   s    z0pytest_collection_modifyitems.<locals>.<genexpr>ro   c                 S   s   | j j j j| j j j| jfS r
   )rh   r-   rm   r   r   r   re      s   
)key)rb   rc   setr   generate_sub_testsclsrh   moduler9   Classr   collectr-   appendextendsorted)rO   rJ   itemsrebuilt_itemstest_classes
test_classsub_clsper_cls_dictinsttnewitemsrm   r   r   r   pytest_collection_modifyitems   s@   



r   c                    s\   t |rt||r fddt j|D S t |r,t tj	r,t
 j|r,d S g S )Nc                    s   g | ]
}t j|j d qS )ro   )r9   rw   r   )rl   parametrize_cls	collectorr   r   rn      s    z-pytest_pycollect_makeitem.<locals>.<listcomp>)inspectisclassr   
want_class_parametrize_clsrv   
isfunctionrg   r9   ri   want_methodru   )r   r-   objr   r   r   pytest_pycollect_makeitem   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   )rl   argnameparamsr   r   r   rn          z$_parametrize_cls.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )rl   	_sa_paramr   r   r   rn      r   z*need argnames for class-based combinationsz,\s*rf   c                 s   s4    | ]}|j d D ]}ttdd|V  q
qdS )-z\W N)idsplitstrresub)rl   paramtokenr   r   r   rp      s    
z#_parametrize_cls.<locals>.<genexpr>z%s_%s)__dict__r   	itertoolsproductzip	TypeErrorr   r   r   joinr   type__new__setattrry   )rv   ru   r   classesfull_param_setcls_variablesr   r   argname_splitargvalparametrized_namer-   newclsr   r   r   r      s2   


r   c                    sR   t  tjsd S td u r#t jj  jja fdd} jj| t  d S )Nc                      s   t  jj d ad S r
   )class_teardownrh   _current_classr   rq   r   r   finalize  s   z&pytest_runtest_setup.<locals>.finalize)rg   r9   Functionr   class_setuprh   addfinalizer
test_setup)rm   r   r   rq   r   pytest_runtest_setup  s   r   c                 C   s   t |  d S r
   )test_teardownrq   r   r   r   pytest_runtest_teardown   s   r   c                 C   s    t | | jjj| jj| j d S r
   )r   before_testrh   rv   r   ru   r-   rq   r   r   r   r   (  s   r   c                 C   s   t |  d S r
   )r   
after_testrq   r   r   r   r   .  s   r   c                 C      t | j d S r
   )r   start_test_classru   rq   r   r   r   r   2     r   c                 C   r   r
   )r   stop_test_classru   rq   r   r   r   r   6  r   r   c                 C   s    t jjdkrt| S t| S )N   )sysversion_infomajorr   getfullargspec
getargspec)fnr   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_envG  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|_|S )	Ntargetr   )r   r   r-   F)groupedzDdef %(name)s(%(args)s):
    return %(target)s(%(fn)s, %(apply_kw)s)
)r   r   im_func)
argsrz   dictr   updaterG   __defaults____wrapped__r   r   )r   add_positional_parametersspecmetadatar   	decoratedr   r   r   r   r   r   decorateK  s&   
z&_pytest_fn_decorator.<locals>.decorateN)r   )sqlalchemy.util.langhelpersr   sqlalchemy.util.compatr   )r   r   r   r   r   _pytest_fn_decoratorA  s
   r   c                   @   sL   e Zd Zdd Zdd eeeddZdd Z	d	d
 Z
dd Zdd ZdS )rI   c                 O   s   t jj|i |S r
   )r9   skip	Exceptionr   r   r.   r   r   r   skip_test_exceptionm  s   z*PytestFixtureFunctions.skip_test_exceptionc                 C   s   | S r
   r   )r   r   r   r   re   q  s    zPytestFixtureFunctions.<lambda>r   )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.paramtrize.

        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
   )rg   compoundry   )r   result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   rl   idxcharr   r   r   rn     s
    z7PytestFixtureFunctions.combinations.<locals>.<listcomp>c                    s*   g | ]\}}| v rt | | fqS r   )operator
itemgetterr   )_combination_id_fnsr   r   rn     s
    Tr   c                 3   s     | ]\}}|| V  qd S r
   r   )rl   gettercomb_fn)r   r   r   rp     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   add)r   r   r.   r   exlur   r   r   check_exclusions  s
   zOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.check_exclusionsc                 S   s   | j d d S )Nr   )r   ry   )r   r   r   r   process_metadata  r   zOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.process_metadata)r   )r   )r   r   NotImplementedErrorr   r   ry   r   r   r   r   r   r9   markparametrize)r   	_argnamesr   r   )r   r   has_exclusionspytest_paramsr   r   r     s.   


z5PytestFixtureFunctions.combinations.<locals>.decorate)r[   r   r   r   r   lenr;   rd   r)   r   r   r   	enumeraterg   tuplery   r   r9   r   )r   arg_setsr.   r   r   tobuild_pytest_params_arg_getterfns	fn_paramsparam_exclusions
parametersr   r   r   )r   r   r   r   r  r  r   combinationsw  sr   	



&z#PytestFixtureFunctions.combinationsc                 G   s    |d }t j|dd  d|iS )Nr   r   r   )r9   r   )r   r  identr   r   r   param_ident  s   z"PytestFixtureFunctions.param_identc                 O   s   t j|i |S r
   )r9   fixturer   r   r   r   r    r   zPytestFixtureFunctions.fixturec                 C   s   t jdS )NPYTEST_CURRENT_TEST)r@   environget)r   r   r   r   get_current_test_name	  rQ   z,PytestFixtureFunctions.get_current_test_nameN)r   r   r   r   reprr   r   
attrgetterr   r  r  r  r  r   r   r   r   rI   l  s     rI   ))sqla_plugin_baser   ImportErrorr   r*   rb   	functoolsr   r   r   r   r@   r   r   r9   typingTYPE_CHECKINGr   xdist	has_xdistr5   rK   rP   rS   rX   r^   ra   r   r   r   r   r   r   r   r   r   r   r   r   FixtureFunctionsrI   r   r   r   r   <module>   sb    2<#+