
    +hf                     L   	 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	d dl
Z
d dlZd dlZd dlZd dlZd dlZej                   dk  Zer	 d dlZd Zd Zd	a ej.                  d
      d        Zd Zd Zd Z G d de      Zd Zd Zd Z d%dZ!d Z"da#d Z$ ejJ                  d
      d        Z&d Z'da(d Z) ej.                  d      d        Z* ej.                  d      d         Z+d! Z,d" Z- G d# d$ej\                        Z/y# e$ r
 ddlmZ Y w xY w# e$ r	 ddlmZ Y w xY w)&    N   )plugin_base)update_wrapper)   r   )reinvent_fixtures_py2kc                     | j                  d      fd}t        j                  |       t        j                          y )N
sqlalchemyc                    |j                  dd       r  G fddt        j                        |d<   |j                  dd       r! G fddt        j                        |d<    j                  | fi | y )Ncallbackc                       e Zd Z	 d fd	Zy)=pytest_addoption.<locals>.make_option.<locals>.CallableActionNc                      |||       y N )selfparser	namespacevaluesoption_string	callback_s        Y/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/pytestplugin.py__call__zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__call__&   s     mVV<    r   )__name__
__module____qualname__r   )r   s   r   CallableActionr   %   s    CG=r   r   actionzeroarg_callbackc                   8     e Zd Z	 	 	 d fd	Z	 dfd	Z xZS )r   c           	      2    t         |   ||dd|||       y )Nr   T)option_stringsdestnargsconstdefaultrequiredhelp)super__init__)r   r"   r#   r&   r'   r(   r   	__class__s         r   r*   zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__init__1   s.     .$8'5!" '!)! 9 r   c                      |||       y r   r   )r   r   r   r   r   r   s        r   r   zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__call__C   s     %]FFCr   )FFNr   )r   r   r   r*   r   __classcell__)r+   r   r   s   @r   r   z=pytest_addoption.<locals>.make_option.<locals>.CallableAction0   s&    
 ""& DHD Dr   )popargparseAction	addoption)namekwr   r   r   groups     @@@r   make_optionz%pytest_addoption.<locals>.make_option!   sv    FF:t,	= = *BxL66"4d;D D0 *BxL##r   )getgroupr   setup_optionsread_config)r   r5   r4   s     @r   pytest_addoptionr9      s3    OOL)E)$V k*r   c           	         | j                   j                  d      r#| j                   j                  t                      t	        | d      rBt        j                  | j                         t        j                  | j                  d          nr| j                  j                  r\t        j                  j                  | j                  j                        r)t        j                  | j                  j                         t        j                  | j                         t        j                   t#        t%        | j                  dd                   t        j&                  t(               | j                  j*                  rday y )Nxdistworkerinputfollower_ident
cov_sourceFT)pluginmanager	haspluginregister
XDistHookshasattrr   !restore_important_follower_configr<   configure_followeroptionwrite_identsospathexistsremove	pre_beginset_coverage_flagboolgetattrset_fixture_functionsPytestFixtureFunctionsdump_pyannotateDUMP_PYANNOTATEconfigs    r   pytest_configurerV   P   s   %%g.%%jl3v}%55f6H6HI&&v'9'9:J'KL==%%"''..MM&&+
 IIfmm001&--(!!WV]]L%89 %%&<=}}$$ %r   FT)autousec               #   z   K   t         rddlm}  | j                          d  t         r j	                          y y w)Nr   collect_types)rS   pyannotate_runtimerZ   startstoprY   s    r   collect_types_fixturer^   m   s/     4	 s   9;c                 N    ddl m} |j                  t        j                         y Nr   asyncio)sqlalchemy.testingrb   _assume_asyncr   
