
    ؄_>                        	 d dl Zn# e$ r	 ddlmZ Y nw xY 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	 d dlZej        rd dlmZ n# e$ r Y nw xY w	 d dlZdZn# e$ r dZY nw xY wd Zd	 Zd
 Zd Zer
d dlZd Zd Zd Zd Zdad Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z& G d dej'                  Z(dS )    N   )plugin_base)update_wrapper)SequenceTFc                     |                      d          fd}t          j        |           t          j                     d S )N
sqlalchemyc                    |                     dd           r G fddt          j                  |d<   |                     dd           r  G fddt          j                  |d<    j        | fi | d S )Ncallbackc                       e Zd Z	 d fd	ZdS )=pytest_addoption.<locals>.make_option.<locals>.CallableActionNc                 "     |||           d S N )selfparser	namespacevaluesoption_string	callback_s        k/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/testing/plugin/pytestplugin.py__call__zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__call__,   s     ImVV<<<<<    r   )__name__
__module____qualname__r   )r   s   r   CallableActionr   +   s6        CG= = = = = = = =r   r   actionzeroarg_callbackc                   8     e Zd Z	 	 	 d fd	Z	 dfd	Z xZS )r   FNc           	      \    t          |                               ||dd|||           d S )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__7   sK     .$//88'5!" '!)! 9     r   c                 "     |||           d S r   r   )r   r   r   r   r   r   s        r   r   zFpytest_addoption.<locals>.make_option.<locals>.CallableAction.__call__I   s      %$]FFCCCCCr   )FFNr   )r   r   r   r)   r   __classcell__)r*   r   r   s   @r   r   z=pytest_addoption.<locals>.make_option.<locals>.CallableAction6   s}        
 ""      & DHD D D D D D D D D Dr   )popargparseAction	addoption)namekwr   r   r   groups     @@@r   make_optionz%pytest_addoption.<locals>.make_option'   s    FF:t,,	 	*= = = = = = = = = = *BxL66"4d;; 	*D D D D D D D D D D D0 *BxL#######r   )getgroupr   setup_optionsread_config)r   r4   r3   s     @r   pytest_addoptionr8   $   sV    OOL))E)$ )$ )$ )$ )$V k***r   c           	      4   t          j        d           t          | d          r9t          j        | j                   t          j        | j        d                    nS| j        j        rGt          j
                            | j        j                  rt          j        | j        j                   t          j        | j                   t          j        t          t!          | j        dd                               t          j        t$                     d S )Nzsqlalchemy.testing.assertionsworkerinputfollower_ident
