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   h/var/www/html/ecg_monitoring/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rd	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rd 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|\}}	|	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   __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