post_begin)sessionrb   s     r   pytest_sessionstartrg   x   s    *+001r   c                     ddl m} |j                  t        j                         | j
                  j                  j                  r6ddlm	} |j                  | j
                  j                  j                         y y )Nr   ra   rY   )rc   rb   _maybe_async_provisioningr   final_process_cleanuprU   rF   rR   r[   rZ   
dump_stats)rf   rb   rZ   s      r   pytest_sessionfinishrl   ~   sR    *%%k&G&GH~~,,4  !6!6!F!FG -r   c                     | j                   j                  j                  r=ddlm} t
        j                  j                  d      fd}|j                  |       y y )Nr   rY   lib/sqlalchemyc                     t         j                  j                  t         j                  j                  |             } dt         j                  j	                  | g      vry d| v ry | S )Nrn   testing)rH   rI   normpathabspath
commonpath)filenamelib_sqlalchemys    r   _filterz)pytest_collection_finish.<locals>._filter   sZ    ww''(ABHrww'9'9>*(  H$Or   )filter_filename)	rU   rF   rR   r[   rZ   rH   rI   rr   init_types_collection)rf   rZ   rv   ru   s      @r   pytest_collection_finishry      sI    ~~,,4)9:		 	++G+D! -r   c                       e Zd Zd Zd Zy)rB   c                    ddl m} ddl m} t        j                  |j
                         dt        j                         j                  dd z  |j
                  d<   |j                  |j                  |j
                  d          y )Nr   	provisionra   ztest_%s   r=   )rc   r}   rb   r   !memoize_important_follower_configr<   uuiduuid4hexri   create_follower_db)r   noder}   rb   s       r   pytest_configure_nodez XDistHooks.pytest_configure_node   sl    0.
 	55d6F6FG-69I9I!B9O-O)*))(($*:*:;K*L	
r   c                 n    ddl m} ddl m} |j                  |j                  |j
                  d          y )Nr   r|   ra   r=   )rc   r}   rb   ri   drop_follower_dbr<   )r   r   errorr}   rb   s        r   pytest_testnodedownzXDistHooks.pytest_testnodedown   s-    0.))&&(8(89I(J	
r   N)r   r   r   r   r   r   r   r   rB   rB      s    

r   rB   c                 |  	
 ddl m} t        j                  d       	|D cg c][  }|j	                  t
        j                        :|j	                  t
        j                        j                  j                  d      s|] c}|d d  t        d |D              
fd	
fd}|j                  |       g }|D ]E  }|j                  }|	v r"|j                  	|   |j                            5|j                  |       G t        r|D ]  }t        j                   |        t#        |d 	      |d d  y c c}w )
Nr   ra   c                  4    t        j                  t              S r   )collectionsdefaultdictlistr   r   r   <lambda>z/pytest_collection_modifyitems.<locals>.<lambda>   s    ''- r   _c              3   Z   K   | ]#  }|j                  t        j                         % y wr   )	getparentpytestClass).0items     r   	<genexpr>z0pytest_collection_modifyitems.<locals>.<genexpr>   s     Ft~~fll3Fs   )+c              3      K   | j                         D ]2  }t        |t        j                        r |      D ]  }|  /| 4 y wr   )collect
isinstancer   	Collector)element
inst_or_fnelr   s      r   r   z.pytest_collection_modifyitems.<locals>.collect   sN     !//+ 	!J*f&6&67!*- BH ! 	!s   AA
c                     D ]  } t        j                  | j                  | j                        D ]  }|| j                  us| j                     }t	        t
        j                  dt
        j                        }| j                  t
        j                        }  ||j                  |            D ]   }||j                     j                  |       "   y )Nfrom_parentr2   parent)r   generate_sub_testsclsmodulerO   r   r   r   Moduler   r2   append)	
test_classsub_clsper_cls_dictctorr   fnr   rebuilt_itemstest_classess	         r   setup_test_classesz9pytest_collection_modifyitems.<locals>.setup_test_classes   s    & 	9J&99
 1 1 9 *..0#0#@L #6<<MD'11&--@F%'"2"26B 9 %RWW-44R899	9r   c                     | j                  t        j                        j                  | j                  t        j                        j                  | j                  fS r   )r   r   r   r2   r   )r   s    r   r   z/pytest_collection_modifyitems.<locals>.<lambda>   s<    NN6==)..NN6<<(--II
 r   )key)rc   rb   r   r   r   r   r   r2   