cov_sourceF)pytestregister_assert_rewrite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)configs    r   pytest_configurerO   V   s    
"#BCCCv}%% 25f6HIII&v'9:J'KLLLL=% 	2"'..M&+
 +
 	2 Ifm0111&-(((!WV]L%8899   %&<=====r   c                 ,    t          j                     d S r   )r   
post_beginsessions    r   pytest_sessionstartrT   k   s    r   c                 ,    t          j                     d S r   )r   final_process_cleanuprR   s    r   pytest_sessionfinishrW   o   s    %'''''r   c                     t          j        | j                   dt          j                    j        dd         z  | j        d<   ddlm} |                    | j        d                    d S )Nztest_%sr      r;   	provision)	r   !memoize_important_follower_configr:   uuiduuid4hexsqlalchemy.testingr[   create_follower_db)noder[   s     r   pytest_configure_noderc   v   sr     	5d6FGGG-69I!B$9O-O)*000000$$T%56F%GHHHHHr   c                 R    ddl m} |                    | j        d                    d S )Nr   rZ   r;   )r`   r[   drop_follower_dbr:   )rb   errorr[   s      r   pytest_testnodedownrg      s7    000000""4#34D#EFFFFFr   c                    t          j        d           }d |D             |d d <   t          d |D                       }|D ]}t          j        |j        |j        j                  D ]}||j        ur||j                 }t          t          j
        dt          j
                  } ||j        |j        j                                                  D ]9}	|	                                D ]"}
||
j                                     |
           #:g }|D ]V}|j        j        |v r1|                    ||j        j                 |j                            A|                    |           Wt!          |d           |d d <   d S )Nc                  4    t          j        t                    S r   )collectionsdefaultdictlistr   r   r   <lambda>z/pytest_collection_modifyitems.<locals>.<lambda>   s    '-- r   c                     g | ]G}t          |j        t          j                  !|j        j        j                            d           E|HS )_)
isinstanceparentr=   Instancer1   
startswith.0items     r   
<listcomp>z1pytest_collection_modifyitems.<locals>.<listcomp>   s\       dk6?33 "'22377	  r   c              3   $   K   | ]}|j         V  d S r   )rq   rt   s     r   	<genexpr>z0pytest_collection_modifyitems.<locals>.<genexpr>   s$      55tt{555555r   from_parentr1   rq   c                 \    | j         j         j         j        | j         j         j        | j        fS r   )rq   r1   rv   s    r   rm   z/pytest_collection_modifyitems.<locals>.<lambda>   s'    K%*K#I
 r   )key)rj   rk   setr   generate_sub_testsclsrq   modulerK   r=   Classr   collectr1   appendextendsorted)rS   rN   itemsrebuilt_itemstest_classes
test_classsub_clsper_cls_dictctorinsttnewitemsrv   s                r   pytest_collection_modifyitemsr      s     +-- M   E!!!H 55u55555L" 7 7
"5NJ-4
 
 	7 	7G jn,,,Z^< v|]FLII D )*2C2J  '))7 7D "\\^^ 7 7$QV,33A66667	7 H " ";?m++OOM$+/:49EFFFFOOD!!!! 
 
  E!!!HHHr   c                 ~    t          j        |          r\t          j        ||          rGt	          t
          j        dt
          j                   fdt           j        |          D             S t          j	        |          r6t           t
          j                  rt          j         j        |          rd S g S )Nrz   c                 4    g | ]} |j                    S )r{   )r   )ru   parametrize_cls	collectorr   s     r   rw   z-pytest_pycollect_makeitem.<locals>.<listcomp>   s;     
 
 
 Do.yAAA
 
 
r   )inspectisclassr   
want_classrK   r=   r   _parametrize_clsr   
isfunctionrp   rr   want_methodr   )r   r1   objr   s   `  @r   pytest_pycollect_makeitemr      s    s  6tS A A  v|]FLAA
 
 
 
 
#3I4Dc#J#J
 
 
 	

 	3
y&/22
 #IM377
 t 	r   c                    d|j         vr|gS |j        }g }t          j        d |D              D ]}i }t	          d |D             |          D ]K\  }}|st          d          t          j        d|          }t	          ||j                  D ]
\  }	}
|
||	<   Ld	                    d |D                       }|j
        d|}t                              t          ||f|          }t          | ||           |                    |           |S )z6implement a class-based version of pytest parametrize._sa_parametrizec                     g | ]\  }}|S r   r   )ru   argnameparamss      r   rw   z$_parametrize_cls.<locals>.<listcomp>   s    	8	8	8_Wf&	8	8	8r   c                     g | ]
}|d          S )r   r   )ru   	_sa_params     r   rw   z$_parametrize_cls.<locals>.<listcomp>   s    ;;;iYq\;;;r   z*need argnames for class-based combinationsz,\s*ro   c           	   3      K   | ]D}|j                             d           D ]'}t          t          j        dd|                    V  (EdS )-z\W N)idsplitstrresub)ru   paramtokens      r   ry   z#_parametrize_cls.<locals>.<genexpr>   ss       %
 %
 ,,%
 %

  ub%(())%
 %
 %
 %
 %
 %
 %
r   )__dict__r   	itertoolsproductzip	TypeErrorr   r   r   joinr   type__new__setattrr   )r   r   r   classesfull_param_setcls_variablesr   r   argname_splitargvalparametrized_namer1   newclss                 r   r   r      sm    ,,u)OG#+	8	8	8	8	8   !;;?;;;^
 
 	) 	)NGU  N LMMMHWg66Mu|<< ) )S%(c"")HH %
 %
 (	%
 %
 %
 
 
 ,,,(9(9:dD3&-@@f%%%vNr   c                      t           t          j                  sd S t          It	           j        j                    j        j        a fd} j        j                            |           t                      d S )Nc                  >    t           j        j                   d ad S r   )class_teardownrq   _current_classr}   s   r   finalizez&pytest_runtest_setup.<locals>.finalize  s    4;-...!NNNr   )rp   r=   Functionr   class_setuprq   addfinalizer
test_setup)rv   r   s   ` r   pytest_runtest_setupr      s     dFO,,  DK&'''+
	" 	" 	" 	" 	"
 	''111tr   c                 $    t          |            d S r   )test_teardownr}   s    r   pytest_runtest_teardownr     s    
 $r   c                 p    t          j        | | j        j        j        | j        j        | j                   d S r   )r   before_testrq   r   r   r   r1   r}   s    r   r   r   !  s8    dk )4;?DI    r   c                 .    t          j        |            d S r   )r   
