o
    [h>                     @   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 )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valuesoption_string	callback_r
   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/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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   

+r0   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workerinputfollower_identZ
cov_sourceF)pytestZregister_assert_rewritehasattrr   Z!restore_important_follower_configr1   Zconfigure_followeroptionZwrite_identsospathexistsremoveZ	pre_beginZset_coverage_flagboolgetattrZset_fixture_functionsPytestFixtureFunctions)configr
   r
   r   pytest_configureV   s   

r>   c                 C      t   d S r	   )r   Z
post_beginsessionr
   r
   r   pytest_sessionstartk      rB   c                 C   r?   r	   )r   Zfinal_process_cleanupr@   r
   r
   r   pytest_sessionfinisho   rC   rD   c                 C   sH   t | j dt jdd  | jd< ddlm} || jd  d S )Nztest_%sr      r2   	provision)	r   Z!memoize_important_follower_configr1   uuiduuid4hexsqlalchemy.testingrG   Zcreate_follower_db)noderG   r
   r
   r   pytest_configure_nodev   s   rM   c                 C   s    ddl m} || jd  d S )Nr   rF   r2   )rK   rG   Zdrop_follower_dbr1   )rL   errorrG   r
   r
   r   pytest_testnodedown   s   rO   c                 C   s  t dd }dd |D |d d < tdd |D }|D ]=}t|j|jjD ]1}||jurY||j }tt	j
dt	j
}||j|jjd D ]}	|	 D ]
}
||
j |
 qMqGq(qg }|D ]}|jj|v rt|||jj |j  q_|| q_t|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parentr3   Instancer+   
startswith.0itemr
   r
   r   
<listcomp>   s    z1pytest_collection_modifyitems.<locals>.<listcomp>c                 s   s    | ]}|j V  qd S r	   )rV   rY   r
   r
   r   	<genexpr>   s    z0pytest_collection_modifyitems.<locals>.<genexpr>from_parentr+   rV   c                 S   s   | j j j j| j j j| jfS r	   )rV   r+   r[   r
   r
   r   rS      s   
)key)rP   rQ   setr   Zgenerate_sub_testsclsrV   moduler;   r3   Classr   Zcollectr+   appendextendsorted)rA   r=   itemsZrebuilt_itemsZtest_classesZ
test_classZsub_clsZper_cls_dictctorinsttZnewitemsr[   r
   r
   r   pytest_collection_modifyitems   sB   



rm   c                    sn   t |r!t||r!ttjdtj fddt j|D S t 	|r5t
 tjr5t j|r5d S g S )Nr^   c                    s   g | ]	}|j  d qS )r_   )r   )rZ   Zparametrize_cls	collectorrj   r
   r   r\      s    z-pytest_pycollect_makeitem.<locals>.<listcomp>)inspectisclassr   Z
want_classr;   r3   re   _parametrize_clsrd   
isfunctionrU   rW   Zwant_methodrc   )ro   r+   objr
   rn   r   pytest_pycollect_makeitem   s   

ru   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
   )rZ   argnameparamsr
   r
   r   r\          z$_parametrize_cls.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r
   )rZ   Z	_sa_paramr
   r
   r   r\      ry   z*need argnames for class-based combinationsz,\s*rT   c                 s   s4    | ]}|j d D ]}ttdd|V  q
qdS )-z\W N)idsplitstrresub)rZ   paramtokenr
   r
   r   r]      s    
z#_parametrize_cls.<locals>.<genexpr>z%s_%s)__dict__rv   	itertoolsproductzip	TypeErrorr   r}   r   joinr   type__new__setattrrf   )rd   rc   rv   classesZfull_param_setZcls_variablesrw   r   Zargname_splitargvalZparametrized_namer+   Znewclsr
   r
   r   rr      s2   