startswithsetri   r   extendr   py2kr   "scan_for_fixtures_to_use_for_classsorted)rf   rU   itemsrb   r   r   newitemscls_r   r   r   s           @@@r   pytest_collection_modifyitemsr      s'    +++-M >>&,,'3v||,11<<SA 	E!H FFFL!9$ %%&89H "xx= OOM$/		:;OOD!"  	LD"EEdK	L
 
E!His   A D9c                    t        j                  |      rt        j                  ||      r|ddlm} |j                  rt        |      }t        t        j                  dt        j                        }t        | j                  |      D cg c]  } ||j                  |        c}S t        j                  |      r-| j                  !t        j                   | j                  |      ry g S c c}w )Nr   rT   r   r   )inspectisclassr   
want_classrc   rU   	any_async_apply_maybe_asyncrO   r   r   _parametrize_clsr   r   
isfunctionr   want_method)	collectorr2   objrU   r   parametrize_clss         r   pytest_pycollect_makeitemr     s    s 6 6tS A-$S)Cv||]FLLA $4I4D4Dc#J
 o..yA
 	

 	3MM%##IMM37  	
s   
C,c                 v    t        | d      r| j                  } t        | d      rt        j                  |       S )N__wrapped__)rC   r   r   iscoroutinefunctionr   s    r   _is_wrapped_coroutine_functionr     s4    
"m
$^^ "m
$ &&r**r   c                    ddl m t        |       j                         D ]  \  }}t	        |      st        |t              s"t        |dd      r0|j                  d      sBt        |      rNd}t        |t              r|j                  }d}t        fd       } ||      }|rt        |      }d|_        t        | ||        |r.| j                         dd  D ]  }|t        k7  st!        |d        | S )	Nr   ra   _maybe_async_appliedFtest_Tc                 0     j                   | g|i |S r   )_maybe_asyncr   argskwargsrb   s      r   
make_asyncz&_apply_maybe_async.<locals>.make_async5  s     +w++B@@@@r   r   )rc   rb   varsr   callabler   classmethodrO   r   r   __func___pytest_fn_decoratorr   setattrmroobjectr   )	r   recurser2   valueis_classmethodr   do_asyncr   rb   s	           @r   r   r   &  s    *Cy( )ee_
5+ >E#95A)259"N%-!%!A "A "%(H&x0,0H)Cx(+), 779QR= 	/Cf}"3.	/ Jr   c                 P   d|j                   vr|gS |j                  }g }t        j                  |D cg c]  \  }}|	 c}} D ]  }i }t	        |D cg c]  }|d   	 c}|      D ]K  \  }}	|st        d      t        j                  d|      }
t	        |
|	j                        D ]
  \  }}|||<    M dj                  d |D              }|j                  d|}t        j                  t        ||f|      }t        | ||       |j                  |        |S c c}}w c c}w )z6implement a class-based version of pytest parametrize._sa_parametrizer   z*need argnames for class-based combinationsz,\s*r   c           	   3      K   | ]D  }|j                   j                  d       D ]$  }t        t        j                  dd|             & F yw)-z\W N)idsplitstrresub)r   paramtokens      r   r   z#_parametrize_cls.<locals>.<genexpr>[  sP      %
 ,%

  ub%()%
 *%