after_testr}   s    r   r   r   '  s    4     r   c                 8    t          j        | j                   d S r   )r   start_test_classr   r}   s    r   r   r   +  s     *****r   c                 8    t          j        | j                   d S r   )r   stop_test_classr   r}   s    r   r   r   /  s    )))))r   c                 |    t           j        j        dk    rt          j        |           S t          j        |           S )N   )sysversion_infomajorr   getfullargspec
getargspec)fns    r   r   r   3  s5    
""%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                 2    t          | |           ||         S r   )exec)codeenvfn_names      r   _exec_code_in_envz/_pytest_fn_decorator.<locals>._exec_code_in_env@  s    T37|r   r   c                     |           }|r|j                             |           t          dd| j                  }|                     |d                     d|z  } |	| d| j                  }|s2t          | d|           j        |_        | |_        t          ||           S | j	        |_	        | j        |_        |S )	Ntargetr   )r   r   r1   F)groupedzDdef %(name)s(%(args)s):
    return %(target)s(%(fn)s, %(apply_kw)s)
)r   r   im_func)
argsr   dictr   updaterK   __defaults____wrapped__r   r   )
r   add_positional_parametersspecmetadatar   	decoratedr   r   r   r   s
         r   decoratez&_pytest_fn_decorator.<locals>.decorateD  s    %%b))$ 	8I6777xDr{CCC++D%@@@AAA 	 	 &%V2..
 
	 ) 
	%,RB%?%?%LI"$&I!!)R000
 $&=I !#Ir   )r   )sqlalchemy.util.langhelpersr   sqlalchemy.util.compatr   )r   r   r   r   r   s   ` @@@r   _pytest_fn_decoratorr   :  sp     @?????======          < Or   c                   X    e Zd Zd Zd ee ej        d          dZd Z	d Z