rr   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_teardownrV   _current_classr
   r`   r
   r   finalize  s   z&pytest_runtest_setup.<locals>.finalize)rU   r3   Functionr   class_setuprV   Zaddfinalizer
test_setup)r[   r   r
   r`   r   pytest_runtest_setup   s   r   c                 C   s   t |  d S r	   )test_teardownr`   r
   r
   r   pytest_runtest_teardown  s   r   c                 C   s    t | | jjj| jj| j d S r	   )r   Zbefore_testrV   rd   r   rc   r+   r`   r
   r
   r   r   !  s   r   c                 C   s   t |  d S r	   )r   Z
after_testr`   r
   r
   r   r   '  s   r   c                 C      t | j d S r	   )r   Zstart_test_classrc   r`   r
   r
   r   r   +     r   c                 C   r   r	   )r   Zstop_test_classrc   r`   r
   r
   r   r   /  r   r   c                 C   s    t jjdkrt| S t| S )N   )sysversion_infomajorrp   getfullargspec
getargspec)fnr
   r
   r   r   3  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|_|S )	Ntargetr   )r   r   r+   F)groupedzDdef %(name)s(%(args)s):
    return %(target)s(%(fn)s, %(apply_kw)s)
)r   r   Zim_func)
argsrg   dictr   updater;   __defaults____wrapped__r   r   )r   add_positional_parametersspecmetadatar   Z	decoratedr   r   r   r   r
   r   decorateD  s&   
z&_pytest_fn_decorator.<locals>.decorateN)r
   )Zsqlalchemy.util.langhelpersr   Zsqlalchemy.util.compatr   )r   r   r
   r   r   _pytest_fn_decorator:  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 )r<   c                 O   s   t jj|i |S r	   )r3   skip	Exceptionr   r   r,   r
   r
   r   skip_test_exceptionf  s   z*PytestFixtureFunctions.skip_test_exceptionc                 C   s   | S r	   r
   )rt   r
   r
   r   rS   j  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.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	   )rU   compoundrf   )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
   rZ   idxcharr
   r
   r   r\     s
    z7PytestFixtureFunctions.combinations.<locals>.<listcomp>c                    s*   g | ]\}}| v rt | | fqS r
   )operator
itemgetterr   )_combination_id_fnsr
   r   r\     s
    Trz   c                 3   s     | ]\}}|| V  qd S r	   r
   )rZ   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  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 combinationsrv   r   z, *_exclusionsc                    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_exclusionsc                 S   s   | j d d S )Nr   )r   rf   )r   r
   r
   r   process_metadata  r   zOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.process_metadata)r   )r   )rp   rq   NotImplementedErrorr   rv   rf   r   r   r   r}   r   r3   markZparametrize)r   Z	_argnamesr   r   )r   r   has_exclusionspytest_paramsr
   r   r     s.   


z5PytestFixtureFunctions.combinations.<locals>.decorate)rK   r   r   r   r   lenr4   rR   r(   r   r   r   	enumeraterU   tuplerf   r   r3   r   )r   Zarg_setsr,   r   r   Ztobuild_pytest_paramsZ_arg_getterZfnsZ	fn_paramsZparam_exclusions
parametersr   r   r
   )r   r   r   r   r   r   r   combinationsp  sr   	



&z#PytestFixtureFunctions.combinationsc                 G   s    |d }t j|dd  d|iS )Nr   r   r|   )r3   r   )r   r   identr
   r
   r   param_ident  s   z"PytestFixtureFunctions.param_identc                 O   s   t j|i |S r	   )r3   fixturer   r
   r
   r   r     r   zPytestFixtureFunctions.fixturec                 C   s   t jdS )NZPYTEST_CURRENT_TEST)r6   environget)r   r
   r
   r   get_current_test_name  rC   z,PytestFixtureFunctions.get_current_test_nameN)r   r   r   r   reprr~   r   
attrgetterr   r   r   r   r   r
   r
   r
   r   r<   e  s     r<   ))Zsqla_plugin_baser   ImportErrorr{   r)   rP   	functoolsr   rp   r   r   r6   r   r   r3   typingTYPE_CHECKINGr   ZxdistZ	has_xdistr0   r>   rB   rD   rH   rM   rO   rm   ru   r   rr   r   r   r   r   r   r   r   r   ZFixtureFunctionsr<   r
   r
   r
   r   <module>   sb    29#+