U aa@sz ddlZWn ek r,ddlmZYnXddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZzddlZdZWnek rdZYnXe jdkZerz ddlZWn ek rddlmZYnXd d Zd d Zdaejdd ddZddZddZddZerFddlZddZddZddZ ddZ!ddZ"d7d d!Z#d"d#Z$da%d$d%Z&d&d'Z'd(d)Z(ejd*d+d,d-Z)ejd.d+d/d0Z*d1d2Z+d3d4Z,Gd5d6d6ej-Z.dS)8N) plugin_base)update_wrapperTF)r)reinvent_fixtures_py2kcs,|dfdd}t|tdS)NZ sqlalchemycsp|ddr.Gfdddtj|d<|ddr^Gfdddtj|d<j|f|dS)NcallbackcseZdZdfdd ZdS)=pytest_addoption..make_option..CallableActionNcs|||dSNselfparser namespacevaluesZ option_string callback_r gC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\testing\plugin\pytestplugin.py__call__,sFpytest_addoption..make_option..CallableAction.__call__)N)__name__ __module__ __qualname__rr rr rCallableAction+sractionzeroarg_callbackcs.eZdZdfdd Zdfdd ZZS) rFNc s"t|j||dd|||ddS)NrT)option_stringsdestnargsconstdefaultrequiredhelp)super__init__)r rrrr r!)r __class__r rr#7s zFpytest_addoption..make_option..CallableAction.__init__cs|||dSr r r )rr rrIsr)FFN)N)rrrr#r __classcell__r )rr)r$rr6s )popargparseZActionZ addoption)namekwgroup)rrrr make_option's  z%pytest_addoption..make_option)ZgetgrouprZ setup_optionsZ read_config)r r,r r*rpytest_addoption$s  + r-cCst|dr(t|jt|jdn&|jjrNtj |jjrNt |jjt |jt t t|jddtt|jjrdadS)N workerinputfollower_identZ cov_sourceFT)hasattrrZ!restore_important_follower_configr.Zconfigure_followeroptionZ write_identsospathexistsremoveZ pre_beginZset_coverage_flagboolgetattrZset_fixture_functionsPytestFixtureFunctionsdump_pyannotateDUMP_PYANNOTATEconfigr r rpytest_configureVs    r=)autouseccs.trddlm}|dVtr*|dS)Nr collect_types)r:pyannotate_runtimer@startstopr?r r rcollect_types_fixtureps  rDcCsddlm}|tjdSNrasyncio)sqlalchemy.testingrGZ _assume_asyncrZ post_begin)sessionrGr r rpytest_sessionstart{s rJcCsBddlm}|tj|jjjr>ddlm }| |jjjdS)NrrFr?) rHrG_maybe_async_provisioningrZfinal_process_cleanupr<r1r9rAr@Z dump_stats)rIrGr@r r rpytest_sessionfinishs     rLcs>|jjjr:ddlm}tjdfdd}|j|ddS)Nrr?lib/sqlalchemycs<tjtj|}dtj|gkr,dSd|kr8dS|S)NrMZtesting)r2r3normpathabspath commonpath)filenameZlib_sqlalchemyr r_filtersz)pytest_collection_finish.._filter)Zfilter_filename) r<r1r9rAr@r2r3rOZinit_types_collection)rIr@rSr rRrpytest_collection_finishs     rTcCsXddlm}ddlm}t|jdtjdd|jd<| |j |jddS)Nr provisionrFztest_%s r/) rHrVrGrZ!memoize_important_follower_configr.uuidZuuid4hexrKZcreate_follower_db)noderVrGr r rpytest_configure_nodes   r[cCs0ddlm}ddlm}||j|jddS)NrrUrFr/)rHrVrGrKZdrop_follower_dbr.)rZerrorrVrGr r rpytest_testnodedowns   r]csddlm}tdddd|D|dd<tdd|Dfd d }||g}|D]4}|jjkr||jj|j qb| |qbt r|D]}t |qt|d dd |dd<dS) NrrFcSs ttSr ) collections defaultdictlistr r r rz/pytest_collection_modifyitems..cSs.g|]&}t|jtjr|jjjds|qS)_) isinstanceparentpytestInstancer( startswith.0itemr r r sz1pytest_collection_modifyitems..css|] }|jVqdSr )rerir r r sz0pytest_collection_modifyitems..csD]z}t|j|jjD]b}||jk r|j}ttjdtj}||j|jjd D]"}| D]}||j  |qdqXqqdS)N from_parentr(re) rZgenerate_sub_testsclsremoduler7rfClassrZcollectr(append)Z test_classZsub_clsZ per_cls_dictctorinsttZ rebuilt_itemsZ test_classesr rsetup_test_classess   z9pytest_collection_modifyitems..setup_test_classescSs|jjjj|jjj|jfSr )rer()rkr r rras )key)rHrGr^r_setrKrerpextendr(rspy2krZ"scan_for_fixtures_to_use_for_classsorted)rIr<itemsrGrxZnewitemsrkr rwrpytest_collection_modifyitemss,     rcst|r\t||r\ddlm}|jr0t|}tt j dt j fddt j |DSt |rtt jrtj|rdSgSdS)Nrr;rncsg|]}|jdqS)ro)r)rjZparametrize_cls collectorrtr rrl sz-pytest_pycollect_makeitem..)inspectisclassrZ want_classrHr< any_async_apply_maybe_asyncr7rfrr_parametrize_clsrq isfunctionrdrgZ want_methodrp)rr(objr<r rrpytest_pycollect_makeitems      rcCst|dr|j}qt|S)N __wrapped__)r0rriscoroutinefunctionfnr r r_is_wrapped_coroutine_functions rcsddlmt|D]\}}t|s2t|trt|dds|drt |sd}t|trh|j }d}t fdd}||}|rt|}d|_ t |||q|r|d dD]}|tkrt|dq|S) NrrF_maybe_async_appliedFZtest_Tcsj|f||Sr ) _maybe_asyncrargskwargsrFr r make_async0sz&_apply_maybe_async..make_asyncr)rHrGvarsr~callablerd classmethodr7rhr__func___pytest_fn_decoratorrsetattrmroobjectr)rZrecurser(valueZis_classmethodrZdo_asyncrpr rFrr!s8    rcCsd|jkr|gS|j}g}tjdd|DD]}i}tdd|D|D]>\}}|s^tdtd|}t||jD]\} } | || <qvqJd dd |D} d |j | f} t t | |f|} t || | || q.|S) z6implement a class-based version of pytest parametrize._sa_parametrizecSsg|] \}}|qSr r )rjargnameparamsr r rrlJsz$_parametrize_cls..cSsg|] }|dqS)rr )rjZ _sa_paramr r rrlOsz*need argnames for class-based combinationsz,\s*rccss2|]*}|jdD]}ttdd|VqqdS)-z\WN)idsplitstrresub)rjparamtokenr r rrmVsz#_parametrize_cls..z%s_%s)__dict__r itertoolsproductzip TypeErrorrrrjoinrtype__new__rrs)rqrprclassesZfull_param_setZ cls_variablesrrZ argname_splitargvalZparametrized_namer(Znewclsr r rrAs2         rcs`ddlmttjsdStdkr\tjj j j j j afdd}j j |dS)NrrFcsdatjjjjdSr )_current_classrKrZ stop_test_class_outside_fixturesrerpr rGrkr rfinalize|s z&pytest_runtest_setup..finalize) rHrGrdrfZFunctionrrKrZ!start_test_class_outside_fixturesrerpZ addfinalizer)rkrr rrpytest_runtest_setupgs    rcCs0ddlm}|tj||jjj|jj|j dSrE) rHrGrrZ before_testrerqrrpr()rkrGr r rpytest_runtest_calls rcCsddlm}|tj|dSrE)rHrGrrZ after_test)rknextitemrGr r rpytest_runtest_teardowns rclass)Zscopeccsrddlm}|j}t|dr(||jtr6t|dVtrJt |t|dr`||j |t j |dS)NrrFsetup_test_classteardown_test_class) rHrGrpr0rrr|rZrun_class_fixture_setupZrun_class_fixture_teardownrrZstop_test_class)requestrGrpr r rsetup_class_methodss       rfunctionccsddlm}|j}t|dr(||jt|dr>||jtrLt |dVtr`t ||t j |t|dr||j t|dr||jdS)NrrF setup_testsetUptearDown teardown_test)rHrGinstancer0rrrr|rZrun_fn_fixture_setupZrun_fn_fixture_teardownrZafter_test_fixturesrr)rrGr r r rsetup_test_methodss           rcCs$tjjdkrt|St|SdS)Nr)sys version_infomajorrgetfullargspec getargspecrr r rrs  rcs8ddlmddlmddd fdd }|S) z:Port of langhelpers.decorator with pytest-specific tricks.r)format_argspec_plus)inspect_getfullargspeccSst||||Sr )exec)codeenvfn_namer r r_exec_code_in_envs z/_pytest_fn_decorator.._exec_code_in_envr cs|}|r|j|tdd|jd}||ddd|}||d|j}|szt|d|j|_||_t||S|j |_ |j|_t |d r|j |_ |SdS) N __target_fn __orig_fn)rrr(F)ZgroupedzPdef %(name)s(%(args)s): return %(__target_fn)s(%(__orig_fn)s, %(apply_kw)s) )rrr pytestmark) rr{dictrupdater7 __defaults__rrrr0r)radd_positional_parametersspecmetadatarZ decoratedrrrtargetr rdecorate s6   z&_pytest_fn_decorator..decorate)r )Zsqlalchemy.util.langhelpersrZsqlalchemy.util.compatr)rrr rrrs   "rc@sZeZdZddZddZddeedddZd d Zd d Z d dZ ddZ ddZ dS)r8cOstjj||Sr )rfskip Exception)r rr)r r rskip_test_exception0sz*PytestFixtureFunctions.skip_test_exceptioncCstjddS)Nrr)rfmarkZ usefixturesr r r rmark_base_test_class3sz+PytestFixtureFunctions.mark_base_test_classcCs|Sr r rr r rra9rbzPytestFixtureFunctions.cCst|dr|jSt|jS)Nr)r0rrrr r rra<s)irsnc sddlmtjjdkr@t|dkrft|ddrft|d}n&t|dkrft|ddrft|d}|ddfd d }|d d}g}d |r6|j t j dd dt |D}fddt |D}|D]^t tsf|\}} ||dd} | rd|| | dfdd|DfqnD|D]>t tsPf|\}} | rfd||| dfq:g|D]6\} } }r| | f7} tj| d|i} | qfdd} | S)aFacade 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 exclusionsrr__next__nextargnamesNcs<g}g}|D]&}t|jr(||q ||q ||fSr )rdcompoundrs)rresultZgathered_exclusionsarr r_filter_exclusionsUs   z?PytestFixtureFunctions.combinations.._filter_exclusionsid_FcSsg|]\}}|dkr|qS))rrrrr rjidxcharr r rrllsz7PytestFixtureFunctions.combinations..cs*g|]"\}}|krt||fqSr )operator itemgetterr)_combination_id_fnsr rrlrsTrc3s|]\}}||VqdSr r )rjgetterZcomb_fn)rr rrmsz6PytestFixtureFunctions.combinations..rcst|r:rtdd|jkr&g|_|jf|SdkrVt|jdd}n t d}r|dg7}t fdd}dd }||d d }t j ||SdS) Nz5exclusions not supported for class level combinationsrrz, * _exclusionscs4|d}|r"j|}||}||dd|S)Nr)radd)rrr)rZexlurr rcheck_exclusionss zOPytestFixtureFunctions.combinations..decorate..check_exclusionscSs|jddS)Nr)rrs)rr r rprocess_metadataszOPytestFixtureFunctions.combinations..decorate..process_metadata)r)r)rrNotImplementedErrorrrrsrrrrrrfrZ parametrize)rZ _argnamesrr)rrhas_exclusions pytest_paramsr rrs,    z5PytestFixtureFunctions.combinations..decorate)r)rHrrrrlenr0r`r&rrr enumeraterdtuplersrrfr) r Zarg_setsr)rrZtobuild_pytest_paramsZ _arg_getterfnsZ fn_paramsZparam_exclusions parametersrrr )rrrrrrr combinationsAsn            $z#PytestFixtureFunctions.combinationscGs |d}tj|ddd|iS)Nrrr)rfr)r ridentr r r param_identsz"PytestFixtureFunctions.param_identcs|ddlmddlmt|dkrFt|drF|d}|dd}nd}tj|fdd}|rt||S|SdS)Nrr;rFrcs6jr|}tr*dkr*t|n|}|S)Nr>)rZ_maybe_async_wrapperr|rZ add_fixturerrGr<fixturer)r rwraps   z,PytestFixtureFunctions.fixture..wrap)rHr<rGrrrfr )r rr)rrr r rr s   zPytestFixtureFunctions.fixturecCs tjdS)NZPYTEST_CURRENT_TEST)r2environgetrr r rget_current_test_namesz,PytestFixtureFunctions.get_current_test_namecs$ddlmtfdd}||S)NrrFcsj|f||dSr )Z_run_coroutine_functionrrFr rrsz3PytestFixtureFunctions.async_test..decorate)rHrGr)r rrr rFr async_tests z!PytestFixtureFunctions.async_testN) rrrrrreprrrr r r rrr r r rr8/s  .r8)T)/Zsqla_plugin_baser ImportErrorrr'r^ functoolsrrrrr2rrrfZxdistZ has_xdistrr|Zsqla_reinvent_fixturesrr-r=r:r rDrJrLrTrXr[r]rrrrrrrrrrrrrZFixtureFunctionsr8r r r rsh     2    F #!    A/