U
    x^3                     @   sF  zd dl ZW n  ek
r,   ddlmZ Y nX 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d dlZzd dlZdZW n ek
r   dZY nX 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 G d&d' d'ej!Z"dS )(    N   )plugin_baseTFc                    s,   |  d  fdd}t| t  d S )NZ
sqlalchemyc                    sp   | dd r.G fdddtj  |d< | dd r^G  fdddtj  |d< j| f| d S )Ncallbackc                       s   e Zd Zd fdd	ZdS )=pytest_addoption.<locals>.make_option.<locals>.CallableActionNc                    s    ||| d S N selfparser	namespacevaluesoption_string	callback_r   N/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/testing/plugin/pytestplugin.py__call__$   s    Fpytest_addoption.<locals>.make_option.<locals>.CallableAction.__call__)N)__name__
__module____qualname__r   r   r   r   r   CallableAction#   s    r   actionzeroarg_callbackc                       s.   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!   /   s    
zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__init__c                    s    ||| d S r   r   r   )r   r   r   r   A   s    r   )FFN)N)r   r   r   r!   r   __classcell__r   )r   r   )r"   r   r   .   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    
+
r,   c                 C   s   t d t| dr2t| j t| jd  n&| jjrXt	j
| jjrXt	| jj t| j ttt| jdd tt d S )Nzsqlalchemy.testing.assertions
slaveinputfollower_identZ
cov_sourceF)pytestZregister_assert_rewritehasattrr   Z!restore_important_follower_configr-   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_configureN   s    

r:   c                 C   s   t   d S r   )r   Z
post_beginsessionr   r   r   pytest_sessionstartc   s    r=   c                 C   s   t   d S r   )r   Zfinal_process_cleanupr;   r   r   r   pytest_sessionfinishg   s    r>   c                 C   sH   t | j dt jdd  | jd< ddlm} || jd  d S )Nztest_%sr      r.   	provision)	r   Z!memoize_important_follower_configr-   uuidZuuid4hexsqlalchemy.testingrA   Zcreate_follower_db)noderA   r   r   r   pytest_configure_noden   s    rF   c                 C   s    ddl m} || jd  d S )Nr   r@   r.   )rD   rA   Zdrop_follower_dbr-   )rE   errorrA   r   r   r   pytest_testnodedowny   s    rH   c                 C   s  t dd }dd |D |d d < tdd |D }|D ]l}t|j|jjD ]T}||jk	rP||j }tj	|j
|jjd D ]"}| D ]}	||	j |	 qqqPq:g }
|D ]4}|jj|kr|
||jj |j  q|
| qt|
dd d	|d d < d S )
Nc                   S   s
   t tS r   )collectionsdefaultdictlistr   r   r   r   <lambda>       z/pytest_collection_modifyitems.<locals>.<lambda>c                 S   s.   g | ]&}t |jtjr|jjjd s|qS )_)