s   A
A)__dict__r   	itertoolsproductzip	TypeErrorr   r   r   joinr   type__new__r   r   )r   r   r   classesargnameparamsfull_param_setcls_variables	_sa_paramr   argname_splitargvalparametrized_namer2   newclss                   r   r   r   F  s?    ,u))OG#++(7	8_Wf&	8  !+:;iYq\;^
 	)NGU  LMMHHWg6Mu||< )S%(c")	)  HH %
 (	%
 
 ,,(9:dD3&-@f%v/0 N/ 
9
 <s   D
D#
c                     ddl m} t        | t        j                        rQt
        J|j                  t        j                  | j                         | j                  t        j                        ay y y r`   )rc   rb   r   r   Function_current_classri   r   !start_test_class_outside_fixturesr   r   r   r   rb   s     r   pytest_runtest_setupr  l  sU    * $(^-C))99HH	
 5 .D(r   )hookwrapperc              #     K   ddl m} ddlm} |j	                  t
        j                  |        d  t        X|%|j                  t        j                        t        ur0d a	 |j                  t
        j                  | j                         d ay y y # t        $ r}t        j                   r|j"                  sdt        j$                  z   f|_         |j"                  d   r]t'        |j"                  d   |      rDt)        |j"                        }|dxx   dt        j$                  z   z  cc<   t+        |      |_         |xj"                  dt        j$                  fz  c_         d }~ww xY w# d aw xY ww)Nr   ra   )string_typesz__Original test failure__:
z
__Original test failure__:
z__Original test failure__)rc   rb   sqlalchemy.utilr
  r   r   
after_testr  r   r   r   ri    stop_test_class_outside_fixturesr   	Exception_current_reportfailedr   longreprtextr   r   tuple)r   nextitemrb   r
  er   s         r   pytest_runtest_teardownr    sQ     +,//6	 !fll+>A	#--<<dhh4 #O? B "  	 %%vv6)667AF   VVBZJqvvbz<$H<DH8)667H #4[AF 	 FF3'44 F +	. #Os7   A E2#*B E2	E(CE##E((E+ +E//E2c                     ddl m} |j                  t        j                  | | j
                  j                  | j                  | j                         y r`   )	rc   rb   r   r   before_testr   r   r   r2   r  s     r   pytest_runtest_callr    s<     +		r   c                 (    | j                   dk(  r| ay y )Ncall)whenr  )reports    r   pytest_runtest_logreportr    s    {{f  r   class)scopec              #     K   ddl m} | j                  }t        |d      r|j	                  |j
                         t        rt        j                  |        d  t        rt        j                  |        t        |d      r|j	                  |j                         |j	                  t        j                  |       y w)Nr   ra   setup_test_classteardown_test_class)rc   rb   r   rC   r   r"  r   r   run_class_fixture_setuprun_class_fixture_teardownr#  r   stop_test_class)requestrb   r   s      r   setup_class_methodsr(    s     *
++Cs&'S11266w?	99'Bs)*S44544c:s   B<B>functionc              #     K   ddl m} | j                  }t        rt	        j
                  |        t        |d      r|j                  |j                         t        |d      r|j                  |j                         d  |j                  t        j                  |       t        |d      r|j                  |j                         t        |d      r|j                  |j                         t        rt	        j                  |        y y w)Nr   ra   
setup_testsetUptearDownteardown_test)rc   rb   instancer   r   run_fn_fixture_setuprC   r   r+  r,  r   after_test_fixturesr-  r.  run_fn_fixture_teardown)r'  rb   r   s      r   setup_test_methodsr3    s     * D 33G< t\"T__-
 tWTZZ( 
 88$? tZ T]]+t_%T//0 66w? s   DDc                     t         j                  j                  dk(  rt        j                  |       S t        j
                  |       S )Nr   )sysversion_infomajorr   getfullargspec
