+ 34vdZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlmZddl mZddl mZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddl)m*Z*ddl)m+Z+ddl)m,Z,ddl-Z.ddl/Z.ddl0Z.ddl1m2Z2ddl1m3Z3ddl4m5Z5dd l-m6Z6dd!l-m7Z7dd"l8m9Z9dd#l:m;Z;dd$l:mZ>dd&l=m?Z?dd'l@mAZAdd(l@mBZBdd)l@mCZCdd*l@mDZDdd+l@mEZEdd,lFmGZGdd-lHmIZIdd.lHmJZJe'rdd/lKmLZLdd0lMmNZNdd1lOmPZPeQZR e*d2ZSe+d2ZTe;Gd3d4ejUZVGd5d6eWZXd7e.jYjZd8e[fd9Z\ dd:e!e(e e]d;fdZ`Gd?d@ZadAe]dBe]d8e]fdCZbdAe]dBe]d8e]fdDZcdEZdeddFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]ge jed^krd_d`gngdaRzZfegefZhehidbehidc dd:e!e e]dz)_get_legacy_hook_marks..asOOOQVOOOrD pytestmark=Tz=TrueF, )rfullname hook_opts)rinspect isroutinegetattrAttributeErrorappendjoin_pytest deprecatedHOOK_LEGACY_MARKINGrRr;r.r r) rrr known_marks must_warnoptsopt_nameopt_attrrmessages rE_get_legacy_hook_marksrYsI ) (((((OOWV\2-N-NOOOKID # #68^<< > ) )   55855 6 6 6!DNN  $ $   /// 0 0 0!DNN"DNN?IIi(( $8??(@   $|V44g>>> KrDceZdZdZd/fd Zdedeffd Zdeffd Z d0dede ede effd Z defd Z dede fd Z d1dZdeeeefde de dede edeeefddfdZdede fdZdedeeefdeddfdZdedeeefdedeejfdZdededeeefdedeejeff dZdedeeefdedejfdZdejdeddfdZd d!deed"e ddfd#Zd$eddfd%Zd&ejddfd'Z d/d(Z!dejddfd)Z"d*edejeeefddfd+Z#d2d,ed-e ddfd.Z$xZ%S)3ra;A :py:class:`pluggy.PluginManager ` with additional pytest-specific functionality: * Loading plugins from the command line, ``PYTEST_PLUGINS`` env variable and ``pytest_plugins`` global variables found in plugins being loaded. * ``conftest.py`` loading during start-up. rJNcFddl}tdt|_i|_d|_d|_tdt|_ t|_ g|_ | |j ||tjdrt$j}t)|dd} t+tj||jd| }n#t2$rYnwxYw|jj|j||j |_!d|_"dS) Nrr2F PYTEST_DEBUGencodingutf8r)mode bufferingr)#_pytest.assertionrMrNset_conftest_plugins_dirpath2confmods _confcutdir _noconftestrr_duplicatepathsskipped_plugins add_hookspecshookspecrr]environgetrprqrrduprrrUtraceroot setwriterwriteenable_tracingrDummyRewriteHook rewrite_hook _configured)rOrerrrrPs rErNzPytestPluginManager.__init__s     """9<FH+/  -inn^<<*-%%79 7+,,, d :>>. ) ) ":C#CV<>@@ s7>> ==?? F[[)) F F88::F,,Q HEEE F F F FrDc|jrgS||}|j|}||Sg}t |g|jRD]\}||rE|dz }|r,||||} | | ]||j|<|S)Nz conftest.py) r rrrreversedrWrXr_importconftestr) rOrHrGrE directoryexisting_clistclistr conftestpathmods rErZz'PytestPluginManager._getconftestmodulesLs   I''-- /33I>>  %! !  >I,=>>?? & &F%%f-- &% 5 ''))&..|ZRRCLL%%%,1y) rDc||||}t|D]&} |t||fcS#t$rY#wxYwt |)N)rE)rZr_rrKeyError)rOrrHrGrEmodulesres rE_rget_with_confmodz&PytestPluginManager._rget_with_confmodgs**4h*OOG$$  C GC......!    tnns? A  A rdc|t|}|ttj|St |}|t |j t|||}nC#t$r6}|j Jt|||j f}t|||d}~wwxYw| |||j||j} | |jvrI|jD]/\} } | | jvs| | kr|| vsJ| |0|d||||S)N)rrzloading conftestmodule )r9rVr r5r6r+_ensure_removed_sysmodulestemr)rU __traceback__rrG_check_non_top_pytest_pluginsraddrritemsrWrrconsider_conftest) rOrdrGrEexistingpkgpathrerzr{dirpathrHmodss rEr`z#PytestPluginManager._importconftestvs??3|#4#455  ((33 3&|44 ? %l&7 8 8 8 Gl(KKKCC G G G?...QAO4H' h??Q F G **3 === ""3'''% d, , ,"4::<< % % ddl**dgood????KK$$$ 4S44555 s### s%A88 B81B33B8rect|dr<|jr7|js2d}t|||jddSdSdSdS)NrafDefining 'pytest_plugins' in a non-top-level conftest is no longer supported: It affects the entire test suite instead of just below the conftest as expected. {} Please move it to a top level conftest file at the rootdir: {} For more information, visit: https://docs.pytest.org/en/stable/deprecations.html#pytest-plugins-in-non-top-level-conftest-filesF)pytrace)hasattrrrJr%rRr)rOrerdrs rErnz1PytestPluginManager._check_non_top_pytest_pluginss C) * * L  L& L w  L$*:;;U K K K K K K L L L L L LrDFrrcd}t|}||kr||}|dz }t|tr|dkr! ||}n#t$rYdSwxYw|dz }n!|dr |dd}np|}|r|ds||||kdSdS)r?rrz-pNr5no:)lenrrV IndexErrorr"stripr)rOr`rrRnoptpargs rErz%PytestPluginManager.consider_preparses  II!eeq'C FA#s## .$;;#Aw%FAA^^D))qrr7DDzz||(>(>''---#!eeeeeesA AAargcZ|dr|dd}|tvrtd|z|dkr*|d|d|||ds|d|zdSdS|}|j|d |j|=|ds)|jd|zd  |jd|z=||d dS) r?rzr6Nzplugin %s cannot be disabledrrpytest_stepwiserrIT)consider_entry_points)r"essential_pluginsr set_blocked _name2pluginrr)rOrrs rErz&PytestPluginManager.consider_pluginargsY >>%  @qrr7D((( !?$!FGGG&&  ,,,  !2333   T " " "??9-- 3  T!122222 3 3D $$T2..6%d+??9-- <$((T)92>>F))d*:;   s$  ? ? ? ? ?rDconftestmodulec>|||jdS)r?rN)r__file__)rOrs rErqz%PytestPluginManager.consider_conftests! n>+B CCCCCrDcj|tjddS)r?PYTEST_PLUGINSN)_import_plugin_specsr]rrrSs rE consider_envz PytestPluginManager.consider_envs+ !!"*..1A"B"BCCCCCrDcN|t|dgdS)r?rN)rr)rOres rEr7z#PytestPluginManager.consider_modules) !!'#/?"D"DEEEEErDrcXt|}|D]}||dSrL)_get_plugin_specs_as_listr)rOrra import_specs rErz(PytestPluginManager._import_plugin_specssA,D11" , ,K   { + + + + , ,rDmodnamerct|ts Jd|z||s||dS|tvrd|zn|}|j||r|d|}|rdS t|tj |}| ||dS#t$r>}td|d|j d|j|d}~wt $r.}|j||jpd fYd}~dSd}~wwxYw) zImport a plugin with ``modname``. If ``consider_entry_points`` is True, entry point names are also considered to find a plugin. z$module name as text required, got %rNz_pytest.pytest11rzError importing plugin "z": r)rrV is_blockedr9builtin_pluginsr mark_rewriteload_setuptools_entrypoints __import__rprhr ImportErrorr`with_tracebackrmr&r rr)rOrr importspecloadedrerzs rErz!PytestPluginManager.import_plugins'3''  2W <  ' ??7 # # tw'?'?'K F-4-G-GZ'))W  &&z222  55jw5OOF  ( z " " "+j)C MM#w ' ' ' ' ' 5 5 5B7BBqvayBBnQ_--1 5 @ @ @  ' '!%+2(> ? ? ? ? ? ? ? ? ? @s$C E9D E #E  ErJNrL)rdrrJN)F)&r9r:r;r<rN _PluggyPluginrVr#r'rrr:r<r=rBrrrr*rUrXrNr5r6rZrrrir`rnrrrqrr7rrrWrXs@rErrysp3!3!3!3!3!3!j - s      .       <@#+3C= #.c +c+d++++    *'CuS$Y'('C'C 'C  'C TN 'C*c/*'C 'C'C'C'CR4d4t4444FF(-c:o(>FJNF FFFF&+CO&<HL %" #6   #z/*    u$ %     .3CO.DPT  >L  LL  LLLL6rCrSs rE__repr__zNotset.__repr__9szrDN)r9r:r;rrCrDrErr8s#rDr package_filesc#xKt|}d}|D]}d|vo|d}|ddko|d}|rDtj|\}}|dkr|dsd}|V|r%tj|}d}|V|sig}|D]K}|d} d | dd } | r| | L|rt|Ed {Vd Sd Sd S) aMGiven an iterable of file names in a source distribution, return the "names" that should be marked for assertion rewrite. For example the package "pytest_mock/__init__.py" should be added as "pytest_mock" in the assertion rewrite mechanism. This function has to deal with dist-info based distributions and egg based distributions (which are still very much in use for "editable" installs). Here are the file names as seen in a dist-info based distribution: pytest_mock/__init__.py pytest_mock/_version.py pytest_mock/plugin.py pytest_mock.egg-info/PKG-INFO Here are the file names as seen in an egg based distribution: src/pytest_mock/__init__.py src/pytest_mock/_version.py src/pytest_mock/plugin.py src/pytest_mock.egg-info/PKG-INFO LICENSE setup.py We have to take in account those two distribution flavors in order to determine which names should be considered for assertion rewriting. More information: https://github.com/pytest-dev/pytest-mock/issues/167 F/z.pyrz __init__.pysetup __editable__TN) rendswithcountr]rHsplitextr"dirnamer\rr_iter_rewritable_modules) r seen_somefnis_simple_module is_package module_namer* package_namenew_package_filespartsnew_fns rErr@s@''MI  b=?R[[-?-?XXc]]a'FBKK ,F,F  W--b11NKg%%k.D.D^.T.T% !!!!  7??2..LI     C  1 1BHHSMMEXXeABBi((F 1!((000  C/0ABB B B B B B B B B B C C C CrDceZdZdZeejdGddZGddej Z dd d e d e ed dfd Z ed efdZed e efdZdegdfd dfdZdPdZdPdZd efdZd e deed dfdZ dQdeede ejd dfdZded efdZ e!dRdZ"dSdZ#e$d dTd"Z%de&ed dfd#Z'de&ed dfd$Z(dPd%Z)deed&ed eefd'Z*deed(eed)eed*ed+ed,e+d e,eee ffd-Z-dUdeed.e+d dfd/Z.e$d0d e/d1fd2Z0dPd3Z1dPd4Z2dPd5Z3d6ed dfd7Z4d eefd8Z5dUdeed.e+d dfd9Z6d:e7d;e8d dfd<Z9d=ed>ed dfd?Z:d=efd@Z;d=edAedBed=edEed+ed e eefdFZ?d=ed e efdGZ@eAdHfd=edIe+fdJZBdQd=efdKZCdQd=efdLZDdMed dfdNZEdPdOZFdS)VraAccess to configuration values, pluginmanager and plugin hooks. :param PytestPluginManager pluginmanager: A pytest PluginManager. :param InvocationParams invocation_params: Object containing parameters regarding the :func:`pytest.main` invocation. T)frozenceZdZUdZeedfed< eee ee fed< e ed< de edeee ee fde ddfdZ dS) Config.InvocationParamsaHolds parameters passed during :func:`pytest.main`. The object attributes are read-only. .. versionadded:: 5.1 .. note:: Note that the environment variable ``PYTEST_ADDOPTS`` and the ``addopts`` ini option are handled by pytest, not being included in the ``args`` attribute. Plugins accessing ``InvocationParams`` must be aware of that. .r`rarrJNct|dt|t|d|t|d|dS)Nr`rar)object __setattr__tuple)rOr`rars rErNz Config.InvocationParams.__init__sX   tVU4[[ 9 9 9   tY 8 8 8   tUC 0 0 0 0 0rD)r9r:r;r<rrV__annotations__rrrrrrrNrCrDrErrs CHoJ(5m);#<=>>>>-  G 13- 1huS--?'@AB 1  1  1 1 1 1 1 1rDrcleZdZdZejZejZejZdS)Config.ArgsSourcezSIndicates the source of the test arguments. .. versionadded:: 7.2 N) r9r:r;r<enumautoARGSINCOVATION_DIR TESTPATHSrCrDrE ArgsSourcersA  ty{{"DIKK rDrNrrrrJc&ddlm}m}|)|ddt j}t j|_ ||_ |}|d|d|d|j d |_ ||_ t|_ |j|_dd lm}|j jjd |_||j j|_i|_d|_i|_g|_|j |d d |_|jjt=|j |j t>j j!|_"g|_#tHrddl%m&}d|_'dSdS)Nr)Parser FILE_OR_DIRrCrz%(prog)s [options] [z] [z] [...]T)usage processopt _ispytest)PathAwareHookProxyrd pytestconfigF)parserrr-r)Cache)( argparsingrrrrrargparse Namespaceoptionr _processopt_parserrr,stash_storecompatrrrrrk _inicache _override_ini _opt2dest_cleanuprrpytest_addoptionr3r4rrr args_sourcer`r_pytest.cacheproviderrcache)rOrrrr_arrs rErNzConfig.__init__s 43333333  $ $ 5 548::!6!! (**  "3 v;;;;;;'    + WW  j ......'-266x@@ &&t'9'>?? )+,.)+24  ##D.999  "00t|4;MNNN 1   ",1!  / 3 3 3 3 3 3*.DJJJ / /rDc|jS)znThe path to the :ref:`rootdir `. :type: pathlib.Path .. versionadded:: 6.1 ) _rootpathrSs rErEzConfig.rootpaths ~rDc|jS)zThe path to the :ref:`configfile `. :type: Optional[pathlib.Path] .. versionadded:: 6.1 )_inipathrSs rEinipathzConfig.inipath s }rDfuncc:|j|dS)zxAdd a function to be called when the config object gets out of use (usually coinciding with pytest_unconfigure).N)rr)rOrs rE add_cleanupzConfig.add_cleanups  T"""""rDc|jrJd|_tj5tjd|jjt|ddddS#1swxYwYdS)NTdefaultrcr-)rrcatch_warnings simplefilterrkrBr3r4rSs rE _do_configurezConfig._do_configures####  $ & & O O  !) , , , I & 4 4D %s ) rrurkpytest_internalerroranyrVr\rprqrr)rOrIrrgrresrrs rEnotify_exceptionzConfig.notify_exceptionHs  gfk599 %+EEE//gflE&J&JRW"  i,,Wg,NN3xx #G **400 # #   !6!=>>>   """" # # # #rDnodeidcx|jj|jkr$|j|z }t|jj|}|SrL)rrrEr()rOrfullpaths rEcwd_relative_nodeidzConfig.cwd_relative_nodeidZs;  ! % 6 6}v-H !7!;XFFF rDct|}|jj|||d|jjD]}|j||S)z$Constructor usable for subprocesses.Faddopts)rr__dict__updaterrarr)cls option_dictr`rdr]s rE fromdictargszConfig.fromdictargsassD!! %%k222 T5 )))& 7 7A  3 3A 6 6 6 6 rDrr1c|j|jzD]}|j|j|<t |dr4;"))+66'9=!* 6  k 114;#8C!*#8C#8C 2     rDc<|j|tj|j\}}t |j|j|z|jpd|\}}}||_||_ ||_ t|j |jj d<t|j|jj d<|jddd|jdd |jd d dg |jpd |_dS)N namespace)rootdir_cmd_argrdrootdirinifilerzExtra command line optionsr` minversionz!Minimally required pytest versionrequired_pluginsz.Plugins that must be present for pytest to run)rrrC)rparse_known_and_unknown_argscopyrr inifilenamer-r4rrinicfgrVrE extra_inforaddini override_inir)rOr`ns unknown_argsrErr;s rE_initinizConfig._initinis-<DD DIdk22E  L%4 N N\ )J.$ % % % !'6 "  -0-?-?  *-0->->  * I'CVLLL L*MNNN   <     _2rDc&|j|\}}t|dd}|dkrGddl} |j|}||n#t$rd}YnwxYw||dS)zInstall the PEP 302 import hook if using assertion rewriting. Needs to parse the --assert= option from the commandline and find all the installed plugins to mark them for rewriting by the importhook. assertmodeplainrewriterN) rr8rrrinstall_importhook_mark_plugins_for_rewrite SystemError_warn_about_missing_assertion)rOr`r?r@rrrks rE_consider_importhookzConfig._consider_importhooks <DDTJJLr<11 9   $ $ $ $ 5(;;DAA..t4444     **400000sA** A98A9c||j_tjdrdSdt jD}t|D]}||dS)zGiven an importhook, mark for rewrite any top-level modules or packages in the distribution package for all pytest plugins.PYTEST_DISABLE_PLUGIN_AUTOLOADNc3K|]=}td|jD |jpgD]}t|V>dS)c3,K|]}|jdkVdS)rN)group)reps rE z=Config._mark_plugins_for_rewrite...s)FFb28z)FFFFFFrDN)r entry_pointsfilesrV)rdistfiles rErQz3Config._mark_plugins_for_rewrite..s~  FFD4EFFFFF  (b    II       rD) rrr]rrr$ distributionsrr)rOrkrrs rErGz Config._mark_plugins_for_rewrites+/' :>>: ; ;  F  *8::   -];; $ $D   d # # # # $ $rDviac||j_ |j|tj|j|j`n #|j`wxYw|S)zValidate known args.r1)r_config_source_hintr8r9r)rOr`rWs rE_validate_argszConfig._validate_argssg+. ( 1 L 5 5 $+ 6 6 6    00 0 0 0 0 0 s 3A ArCr(r*rEr0c |rtjj}|}n||krtjj}|r|}nlg}|D]8} |t t j| d9|r*|s(|r&d} |t| dng}|s!tjj }t|g}||fS)zDecide the args (initial paths/nodeids) to use given the relevant inputs. :param warn: Whether can issue warnings. T) recursivezNo files were found in testpaths; consider removing or adjusting your testpaths configuration. Searching recursively from the current directory instead.r6 stacklevel) rrrrextendsortedr\iglobissue_config_time_warningr-rrV) rOr`rCr(r*rEr0sourceresultrH warning_texts rEr+zConfig._decide_argss  /&+FFF))*4&FFF )PP fTZ-M-M-M&N&NOOOO  !\) !:: 3L A Aa; /*9n--.v~rDrc|r_tjdd}t|r0|t j|d|z|dd<|||r1||dd|z|dd<|j |tj |j |_ ||||j|dtjd s|jd |j|j |tj |j |_ |||j jr&|t0jjd |j jA|jt;|jj}nt;|j}||j _ |j !|||j dS#tD$rQ}|j j#s |j j$r-|tKd|j&d nYd}~dSd}~wwxYw)NPYTEST_ADDOPTSrzvia PYTEST_ADDOPTSrzvia addopts configr1FrrLrr5r])r&r`rz"could not load initial conftests: )'r]rrr{rZshlexr\rAr.rparse_known_argsr9rr, _checkversionrJrrrr_validate_plugins_warn_about_skipped_pluginsstrictrbrr STRICT_OPTIONrFrrVrrErkr/rGrrr-rH)rOr`r env_addoptsrFrzs rE _preparsezConfig._preparses  *..)92>>K; '' K(@(@BVWWQQQ d  ##DKK $:$:?? G   : :: F F F '')))$(L$A$A DId&?@@%B% % !     ((***  $ +   * *"0Q +     $ / 7|' !455  // 3=D % 0  I 3 3!T\ 4     %   (- 1J1R ..'(UQV(U(UVV /   s"I== KAKK)r!)NNNc#:KdV|dSrL)_validate_config_optionsrSs rEpytest_collectionzConfig.pytest_collection=s)  %%'''''rDcFddl}|jdd}|r}ddlm}t |t s|d|jz||||j kr*||jd|d|j ddSdS)Nrr6Versionz'%s: 'minversion' must be a single valuez: 'minversion' requires pytest-z, actual pytest-') r2r;rpackaging.versionrvrrVrr __version__)rOr2minverrvs rErjzConfig._checkversionDs t44   1 1 1 1 1 1fc** ''= Lwv);!z,Config._validate_plugins..is#WWW4D-t|WWWrDT) prereleaseszMissing required plugins: {}r)r`r.rxrvpackaging.requirementsrrrlist_plugin_distinforr specifiercontainsrrRr) rOr7rvrr plugin_infoplugin_dist_infomissing_pluginsrequired_pluginreqs rErkzConfig._validate_plugins_s!$++.@"A"ABB  F .-----JJJJJJJJ(==?? WW;WWW/ 8 8O !k/22%   &&777 x///&&7777]++(233, 8 &&777  .55dii6P6PQQ   s! A--B  B rc|jjrt||t |ddS)Nr6r])r, strict_configrrbr-)rOrs rEr}zConfig._warn_or_fail_if_strictsG  $ 2 &W%% % &&':7'C'CPQ&RRRRRrDcB|jjfd|jDS)Ncg|]}|v| SrCrC)rr parser_inicfgs rE z0Config._get_unknown_ini_keys..s#JJJM0I0I0I0I0IrD)r_inidictr;)rOrs @rEr|zConfig._get_unknown_ini_keyss) - JJJJJJJJrDc.|jgks Jd|jjt |j||||j||d|j_ |j ||j |j }| ||j j|d|jj|jd \|_|_dS#t($rYdSwxYw) Nz:can only parse cmdline args at most once per Config object)rr-r)rdr`Tr1r(r))r`rkpytest_addhooksr3r4rrppytest_cmdline_preparserafter_preparseparse_setoptionrr+r,rCr.rrrErr)rOr`rs rErz Config.parses5 IOOO G OO !//d&8999 0    tW--- ))D)AAA&* # <//dkT[0D+/*;*;07++k22#59 +<++ 'DIt'''    DD s A;D DDwarningr^cN|jdrdS|jjpg}|d}t jd5}t jdt|t||t j ||dddn #1swxYwY|rntj |dz }|j j|j|j jf}|jjt)|d d d |  dSdS)aIssue and handle a warning during the "configure" stage. During ``pytest_configure`` we can't capture warnings using the ``catch_warnings_for_item`` function because it is not possible to have hookwrappers around ``pytest_configure``. This function is mainly intended for plugins that need to issue warnings during ``pytest_configure`` (or similar stages). :param warning: The warning instance. :param stacklevel: stacklevel forwarded to warnings.warn. rNfilterwarningsT)recordalwaysr]rrrdr)warning_messagewhenrlocationr-)rrr,pythonwarningsr.rrrrapply_warning_filtersr0rp _getframef_code co_filenamef_linenoco_namerkpytest_warning_recordedr3r4)rOrr^cmdline_filtersconfig_filtersrecordsframers rErbz Config.issue_config_time_warningsu   ( ( 4 4  F3BHb%566  $D 1 1 1 :W  !(DMM : : : !./ B B B M'j 9 9 9 9 : : : : : : : : : : : : : : :  M*q.11E|/AUUH I - ; ;$+AJ!%  <       sA B**B.1B.rrrc||}t|tsJ||dS)zAdd a line to an ini-file option. The option must have been declared but might not yet be set in which case the line becomes the first line in its value.N)r.rrr)rOrrrr]s rErAzConfig.addinivalue_lines> KK  !T""""" rDc |j|S#t$r$||x|j|<}|cYSwxYw)aReturn configuration value from an :ref:`ini file `. If the specified name hasn't been registered through a prior :func:`parser.addini ` call (usually from a plugin), a ValueError is raised. )rrg_getini)rOrvals rEr.z Config.getinisU >$' '   )-d);); ;DN4 3JJJ s +==rvaluec,d|}t||)Nzunknown configuration type: )rn)rOrrrrs rE_getini_unknown_typezConfig._getini_unknown_types3T33e$$$rDcV |jj|\}}}n%#t$r}td||d}~wwxYw||}|, |j|}n#t$r||cYS|YdSgcYSwxYw|}|dkrN|jJ|jj t|trtj |n|} fd|DS|dkr+t|trtj |n|S|dkrEt|tr.dtd| d DS|S|d kr.tt|S|d kr|S||S||||S) Nzunknown configuration value: rpathscg|]}|z SrCrC)rr]dps rErz"Config._getini..s111qBF111rDr`linelistcg|]}||SrCrC)rts rErz"Config._getini.. sTTTaRSTTTTrDc*|SrLr})r]s rEz Config._getini.. srDrir<string)rrrgrn_get_override_ini_valuer;rrrrVrhr\map _strtoboolr}r) rOr descriptionrrrzoverride_valuer input_valuesrs @rErzConfig._getinis N)-)>t)D &Kww N N NETEEFFA M N55d;;  !  D)   &"NNN<22  #E 7??<+++$B1;E31G1GR5;u---UL1111L111 1 V^^)3E3)?)?J5;u%%%U J Z  %%% TT3':':EKKA?rHc |j|||d|\}}n#t$rYdSwxYw|jJt |jj}g}|D]s}t|tj rt |}n2| dtj }t||z }| |t|S)NrGr)rri getoptionrgrrrrr]rr1r^r'r) rOrrHrErerelrootsmodpathvaluesrelroots rE_getconftest_pathlistzConfig._getconftest_pathlists  .AAdDNN<88(MC   44 |'''s|$$+ # #G'2;// :w--!//#rv66&w'899 MM' " " " " s36 AAcd}|jD]Y} |dd\}}||kr|}%#t$r(}td||d}~wwxYw|S)Nrrz9-o/--override-ini expects option=value style (got: {!r}).)rr\rnrrR)rOrr ini_configr~user_ini_valuerzs rErzConfig._get_override_ini_value-s, + +J +&0&6&6sA&>&>#^$;;*E    OVV"   s/ A!#AA!Fskipc6|j||} t|j|}||rt ||S#t$rG}|t ur|cYd}~S|rddl}|d|dtd||d}~wwxYw)aiReturn command line option value. :param name: Name of the option. You may also specify the literal ``--OPT`` option instead of the "dest" option name. :param default: Default value if no option of that name exists. :param skip: If True, raise pytest.skip if option does not exists or has a None value. Nrzno z option foundzno option named ) rrrrrnotsetr2rrn)rOrrrrrzr2s rErzConfig.getoption@s~!!$-- A$+t,,C{t{$T***J A A Af$$ 9  7$77788888899q @ As#)A B BB!2BBc,||S)z$Deprecated, use getoption() instead.rrOrrHs rEgetvaluezConfig.getvalueXs~~d###rDc0||dS)z-Deprecated, use getoption(skip=True) instead.T)rrrs rEgetvalueorskipzConfig.getvalueorskip\s~~d~...rDrcts1|dkrd}nd}|t|ddSdS)NrDzRASSERTIONS ARE NOT EXECUTED and FAILING TESTS WILL PASS. Are you using python -O?zassertions not in test modules or plugins will be ignored because assert statements are not executed by the underlying Python interpreter (are you using python -O?) r6r])_assertion_supportedrbr-)rOrres rErIz$Config._warn_about_missing_assertion`sp#%% w( 3  * *#L11 +       rDc ~|jjD]/\}}|td|d|d0dS)Nzskipped plugin : r5r])rr rbr-)rOrrs rErlz"Config._warn_about_skipped_pluginsusg $ 2 B   K  * *#$Lk$L$Ls$L$LMM +      rDrrL)rJr)rr1rJN)r&rrJN)T)Gr9r:r;r<r# dataclasses dataclassrrEnumrrrrNpropertyrrErr rrrmr"rrrVrr rrrrr classmethodr rhookimplr/rrArJrGrZr<rr+rpr rsrjrrrkr}r|rWarningintrbrAr.rrrrrrrrrrIrlrCrDrErrs [$'''1111111(' U1B      TY    "9= A/A/A/*A/$$45 A/  A/A/A/A/F$X$X#T 2#t#### OOOO$^$$$$ 08((( ( .LLLL@SsStSSSS KtCyKKKK$s)dd6!!c!d!!!!FS 3    %%C%c4PS9n@U%%%%4@C4@4@4@4@l#/3 $t* *CHSM&,2AAcAAAAA0$$S$$$$//3////#$*rDc* J#t$rYdSwxYw)NFT)AssertionErrorrCrDrErr}s.u tts  rdrUct|}|jjdkrd|_n|jjdkrd|_|jjdkrd|_n|jjdkrd|_|S)zCreate a TerminalWriter instance configured according to the options in the config object. Every code which requires a TerminalWriter object and has access to a config object should use this function. )rUyesTnoF)r"rcolor hasmarkupcode_highlight)rdrUr|s rEcreate_terminal_writerrs| T " " "B }e##   $ $  }#u,,   % - -! IrDrcf|}|dvrdS|dvrdStd|)aConvert a string representation of truth to True or False. True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if 'val' is anything else. .. note:: Copied from distutils.util. )yrrtrueon1T)r~rffalseoff0Fzinvalid truth value )lowerrn)rs rErrsJ ))++C 222t 5 5 5u777888rD2)maxsizerescapezwarnings._ActionKindc td}td|d}|d}t|dkrHd}tdt|d|d }t|| t|dkr(|d t|dk(d |D\}}} } } t j|} nG#t j$r5} t|t|  d } ~ wwxYw t| }nZ#t$rMtj }|d}t|| wxYw|r|rtj|}| r|rtj| dz} | ra t#| }|dkrt%dn=#t$$r.} t|d| d|  d } ~ wwxYwd}| ||| |fS)zParse a warnings filter string. This is copied from warnings._setoption with the following changes: * Does not apply the filter. * Escaping is optional. * Raises UsageError so we get nice error messages on failure. TzF while parsing the following warning configuration: z8 This error occurred: {error} :r8zJhttps://docs.python.org/3/library/warnings.html#describing-warning-filtersz Too many fields (z), expected at most 5 separated by colons: action:message:category:module:line For more information please consult: z )errorrc3>K|]}|VdSrLr)rss rErQz'parse_warning_filter..s*3M3M!AGGII3M3M3M3M3M3MrDNr )rgz\Zrznumber is negativezinvalid lineno r)rr\r{rrRrr _getaction _OptionErrorrV_resolve_warning_categoryrUr from_currentrurerrrn)rr__tracebackhide__error_templaterdoc_urlraction_r category_modulelineno_actionrzcategoryr{exception_textlinenos rEparse_warning_filterrs       N IIcNNE 5zzA~~ X  !%jj   3:      ..U.;;<<< e**q.. R e**q..3M3Mu3M3M3M0GWi>)1)>>..SVV.<<===>F";I"F"F FFF -//!)))99..^.DDEEEF%6%)G$$ +&+6""U*  \\Fzz !5666   %%,Ng,N,N1,N,N%OO    7Hff 44s=C))D-80D((D-1EAF$G66 H.)H))H.rc4d}|stSd|vrddl}|}n,|d\}}}t|dd|g}t ||}t |tst |dttt|S)z Copied from warnings._getcategory, but changed so it lets exceptions (specially ImportErrors) propagate so we can get access to their tracebacks (#9218). T.rNz is not a Warning subclass) rbuiltins rpartitionrr issubclassrr r)rrrklassr r*cats rErrs   (#..s335 vtTE7 3 3 !U  C c7 # #=C;;;<<< W s # ##rDrrc|D]}tjt|d |D]}tjt|d dS)z8Applies pytest-configured filters to the warnings moduleF)rTN)rrr)rrrs rErrsp JJ!5c%!H!H!HIIIII!5c$!G!G!GHHHIIrD)NN)rJrrL)~r<rcollections.abcrr9rrr\rr]rrhrpr5r functoolsrpathlibrtextwraprrrtypingrr r r r r rrrrrrrrrrrpluggyrrr _pytest._coder_pytest.deprecated_pytest.hookspec exceptionsrr findpathsrr r! _pytest._ior"_pytest.compatr#r$_pytest.outcomesr%r&_pytest.pathlibr'r(r)r*r+ _pytest.stashr,_pytest.warning_typesr-r._pytest._code.coder/_pytest.terminalr0rr1rrrr IntEnumr4rUrG_codeTracebackEntryr<r_rVrrrrrrr version_inforrrrorrrjrrrr6rrkrrrrrrrrrrrrCrDrEr1sA @@    !!!!!!!!!!!! ......000000&&&&&&''''''******&&&&&& ------!!!!!!$$$$$$((((((''''''''''''&&&&&&000000555555333333%222222111111$$$$$$  >( # # >( # #t|,      I    X = 'X XXXX<@=A-$-$ 5c$667 8-$ huS-%789 :-$ 3=-$-$-$-$`c$sSScc$        1'2584D4N4N/00TV3'45'':#o&&J)***!%=A 49  huS-%789 :2&&&&<@=A 5c$667 8 huS-%789 :@$ S#X #t)_ @^(^(^(^(^(-^(^(^(B  u'hsm; < #Y, s t     >CHSM>Chsm>C>C>C>CBx x x x x x x x vd.2 "6*09C9D9999$ 2D5 D5D5 !3W sC ?@D5D5D5D5N$$W $$$$, ISM I4