isinstanceparentr/   Instancer'   
startswith.0itemr   r   r   
<listcomp>   s   z1pytest_collection_modifyitems.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S r   rP   rS   r   r   r   	<genexpr>   s     z0pytest_collection_modifyitems.<locals>.<genexpr>rW   c                 S   s   | j j j j| j j j| jfS r   )rP   r'   rU   r   r   r   rL      s    
)key)rI   rJ   setr   Zgenerate_sub_testsclsrP   moduler/   Classr   Zcollectr'   appendextendsorted)r<   r9   itemsZrebuilt_itemsZtest_classesZ
test_classZsub_clsZper_cls_dictinsttZnewitemsrU   r   r   r   pytest_collection_modifyitems   s:     

 re   c                    s`   t |r0t||r0 fddt j|D S t |rXt tj	rXt
 j|rXd S g S d S )Nc                    s   g | ]}t j|j d qS )rW   )r/   r^   r   )rT   Zparametrize_cls	collectorr   r   rV      s   z-pytest_pycollect_makeitem.<locals>.<listcomp>)inspectisclassr   Z
want_class_parametrize_clsr]   
isfunctionrO   r/   rQ   Zwant_methodr\   )rg   r'   objr   rf   r   pytest_pycollect_makeitem   s    


rm   c                 C   s   d|j kr|gS |j}g }tjdd |D  D ]}i }tdd |D |D ]>\}}|s^tdtd|}t||jD ]\}	}
|
||	< qvqJd	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   )rT   argnameparamsr   r   r   rV      s     z$_parametrize_cls.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r   )rT   Z	_sa_paramr   r   r   rV      s     z*need argnames for class-based combinationsz,\s*rN   c                 s   s2   | ]*}|j d D ]}ttdd|V  qqdS )-z\W N)idsplitstrresub)rT   paramtokenr   r   r   rX      s    z#_parametrize_cls.<locals>.<genexpr>z%s_%s)__dict__rn   	itertoolsproductzip	TypeErrorrv   rt   r   joinr   type__new__setattrr_   )r]   r\   rn   classesZfull_param_setZcls_variablesro   rx   Zargname_splitargvalZparametrized_namer'   Znewclsr   r   r   rj      s2    
 
rj   c                    sR   t  tjsd S td krFt jj  jja fdd} jj| t  d S )Nc                      s   t  jj d ad S r   )class_teardownrP   _current_classr   rY   r   r   finalize  s    z&pytest_runtest_setup.<locals>.finalize)rO   r/   ZFunctionr   class_setuprP   Zaddfinalizer
test_setup)rU   r   r   rY   r   pytest_runtest_setup   s    r   c                 C   s   t |  d S r   )test_teardownrY   r   r   r   pytest_runtest_teardown  s    r   c                 C   s    t | | jjj| jj| j d S r   )r   Zbefore_testrP   r]   r   r\   r'   rY   r   r   r   r     s       r   c                 C   s   t |  d S r   )r   Z
after_testrY   r   r   r   r     s    r   c                 C   s   t | j d S r   )r   Zstart_test_classr\   rY   r   r   r   r     s    r   c                 C   s   t | j d S r   )r   Zstop_test_classr\   rY   r   r   r   r   !  s    r   c                 C   s$   t jjdkrt| S t| S d S )N   )sysversion_infomajorrh   getfullargspec
getargspec)fnr   r   r   r   %  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 )r8   c                 O   s   t jj||S r   )r/   skip	Exceptionr	   r   r(   r   r   r   skip_test_exception-  s    z*PytestFixtureFunctions.skip_test_exceptionc                 C   s   | S r   r   )rl   r   r   r   rL   1  rM   zPytestFixtureFunctions.<lambda>r   )irsnc                    s  ddl m tjjdkr@tdkrftd drftd n&tdkrftd drftd |ddg fd	d
|dd}|r| j	t
jddd t|D   fddt|D  fdddd D D nfdddd D D 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                    sP   g  g }| D ]&}t |jr(|| q | q fdd|D   S )Nc                    s   g | ]}| fqS r   r   )rT   	exclusionresultr   r   rV   W  s     zSPytestFixtureFunctions.combinations.<locals>._filter_exclusions.<locals>.<listcomp>)rO   Zcompoundr_   r`   )argsZgathered_exclusionsa)exclusion_combinationsr   r   r   _filter_exclusionsM  s    z?PytestFixtureFunctions.combinations.<locals>._filter_exclusionsid_c                 S   s   g | ]\}}|d kr|qS ))r   r   r   r   r   rT   idxcharr   r   r   rV   e  s   z7PytestFixtureFunctions.combinations.<locals>.<listcomp>c                    s*   g | ]"\}}| krt | | fqS r   )operator
itemgetterr   )_combination_id_fnsr   r   rV   k  s   c              
      s@   g | ]8 t j d d dd fddD iqS )r   Nrs   rq   c                 3   s   | ]\}}|| V  qd S r   r   )rT   getterZcomb_fnr   r   r   rX   t  s    zAPytestFixtureFunctions.combinations.<locals>.<listcomp>.<genexpr>)r/   rx   r   )rT   )_arg_getterr   fnsr   r   rV   q  s   c                 S   s    g | ]}t |ts|fn|qS r   rO   tuplerT   r   r   r   r   rV   x  s   c                    s   g | ]}t j | qS r   r/   rx   r   )r   r   r   rV     s   c                 S   s    g | ]}t |ts|fn|qS r   r   r   r   r   r   rV     s   c                    s   t | r.d| jkrg | _| j f | S d krJt| jdd  }n}rD ]0\}}dd t||D }|jf |}|| } qVt	j
| | S d S )Nrn   r   c                 S   s   i | ]\}}||qS r   r   )rT   ro   r   r   r   r   
<dictcomp>  s    zIPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.<dictcomp>)rh   ri   rz   rn   r_   r   r   r}   Zwith_combinationr/   markZparametrize)r   Z	_argnamesr   ZcombinationZcombination_by_kw)arg_setsr   r   r   r   decorate  s$    


z5PytestFixtureFunctions.combinations.<locals>.decorate)r   )rD   r   r   r   r   lenr0   rK   r$   r   r   r   	enumerate)r	   r   r(   r   r   r   )r   r   r   r   r   r   r   r   r   combinations7  sD    	 

z#PytestFixtureFunctions.combinationsc                 G   s    |d }t j|dd  d|iS )Nr   r   rs   r   )r	   
parametersidentr   r   r   param_ident  s    z"PytestFixtureFunctions.param_identc                 O   s   t j||S r   )r/   fixturer   r   r   r   r     s    zPytestFixtureFunctions.fixturec                 C   s   t jdS )NZPYTEST_CURRENT_TEST)r2   environget)r	   r   r   r   get_current_test_name  s    z,PytestFixtureFunctions.get_current_test_nameN)r   r   r   r   reprru   r   
attrgetterr   r   r   r   r   r   r   r   r   r8   ,  s   lr8   )#Zsqla_plugin_baser   ImportErrorrr   r%   rI   rh   r{   r   r2   rv   r   r/   ZxdistZ	has_xdistr,   r:   r=   r>   rB   rF   rH   re   rm   r   rj   r   r   r   r   r   r   r   ZFixtureFunctionsr8   r   r   r   r   <module>   sJ   
27#