B
    \w                 @   s  y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y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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 )z=pytest_addoption.<locals>.make_option.<locals>.CallableActionNc                s    ||| d S )N )selfparser	namespacevaluesoption_string)	callback_r   Elib/python3.7/site-packages/sqlalchemy/testing/plugin/pytestplugin.py__call__    s    zFpytest_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 )	z=pytest_addoption.<locals>.make_option.<locals>.CallableActionFNc          	      s"   t  | j||dd|||d d S )Nr   T)option_stringsdestnargsZ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 )Nr   )r   r   r   r	   r
   )r   r   r   r   =   s    zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__call__)FFN)N)r   r   r   r   r   __classcell__r   )r   r   )r   r   r   *   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   t | dr(t| j t| jd  n&| jjrNtj	| jjrNt
| jj t| j ttt| jdd ttjj d S )N
slaveinputfollower_identZ
cov_sourceF)hasattrr   Z!restore_important_follower_configr%   Zconfigure_followerZoptionZwrite_identsospathexistsremoveZ	pre_beginZset_coverage_flagboolgetattrZset_skip_testpytestskip	Exception)configr   r   r   pytest_configureJ   s    

r2   c             C   s   t   d S )N)r   Z
post_begin)sessionr   r   r   pytest_sessionstart]   s    r4   c             C   s   t   d S )N)r   Zfinal_process_cleanup)r3   r   r   r   pytest_sessionfinisha   s    r5   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.testingr7   Zcreate_follower_db)noder7   r   r   r   pytest_configure_nodeh   s    r<   c             C   s    ddl m} || jd  d S )Nr   )r7   r&   )r:   r7   Zdrop_follower_dbr%   )r;   errorr7   r   r   r   pytest_testnodedowns   s    r>   c             C   s  t t}dd |D |d d < tdd |D }xl|D ]d}x^t|j|jjD ]H}||jk	rP||j }x.t	j
|j|jjd D ]}||  qW qPW q8W g }	xJ|D ]B}
|
jj|kr|	||
jj  g ||
jj d d < q|	|
 qW t|	dd d|d d < d S )	Nc             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 )N)rA   )rD   rE   r   r   r   	<genexpr>   s    z0pytest_collection_modifyitems.<locals>.<genexpr>)rA   c             S   s   | j j j j| j j j| jfS )N)rA   r    )rE   r   r   r   <lambda>   s    
z/pytest_collection_modifyitems.<locals>.<lambda>)key)collectionsdefaultdictlistsetr   Zgenerate_sub_testsclsrA   moduler.   Classr   Zcollectextendappendsorted)r3   r1   itemsZrebuilt_itemsZtest_classesZ
test_classZsub_clsZlist_ZinstnewitemsrE   r   r   r   pytest_collection_modifyitemsy   s*    




rV   c             C   s\   t |r"t|r"tj|| dS t |rTt| tjrTt	| j
|rTtj|| dS g S d S )N)rA   )inspectZisclassr   Z
want_classr.   rP   Z
isfunctionr@   rB   Zwant_methodrN   Function)Z	collectorr    objr   r   r   pytest_pycollect_makeitem   s    
rZ   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 )N)class_teardownrA   _current_classr   )rE   r   r   finalize   s    z&pytest_runtest_setup.<locals>.finalize)r@   r.   rX   r\   class_setuprA   Zaddfinalizer
test_setup)rE   r]   r   )rE   r   pytest_runtest_setup   s    r`   c             C   s   t |  d S )N)test_teardown)rE   r   r   r   pytest_runtest_teardown   s    rb   c             C   s    t | | jjj| jj| j d S )N)r   Zbefore_testrA   rO   r   rN   r    )rE   r   r   r   r_      s    r_   c             C   s   t |  d S )N)r   Z
after_test)rE   r   r   r   ra      s    ra   c             C   s   t | j d S )N)r   Zstart_test_classrN   )rE   r   r   r   r^      s    r^   c             C   s   t | j d S )N)r   Zstop_test_classrN   )rE   r   r   r   r[      s    r[   )Zsqla_plugin_baser   ImportError r   rJ   rW   r(   r.   ZxdistZ	has_xdistr$   r2   r4   r5   r8   r<   r>   rV   rZ   r\   r`   rb   r_   ra   r^   r[   r   r   r   r   <module>   s<   
23