getargspecr   s    r   r9  r9  '  s8    
"%%b))!!"%%r   c                 >     ddl m ddlm d d fd	}|S )z:Port of langhelpers.decorator with pytest-specific tricks.r   )format_argspec_plus)inspect_getfullargspecc                 $    t        | |       ||   S r   )exec)codeenvfn_names      r   _exec_code_in_envz/_pytest_fn_decorator.<locals>._exec_code_in_env4  s    T37|r   c                     |       }|r|j                   j                  |       t        dd| j                        }|j	                   |d             d|z  } |	| d| j                        }|s/t        | d|       j                  |_        | |_        t        ||       S | j                  |_	        | j                  |_        t        | d	      r| j                  |_        |S )
N__target_fn	__orig_fn)rD  rE  r2   F)groupedzPdef %(name)s(%(args)s):
    return %(__target_fn)s(%(__orig_fn)s, %(apply_kw)s)
)rD  rE  r   
pytestmark)r   r   dictr   updaterO   __defaults__r   r   r   rC   rG  )
r   add_positional_parametersspecmetadatar?  	decoratedrB  r;  r<  targets
         r   decoratez&_pytest_fn_decorator.<locals>.decorate8  s    %b)$II67%2;;
 	+D%@A 	 	 &&r:BKK
	 )%,RR%@%M%MI"$&I!!)R00
 $&==I !#Ir<(')}}	$r   )r   )sqlalchemy.util.langhelpersr;  sqlalchemy.util.compatr<  )rO  rP  rB  r;  r<  s   ` @@@r   r   r   .  s#     @=   D Or   c                   H    e Zd Zd Zd Zd eed dZd Zd Z	d Z
d	 Zd
 Zy)rQ   c                 @    t        j                  j                  |i |S r   )r   skipr  )r   r   r3   s      r   skip_test_exceptionz*PytestFixtureFunctions.skip_test_exception^  s    {{$$c0R00r   c                 B    t         j                  j                  dd      S )Nr(  r3  )r   markusefixturesr   s    r   mark_base_test_classz+PytestFixtureFunctions.mark_base_test_classa  s    {{&&!#7
 	
r   c                     | S r   r   r   s    r   r   zPytestFixtureFunctions.<lambda>g  s     r   c                 \    t        | d      r| j                  S t        |       j                  S )Nr   )rC   r   r   r]  s    r   r   zPytestFixtureFunctions.<lambda>j  s)    3
#  #Y r   )irsnc           	      2   ddl m t        j                  j                  dk(  r,t        |      dk(  rIt        |d   d      r:t        |d         }n+t        |      dk(  rt        |d   d      rt        |d         }|j                  dd      fd	}|j                  d
d      }g }d|r| j                  }t        j                  dgt        |      D cg c]  \  }}|dv r| c}} }	t        |      D cg c]#  \  }}||v rt        j                  |      ||   f% }
}}|D ][  t        t              sf |      \  }} |	|      dd }|rd|j                  ||dj!                  fd|
D              f       ] n=|D ]8  t        t              sf |      \  }}|rd|j                  ||df       : g |D ]4  \  }}}r||fz  }t#        j$                  |d|i}j                  |       6 fd}|S c c}}w c c}}w )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                     g }g }| D ];  }t        |j                        r|j                  |       +|j                  |       = ||fS r   )r   compoundr   )r   resultgathered_exclusionsard  s       r   _filter_exclusionsz?PytestFixtureFunctions.combinations.<locals>._filter_exclusions  sU    F"$ %a!4!45'..q1MM!$	% ...r   id_F)rb  r`  ra  rl  Tr   c              3   @   K   | ]  \  }} | |              y wr   r   )r   gettercomb_fnr   s      r   r   z6PytestFixtureFunctions.combinations.<locals>.<genexpr>  s#      !5DVWGF3K0!s   r   c                    t        j                  |       rArt        d      d| j                  vrg | _        | j                  j                  f       | S t        |       j                  dd  }nt        j                  d      }r!|dgz  }t        fd       }d } || d	      } t        j                  j                  |      |       S )
Nz5exclusions not supported for class level combinationsr   r   z, *_exclusionsc                 r    |d   }|r% j                         j                  | } ||       }  | |dd i |S )Nr  r   )ri  add)r   r   r3   rs  exlurd  s        r   check_exclusionszOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.check_exclusions  sI    &*2h&#<:#6#6#8#<#<k#JD!%bB!4":444r   c                 :    | j                   j                  d       y )Nrs  )r   r   )rL  s    r   process_metadatazOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.process_metadata  s    		((7r   )rs  )rK  )r   r   NotImplementedErrorr   r   r   r9  r   r   r   r   r   rX  parametrize)r   	_argnamesrw  ry  rg  rd  has_exclusionspytest_paramss       r   rP  z5PytestFixtureFunctions.combinations.<locals>.decorate  s    r"!-O  %BKK7)+B&""))8]*CD	# *2 3 3AB 7I " :I!-0I)5 *58 *6FB {{..y-HLLr   )rc   rd  r5  r6  r7  lenrC   r   r.   _combination_id_fnsoperator
itemgetter	enumerater   r  r   r   r   r   )r   arg_setsr3   rm  rn  tobuild_pytest_paramsr  idxchar_arg_getterfns	fn_paramsparam_exclusions
parametersr   rP  r   rg  rd  r}  r~  s                   @@@@@r   combinationsz#PytestFixtureFunctions.combinationso  sm    	2!!Q&8}!ghqk:&F,8}!ghqk6&B,66*d+		/ ffUD! ""&":":
 #-- &/s^!T33 K "+3C.. $$S)+>t+DEC    !#u-&C.@.E+	+(3AB7
