o
    iO                     @   s0  d Z ddlmZ ddlZddlZddlZejdkZer#ddlZej	Z	nddl
ZddlZG dd deZ	dadadadadadadZdadadadadae ae a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%dd Z&dd Z'dd Z(dd Z)dd  Z*g Z+g Z,d!d" Z-d#d$ Z.e-d%d& Z/e-d'd( Z0e-d)d* Z1e.d+d, Z2e.d-d. Z3e.d/d0 Z4d1d2 Z5e.d3d4 Z6e.d5d6 Z7e.d7d8 Z8e.d9d: Z9d;d< Z:d=d> Z;d?d@ Z<dAdB Z=dCdD Z>dEdF Z?dGdH Z@dIdJ ZAdKdL ZBdMdN ZCdZdPdQZDdRdS ZEdTdU ZFG dVdW dWe	ZGdaHdXdY ZIdS )[zTesting extensions.

this module is designed to work as a testing-framework-agnostic library,
created so that multiple test frameworks can be supported at once
(mostly so that we can migrate to new ones). The current target
is pytest.

    )absolute_importN)   r   c                   @   s   e Zd ZejZdS )ABCN)__name__
__module____qualname__abcABCMeta__metaclass__ r   r   `/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/sqlalchemy/testing/plugin/plugin_base.pyr   "   s    
r   c                 C   s8  | dddt dd | dddt dd | dd	dd
dd | ddtdd | dd	dddd | ddddd | ddddd | ddddd | dddd  | d!dd"d#d | d$dd%d&d' | d(dd)d*d+d, | d-ddtd.d | d/dd0d*d1d, | d2dtdd3d4 | d5dtdd6d4 | d7dd8d*d9d, | d:dd;d*d<d, d S )=Nz
--log-infocallbackstringz,turn on info logging for <LOG> (multiple OK))actiontyper   helpz--log-debugz-turn on debug logging for <LOG> (multiple OK)z--dbappenddbzBUse prefab database uri. Multiple OK, first one is run by default.)r   r   destr   z--dbszList available prefab dbs)r   zeroarg_callbackr   z--dburidburiz8Database uri.  Multiple OK, first one is run by default.z--dropfirst
store_true	dropfirstz,Drop all tables in the target database first)r   r   r   z--backend-onlybackend_onlyz<Run only tests marked with __backend__ or __sparse_backend__z
--nomemorynomemoryz Don't run memory profiling testsz--postgresql-templatedbz^name of template database to use for PostgreSQL CREATE DATABASE (defaults to current database))r   r   z--low-connectionslow_connectionsz>Use a low number of distinct connections - i.e. for Oracle TNSz--write-identswrite_identszCwrite out generated follower idents to <file>, when -n<num> is used)r   r   r   z--reversetop
reversetopFzTUse a random-ordering set implementation in the ORM (helps reveal dependency issues))r   r   defaultr   z--requirementsz3requirements class for testing, overrides setup.cfgz--with-cdecimalcdecimalzDMonkeypatch the cdecimal library into Python 'decimal' for all testsz--include-tagzInclude tests with tag <tag>)r   r   r   r   z--exclude-tagzExclude tests with tag <tag>z--write-profileswrite_profilesz$Write/update failing profiling data.z--force-write-profilesforce_write_profilesz,Unconditionally write/update profiling data.)_log	_list_dbs_requirements_opt_include_tag_exclude_tag)make_optionr   r   r   setup_options:   s   
r(   c                 C   s   ddl m} | |_dS )zConfigure required state for a follower.

    This invokes in the parent process and typically includes
    database creation.

    r   	provisionN)sqlalchemy.testingr*   FOLLOWER_IDENT)follower_identr*   r   r   r   configure_follower   s   
r.   c                 C   s   t td| d< dS )aS  Store important configuration we will need to send to a follower.

    This invokes in the parent process after normal config is set up.

    This is necessary as pytest seems to not be using forking, so we
    start with nothing in memory, *but* it isn't running our argparse
    callables, so we have to just copy all of that over.

    include_tagsexclude_tagsmemoized_configNr/   dict_r   r   r   !memoize_important_follower_config   s   r5   c                 C   s(   t | d d  t| d d  dS )zfRestore important configuration needed by a follower.

    This invokes in the follower process.

    r2   r0   r1   N)r0   updater1   r3   r   r   r   !restore_important_follower_config   s   r7   c                   C   s   t  atddg d S )Nz	setup.cfgztest.cfg)configparserConfigParserfile_configreadr   r   r   r   read_config   s   r<   c                 C   s   | a tD ]}|t t qdS )z7things to set up early, before coverage might be setup.N)optionspre_configurer:   )optfnr   r   r   	pre_begin   s   rA   c                 C   s
   | t _d S N)r=   has_coverage)valuer   r   r   set_coverage_flag   s   
rE   c                  C   sl   t D ]} | tt qddlma ddlmamama ddlm	a	m
a
ma ddlma ddlma t
  dS )z9things to set up later, once we know coverage is running.r   testing)fixturesengines
exclusions)
assertionswarnings	profilingconfig)utilN)post_configurer=   r:   
sqlalchemyrG   r+   rH   rI   rJ   rK   rL   rM   rO   rP   setup_filtersr@   r   r   r   
post_begin   s   rU   c                 C   sX   t s
dd l a t   | drt |t j d S | dr*t |t j d S d S )Nr   z-infoz-debug)loggingbasicConfigendswith	getLoggersetLevelINFODEBUGopt_strrD   parserr   r   r   r"     s   

r"   c                  G   sB   t d ttdD ]}t d|td|f  qtd d S )Nz0Available --db options (use --dburi to override)r   z%20s	%sr   )printsortedr:   r=   getsysexit)argsmacror   r   r   r#     s   r#   c                 C   s   t | d S rB   )_setup_requirementsr]   r   r   r   r$     s   r$   c                 C      t |dd d S N-_)r1   addreplacer]   r   r   r   r&        r&   c                 C   rh   ri   )r0   rl   rm   r]   r   r   r   r%      rn   r%   c                 C      t |  | S rB   )r>   r   rT   r   r   r   pre(     
rp   c                 C   ro   rB   )rQ   r   rT   r   r   r   post-  rq   rr   c                 C      | a d S rB   r=   r?   r:   r   r   r   _setup_options2  s   rv   c                 C   s   | j r
td d S d S )Nmemory_intensive)r   r1   rl   ru   r   r   r   _set_nomemory8  s   rx   c                 C   s    | j rdd l }|tjd< d S d S )Nr   decimal)r   rc   modules)r=   r:   r   r   r   r   _monkeypatch_cdecimal>  s   r{   c                 C   s   ddl m} t |_d S Nr   rN   )r+   rO   _fixture_fn_class_fixture_functions)r=   r:   rO   r   r   r   _init_symbolsF  s   r   c              	   C   s(  ddl m} ddlm} ddl m} | jrt| j}ng }| jrE| jD ]!}t	d|D ]}||
dvr:td| ||d| q+q#|sP||dd d |_|D ]<}| jr|jrt| jd	}	|	|jd
 | d  W d    n1 szw   Y  ||| ||j}
|js|
|
| qUd S )Nr   rN   rF   r)   z[,\s]+r   z:Unknown URI specifier '%s'.  Specify --dbs for known uris.r   a 
)r+   rO   rR   rG   r*   r   listr   resplitr=   RuntimeErrorr   rb   _currentr   r,   openwritesetup_configset_as_current)r=   r:   rO   rG   r*   db_urlsdb_tokenr   db_urlfile_cfgr   r   r   _engine_uriM  s@   
	
r   c                 C   s   | dd}t| d S )Nsqla_testingrequirement_cls)rb   rg   )r=   r:   r   r   r   r   _requirementsu  s   r   c                 C   sz   ddl m} ddlm} |jd urd S | d\}}t|}|ddd  D ]}t||}q't||}|  |_|_d S )Nr   rN   rF   :.   )	r+   rO   rR   rG   requirementsr   
__import__getattrrequires)argumentrO   rG   modnameclsnamemod	componentreq_clsr   r   r   rg   |  s   

rg   c                 C   sn  ddl m}m} ddlm} ddlm}m} | jr|j	
 D ]}|j}||}	z|	 }
W n	 ty6   Y nw |
D ]}|||||  q9|jj|rxz|	jdd}
W n	 tyb   Y nw |
D ]}|||j|| dd qe|||	 |jj|r|j||	|jd ||drddlm} |	d	D ]}|||j|d
 |d d qqd S d S )Nr   )rO   rP   )against)schemainspecttest_schema)r   
postgresql)r   *namer   )r   r   )r+   rO   rP   sqlalchemy.testing.exclusionsr   rR   r   r   r   Configall_configsr   get_view_namesNotImplementedErrorexecute	_DropViewTableMetaDatar   schemasenabled_for_configdrop_all_tablesr   sqlalchemy.dialectsr   	get_enumsDropEnumTypeENUM)r=   r:   rO   rP   r   r   r   r   e	inspector
view_namesvnamer   enumr   r   r   _prep_testing_database  sd   

r   c                 C   s    | j rddlm} |  d S d S )Nr   )randomize_unitofwork)r   sqlalchemy.orm.utilr   )r=   r:   r   r   r   r   _reverse_topological  s   
r   c                 C   s   ddl m} t|_||_d S r|   )r+   rO   r=   r:   )r?   r:   rO   r   r   r   _post_setup_options  s   
r   c                 C   s$   ddl m} ||dd|_d S )Nr   )rM   r   profile_file)r+   rM   ProfileStatsFilerb   _profile_stats)r=   r:   rM   r   r   r   _setup_profiling  s   

r   c                 C   sF   t |tjsdS | drdS tjjr!t|dds!t|dds!dS dS )NFrk   __backend____sparse_backend__T)
issubclassrH   TestBase
startswithrO   r=   r   r   )r   clsr   r   r   
want_class  s   


r   c                 C   s   |j dsdS |jd u rdS tr,t| dot| jtt	p+t|do+|j
tt	S t	r=t| dr=t| jtt	S t	rKt|drK|j
tt	S dS )Ntest_F__tags___sa_exclusion_extendT)r   r   r   r0   hasattrrJ   tagsr   include_testr1   r   )r   r@   r   r   r   want_method  s,   


r   c                 c   s    t | ddst | ddrJt | dd}t| |dD ].}| j}tdd|j}tdd|}d	| j|f }t|| f||d
}t||| |V  qd S | V  d S )Nr   Fr   )sparsez
[_\[\]\.]+rk   z_+$ z%s_%s)_sa_orig_cls_name__only_on_config__)r   _possible_configs_for_clsr   r   subr   r   setattr)r   moduler   r   	orig_name
alpha_namer   subclsr   r   r   generate_sub_tests  s&   
r   c                 C   s   t |  t|  d S rB   )	_do_skips_setup_enginer   r   r   r   start_test_class%  s   r   c                 C   s:   t j  ztjst  W t  d S W t  d S t  w rB   )rI   testing_reaper_stop_test_ctxr=   r   rK   global_cleanup_assertions_restore_enginer   r   r   r   stop_test_class*  s   


r   c                   C   s   t jt d S rB   )rO   r   resetrG   r   r   r   r   r   5  s   r   c                   C   s   t j  t  t  d S rB   )rI   r   _stop_test_ctx_aggressiverK   r   r   r   r   r   r   final_process_cleanup9  s   

r   c                 C   s0   t | dd rtj| jd}tj|t d S d S )N__engine_options__rt   )r   rI   testing_enginer   rO   r   push_enginerG   )r   engr   r   r   r   ?  s   r   c                 C   s&   t |d|j}d|||f }|t_d S )Nr   z%s.%s.%s)r   r   rM   _current_test)testtest_module_name
test_class	test_namer   id_r   r   r   before_testE  s   
r   c                 C   s   t j  d S rB   )rI   r   _after_test_ctx)r   r   r   r   
after_testQ  s   r   Fc                 C   s  t tj }| jr tj| j }t|D ]}||r|| qt	| dd r?tjt
| j }t|D ]}||s>|| q3t	| dd rL|| jg t| dr}tj}t|D ]$}| jD ]}t	||}||}	|	r{|| |d ury||	  nq]qXt| drt  }
tj}t|D ]}| jD ]}t	||}||s|
| qq||
r||
 |ri }tt|dd dD ]}|jj}||vr|||< q| S |S )N__only_on__r   __requires____prefer_requires__c                 S   s   | j j| j jjfS rB   )r   r   dialectserver_version_info)r   r   r   r   <lambda>  s   z+_possible_configs_for_cls.<locals>.<lambda>)key)setrO   r   r   __unsupported_on__rJ   db_specr   remover   rP   to_listr   intersection_updater   r   r   r   matching_config_reasonsextendr   r   rl   
differencedifference_updatereversedra   r   r   values)r   reasonsr   r   spec
config_objr   requirementcheckskip_reasonsnon_preferredper_dialectr   r   r   r   r   r   U  sl   














	r   c                 C   s   g }t | |}t| ddr#t| dD ]}| r"td| j|jf  q|sAd| jddd tj D d|f }t| n)t| drjt	 }t
jt| j }|D ]}||s_|| qT||rj|| tj|vrxt| |  d S d S )	N__skip_if__Fz'%s' skipped by %sz.'%s' unsupported on any DB implementation %s%sz, c              	   s   s>    | ]}d |j jddd t|j D |j jf V  qdS )z'%s(%s)+%s'r   c                 s   s    | ]}t |V  qd S rB   )str).0digr   r   r   	<genexpr>  s
    
z&_do_skips.<locals>.<genexpr>.<genexpr>N)r   r   joinrJ   _server_versiondriver)r  r  r   r   r   r    s    



z_do_skips.<locals>.<genexpr>__prefer_backends__)r   r   rO   	skip_testr   r  r   r   r   r  rJ   r  rP   r  r  rl   r	  r
  r   _setup_configpop)r   r  r   cmsgr  r  r  r   r   r   r     s<   







r   c                 C   s   t j| t d S rB   )rO   r   pushrG   )r  ctxr   r   r   r    s   r  c                   @   sL   e Zd Zejdd Zejdd Zejdd Zejdd Zd	d
 Z	dS )FixtureFunctionsc                 O      t  rB   r   selfargkwr   r   r   skip_test_exception     z$FixtureFunctions.skip_test_exceptionc                 O   r&  rB   r'  r)  re   r+  r   r   r   combinations  r-  zFixtureFunctions.combinationsc                 O   r&  rB   r'  r.  r   r   r   param_ident  r-  zFixtureFunctions.param_identc                 O   r&  rB   r'  r(  r   r   r   fixture  r-  zFixtureFunctions.fixturec                 C   r&  rB   r'  )r)  r   r   r   get_current_test_name  s   z&FixtureFunctions.get_current_test_nameN)
r   r   r   r   abstractmethodr,  r/  r0  r1  r2  r   r   r   r   r%    s    



r%  c                 C   rs   rB   )r}   )fixture_fn_classr   r   r   set_fixture_functions  s   r5  )NF)J__doc__
__future__r   r   r   rc   version_infopy3kr8   r   r9   collectionscollections_abcobjectrH   rI   rJ   rL   rM   rK   r   rO   rG   rP   r:   rV   r  r0   r1   r=   r(   r.   r5   r7   r<   rA   rE   rU   r"   r#   r$   r&   r%   r>   rQ   rp   rr   rv   rx   r{   r   r   r   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r%  r}   r5  r   r   r   r   <module>   s   	





'

8



A*