d Zd Zd	S )
rM   c                 .    t          j        j        |i |S r   )r=   skip	Exceptionr   r   r2   s      r   skip_test_exceptionz*PytestFixtureFunctions.skip_test_exceptionf  s    {$c0R000r   c                     | S r   r   )r   s    r   rm   zPytestFixtureFunctions.<lambda>j  s     r   r   )irsnc           	      J   ddl m t          j        j        dk    r?t          |          dk    r+t          |d         d          rt          |d                   }n>t          |          dk    r+t          |d         d          rt          |d                   }|                    dd          fd	}|                    d
d          }g }d|r| j	        t          j        dgd t          |          D             R  }fdt          |          D             }|D ]vt          t                    sf |          \  }}	 ||          dd         }
|	rd|                    |
|	d                    fd|D                       f           wnG|D ]Dt          t                    sf |          \  }}	|	rd|                    ||	df           Eg |D ]4\  }
}	}r|
|	fz  }
t#          j        |
d|i}                    |           5f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                     g }g }| D ]B}t          |j                  r|                    |           -|                    |           C||fS r   )rp   compoundr   )r   resultgathered_exclusionsar  s       r   _filter_exclusionsz?PytestFixtureFunctions.combinations.<locals>._filter_exclusions  sj    F"$ % %a!455 %'..q1111MM!$$$$...r   id_Fc                      g | ]\  }}|d v 	|S ))r  r   r  r  r   )ru   idxchars      r   rw   z7PytestFixtureFunctions.combinations.<locals>.<listcomp>  s2       !T333 333r   c                 V    g | ]%\  }}|v 	t          j        |          |         f&S r   )operator
itemgetter)ru   r  r  _combination_id_fnss      r   rw   z7PytestFixtureFunctions.combinations.<locals>.<listcomp>  sI       C... $S))+>t+DE...r   Tr   c              3   F   K   | ]\  }} | |                    V  d S r   r   )ru   gettercomb_fnr   s      r   ry   z6PytestFixtureFunctions.combinations.<locals>.<genexpr>  sJ       ! !5DVWGGFF3KK00! ! ! ! ! !r   r   c                    t          j        |           r?rt          d          d| j        vrg | _        | j                            f           | S t          |           j        dd          }nt          j	        d          }r(|dgz  }t          fd            }d } || d	          } t          j                            |          |           S )
Nz5exclusions not supported for class level combinationsr   r   z, *_exclusionsc                     |d         }|r'                                  j        | } ||           }  | |dd         i |S )Nr   )r	  add)r   r   r2   r  exlur  s        r   check_exclusionszOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.check_exclusions  sY    &*2h& *#<:#6#6#8#8#<k#JD!%bB!r4":4444r   c                 :    | j                             d           d S )Nr  )r   r   )r   s    r   process_metadatazOPytestFixtureFunctions.combinations.<locals>.decorate.<locals>.process_metadata  s    	((77777r   )r  )r   )r   r   NotImplementedErrorr   r   r   r   r   r   r   r   r=   markparametrize)r   	_argnamesr  r!  r  r  has_exclusionspytest_paramss       r   r   z5PytestFixtureFunctions.combinations.<locals>.decorate  s*   r"" #M! -O   %BK77)+B&"))8]*CDDD	# *2 3ABB 7II "! !I " -0I)5 5 5 5 *)58 8 8 *)6F  B {..y-HHLLLr   )r`   r  r   r   r   lenr?   rl   r-   r  r  r  	enumeraterp   tupler   r   r=   r   )r   arg_setsr2   r  r  tobuild_pytest_params_arg_getterfns	fn_paramsparam_exclusions
parametersr   r   r  r   r  r  r&  r'  s                @@@@@@r   combinationsz#PytestFixtureFunctions.combinationsp  s;    	211111!Q&&8}}!!ghqk:&F&F!,,8}}!!ghqk6&B&B!,,66*d++		/ 		/ 		/ 		/ 		/ ffUD!! " 6	"&":
 #- %.s^^    K   !*3  C    !#u-- !&C.@.@.E.E+	+([33ABB7
# *%)N%,,"( ! ! ! !HK! ! !     .    !#u-- !&C.@.@.E.E+	+# *%)N%,, 0$7    1F 	( 	(-J(# 2/11
L*555E  ''''$	M $	M $	M $	M $	M $	M $	M $	ML r   c                 D    |d         }t          j        |dd          d|iS )Nr   r   r   )r=   r   )r   r1  idents      r   param_identz"PytestFixtureFunctions.param_ident  s(    1|Z^6666r   c                 $    t          j        |i |S r   )r=   fixturer   s      r   r7  zPytestFixtureFunctions.fixture  s    ~s)b)))r   c                 @    t           j                            d          S )NPYTEST_CURRENT_TEST)rD   environget)r   s    r   get_current_test_namez,PytestFixtureFunctions.get_current_test_name  s    z~~3444r   N)r   r   r   r   reprr   r  
attrgetterr  r2  r5  r7  r<  r   r   r   rM   rM   e  s        1 1 1 _ X ,,	 I I IV7 7 7* * *5 5 5 5 5r   rM   ))sqla_plugin_baser   ImportErrorr   r.   rj   	functoolsr   r   r   r  rD   r   r   r=   typingTYPE_CHECKINGr   xdist	has_xdistr8   rO   rT   rW   r]   rc   rg   r   r   r   r   r   r   r   r   r   r   r   r   FixtureFunctionsrM   r   r   r   <module>rG     s  *****         $ $ $ $ $ $       				 				 



 $MMM  $######	  	 	 	D	LLLII   III/ / /d> > >*  ( ( (  GKKK	I 	I 	IG G G6 6 6r  0      F  6    ! ! !+ + +* * *& & &( ( (V^5 ^5 ^5 ^5 ^5[9 ^5 ^5 ^5 ^5 ^5s0    A AA!A( (A21A2