#%)N%,,"( !HK! .   !#u-&C.@.E+	+#%)N%,, 0$7 1F 	(-J(#/11
LL*55E  '	("	MH ys   H?(Hc                 <    |d   }t        j                  |dd  d|iS )Nr   r   r   )r   r   )r   r  idents      r   param_identz"PytestFixtureFunctions.param_ident  s%    1||Z^666r   c                     ddl m ddl m t        |      dkD  rt	        |d         r|d   }|dd  }nd }t        j                  |i fd}|r ||      S |S )Nr   rT   ra   r   c                     j                   rj                  |       } t        rdv rt        j                  |        | S  |       } | S )NrW   )r   _maybe_async_wrapperr   r   add_fixture)r   rb   rU   fixturer3   s    r   wrapz,PytestFixtureFunctions.fixture.<locals>.wrap  sP    11"5 	R '222w?
 I R[Ir   )rc   rU   rb   r  r   r   r  )r   r   r3   r   r  rb   rU   r  s     `  @@@r   r  zPytestFixtureFunctions.fixture  si    -. s8a<HSV,QBab'C B ..#,,	& 8OKr   c                 @    t         j                  j                  d      S )NPYTEST_CURRENT_TEST)rH   environgetrZ  s    r   get_current_test_namez,PytestFixtureFunctions.get_current_test_name*  s    zz~~344r   c                 <    ddl m t        fd       } ||      S )Nr   ra   c                 2     j                   | g|i | y r   )_run_coroutine_functionr   s      r   rP  z3PytestFixtureFunctions.async_test.<locals>.decorate0  s    +G++B@@@r   )rc   rb   r   )r   r   rP  rb   s      @r   
async_testz!PytestFixtureFunctions.async_test-  s&    .		A 
	A |r   N)r   r   r   rV  r[  reprr   r  r  r  r  r  r  r   r   r   rQ   rQ   ]  s@    1
  	GR7,\5r   rQ   )T)0sqla_plugin_baser   ImportErrorr   r/   r   	functoolsr   r   r   r  rH   r   r5  r   r   r6  r   sqla_reinvent_fixturesr   r9   rV   rS   r  r^   rg   rl   ry   r   rB   r   r   r   r   r   r  r  hookimplr  r  r  r  r(  r3  r9  r   FixtureFunctionsrQ   r   r   r   <module>r     s  *
   $    	 	 
   & -?
/d4   2HE(
 
2M`2+@ F 6& T"2# #2#j ! g; ;, j!;@ ";@D&,^W[99 Ws  ,  -,-s#   D D DDD#"D#