<!doctype html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>_pytest.python — SQLObject 3.7.0 documentation</title> <link rel="stylesheet" href="../../_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <script type="text/javascript" src="../../_static/documentation_options.js"></script> <script type="text/javascript" src="../../_static/jquery.js"></script> <script type="text/javascript" src="../../_static/underscore.js"></script> <script type="text/javascript" src="../../_static/doctools.js"></script> <script type="text/javascript" src="../../_static/bizstyle.js"></script> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <!--[if lt IE 9]> <script type="text/javascript" src="_static/css3-mediaqueries.js"></script> <![endif]--> </head><body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="nav-item nav-item-0"><a href="../../index.html">SQLObject 3.7.0 documentation</a> »</li> <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> »</li> </ul> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <div class="searchformwrapper"> <form class="search" action="../../search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <h1>Source code for _pytest.python</h1><div class="highlight"><pre> <span></span><span class="sd">""" Python test discovery, setup and run of test functions. """</span> <span class="kn">import</span> <span class="nn">fnmatch</span> <span class="kn">import</span> <span class="nn">inspect</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="nn">math</span> <span class="kn">from</span> <span class="nn">itertools</span> <span class="k">import</span> <span class="n">count</span> <span class="kn">import</span> <span class="nn">py</span> <span class="kn">import</span> <span class="nn">pytest</span> <span class="kn">from</span> <span class="nn">_pytest.mark</span> <span class="k">import</span> <span class="n">MarkerError</span> <span class="kn">import</span> <span class="nn">_pytest</span> <span class="kn">import</span> <span class="nn">_pytest._pluggy</span> <span class="k">as</span> <span class="nn">pluggy</span> <span class="kn">from</span> <span class="nn">_pytest</span> <span class="k">import</span> <span class="n">fixtures</span> <span class="kn">from</span> <span class="nn">_pytest.compat</span> <span class="k">import</span> <span class="p">(</span> <span class="n">isclass</span><span class="p">,</span> <span class="n">isfunction</span><span class="p">,</span> <span class="n">is_generator</span><span class="p">,</span> <span class="n">_escape_strings</span><span class="p">,</span> <span class="n">REGEX_TYPE</span><span class="p">,</span> <span class="n">STRING_TYPES</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">,</span> <span class="n">NOTSET</span><span class="p">,</span> <span class="n">get_real_func</span><span class="p">,</span> <span class="n">getfslineno</span><span class="p">,</span> <span class="n">safe_getattr</span><span class="p">,</span> <span class="n">getlocation</span><span class="p">,</span> <span class="n">enum</span><span class="p">,</span> <span class="p">)</span> <span class="n">cutdir1</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">pluggy</span><span class="o">.</span><span class="vm">__file__</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">"oc"</span><span class="p">))</span> <span class="n">cutdir2</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">_pytest</span><span class="o">.</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">dirpath</span><span class="p">()</span> <span class="n">cutdir3</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">py</span><span class="o">.</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">dirpath</span><span class="p">()</span> <span class="k">def</span> <span class="nf">filter_traceback</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span> <span class="sd">"""Return True if a TracebackEntry instance should be removed from tracebacks:</span> <span class="sd"> * dynamically generated code (no code to show up for it);</span> <span class="sd"> * internal traceback from pytest or its internal libraries, py and pluggy.</span> <span class="sd"> """</span> <span class="c1"># entry.path might sometimes return a str object when the entry</span> <span class="c1"># points to dynamically generated code</span> <span class="c1"># see https://bitbucket.org/pytest-dev/py/issues/71</span> <span class="n">raw_filename</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">frame</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">raw</span><span class="o">.</span><span class="n">co_filename</span> <span class="n">is_generated</span> <span class="o">=</span> <span class="s1">'<'</span> <span class="ow">in</span> <span class="n">raw_filename</span> <span class="ow">and</span> <span class="s1">'>'</span> <span class="ow">in</span> <span class="n">raw_filename</span> <span class="k">if</span> <span class="n">is_generated</span><span class="p">:</span> <span class="k">return</span> <span class="kc">False</span> <span class="c1"># entry.path might point to an inexisting file, in which case it will</span> <span class="c1"># alsso return a str object. see #1133</span> <span class="n">p</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="k">return</span> <span class="n">p</span> <span class="o">!=</span> <span class="n">cutdir1</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">p</span><span class="o">.</span><span class="n">relto</span><span class="p">(</span><span class="n">cutdir2</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">p</span><span class="o">.</span><span class="n">relto</span><span class="p">(</span><span class="n">cutdir3</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pyobj_property</span><span class="p">(</span><span class="n">name</span><span class="p">):</span> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">pytest</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span> <span class="n">node</span><span class="o">.</span><span class="n">obj</span> <span class="n">doc</span> <span class="o">=</span> <span class="s2">"python </span><span class="si">%s</span><span class="s2"> object this node was collected from (can be None)."</span> <span class="o">%</span> <span class="p">(</span> <span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),)</span> <span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">get</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">doc</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_addoption</span><span class="p">(</span><span class="n">parser</span><span class="p">):</span> <span class="n">group</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">getgroup</span><span class="p">(</span><span class="s2">"general"</span><span class="p">)</span> <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span><span class="s1">'--fixtures'</span><span class="p">,</span> <span class="s1">'--funcargs'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store_true"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"showfixtures"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"show available fixtures, sorted by plugin appearance"</span><span class="p">)</span> <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span> <span class="s1">'--fixtures-per-test'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store_true"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"show_fixtures_per_test"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"show fixtures per test"</span><span class="p">,</span> <span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">addini</span><span class="p">(</span><span class="s2">"usefixtures"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">"args"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[],</span> <span class="n">help</span><span class="o">=</span><span class="s2">"list of default fixtures to be used with this project"</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">addini</span><span class="p">(</span><span class="s2">"python_files"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">"args"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[</span><span class="s1">'test_*.py'</span><span class="p">,</span> <span class="s1">'*_test.py'</span><span class="p">],</span> <span class="n">help</span><span class="o">=</span><span class="s2">"glob-style file patterns for Python test module discovery"</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">addini</span><span class="p">(</span><span class="s2">"python_classes"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">"args"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[</span><span class="s2">"Test"</span><span class="p">,],</span> <span class="n">help</span><span class="o">=</span><span class="s2">"prefixes or glob names for Python test class discovery"</span><span class="p">)</span> <span class="n">parser</span><span class="o">.</span><span class="n">addini</span><span class="p">(</span><span class="s2">"python_functions"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">"args"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[</span><span class="s2">"test"</span><span class="p">,],</span> <span class="n">help</span><span class="o">=</span><span class="s2">"prefixes or glob names for Python test function and "</span> <span class="s2">"method discovery"</span><span class="p">)</span> <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span><span class="s2">"--import-mode"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">"prepend"</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="p">[</span><span class="s2">"prepend"</span><span class="p">,</span> <span class="s2">"append"</span><span class="p">],</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"importmode"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"prepend/append to sys.path when importing test modules, "</span> <span class="s2">"default is to prepend."</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_cmdline_main</span><span class="p">(</span><span class="n">config</span><span class="p">):</span> <span class="k">if</span> <span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">showfixtures</span><span class="p">:</span> <span class="n">showfixtures</span><span class="p">(</span><span class="n">config</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">show_fixtures_per_test</span><span class="p">:</span> <span class="n">show_fixtures_per_test</span><span class="p">(</span><span class="n">config</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">def</span> <span class="nf">pytest_generate_tests</span><span class="p">(</span><span class="n">metafunc</span><span class="p">):</span> <span class="c1"># those alternative spellings are common - raise a specific error to alert</span> <span class="c1"># the user</span> <span class="n">alt_spellings</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'parameterize'</span><span class="p">,</span> <span class="s1">'parametrise'</span><span class="p">,</span> <span class="s1">'parameterise'</span><span class="p">]</span> <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">alt_spellings</span><span class="p">:</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">metafunc</span><span class="o">.</span><span class="n">function</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span> <span class="n">msg</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{0}</span><span class="s2"> has '</span><span class="si">{1}</span><span class="s2">', spelling should be 'parametrize'"</span> <span class="k">raise</span> <span class="n">MarkerError</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">metafunc</span><span class="o">.</span><span class="n">function</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span> <span class="k">try</span><span class="p">:</span> <span class="n">markers</span> <span class="o">=</span> <span class="n">metafunc</span><span class="o">.</span><span class="n">function</span><span class="o">.</span><span class="n">parametrize</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">return</span> <span class="k">for</span> <span class="n">marker</span> <span class="ow">in</span> <span class="n">markers</span><span class="p">:</span> <span class="n">metafunc</span><span class="o">.</span><span class="n">parametrize</span><span class="p">(</span><span class="o">*</span><span class="n">marker</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">marker</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_configure</span><span class="p">(</span><span class="n">config</span><span class="p">):</span> <span class="n">config</span><span class="o">.</span><span class="n">addinivalue_line</span><span class="p">(</span><span class="s2">"markers"</span><span class="p">,</span> <span class="s2">"parametrize(argnames, argvalues): call a test function multiple "</span> <span class="s2">"times passing in different arguments in turn. argvalues generally "</span> <span class="s2">"needs to be a list of values if argnames specifies only one name "</span> <span class="s2">"or a list of tuples of values if argnames specifies multiple names. "</span> <span class="s2">"Example: @parametrize('arg1', [1,2]) would lead to two calls of the "</span> <span class="s2">"decorated test function, one with arg1=1 and another with arg1=2."</span> <span class="s2">"see http://pytest.org/latest/parametrize.html for more info and "</span> <span class="s2">"examples."</span> <span class="p">)</span> <span class="n">config</span><span class="o">.</span><span class="n">addinivalue_line</span><span class="p">(</span><span class="s2">"markers"</span><span class="p">,</span> <span class="s2">"usefixtures(fixturename1, fixturename2, ...): mark tests as needing "</span> <span class="s2">"all of the specified fixtures. see http://pytest.org/latest/fixture.html#usefixtures "</span> <span class="p">)</span> <span class="nd">@pytest</span><span class="o">.</span><span class="n">hookimpl</span><span class="p">(</span><span class="n">trylast</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_namespace</span><span class="p">():</span> <span class="n">raises</span><span class="o">.</span><span class="n">Exception</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="o">.</span><span class="n">Exception</span> <span class="k">return</span> <span class="p">{</span> <span class="s1">'raises'</span><span class="p">:</span> <span class="n">raises</span><span class="p">,</span> <span class="s1">'approx'</span><span class="p">:</span> <span class="n">approx</span><span class="p">,</span> <span class="s1">'collect'</span><span class="p">:</span> <span class="p">{</span> <span class="s1">'Module'</span><span class="p">:</span> <span class="n">Module</span><span class="p">,</span> <span class="s1">'Class'</span><span class="p">:</span> <span class="n">Class</span><span class="p">,</span> <span class="s1">'Instance'</span><span class="p">:</span> <span class="n">Instance</span><span class="p">,</span> <span class="s1">'Function'</span><span class="p">:</span> <span class="n">Function</span><span class="p">,</span> <span class="s1">'Generator'</span><span class="p">:</span> <span class="n">Generator</span><span class="p">,</span> <span class="p">}</span> <span class="p">}</span> <span class="nd">@pytest</span><span class="o">.</span><span class="n">hookimpl</span><span class="p">(</span><span class="n">trylast</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_pyfunc_call</span><span class="p">(</span><span class="n">pyfuncitem</span><span class="p">):</span> <span class="n">testfunction</span> <span class="o">=</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">obj</span> <span class="k">if</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">_isyieldedfunction</span><span class="p">():</span> <span class="n">testfunction</span><span class="p">(</span><span class="o">*</span><span class="n">pyfuncitem</span><span class="o">.</span><span class="n">_args</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">funcargs</span> <span class="o">=</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">funcargs</span> <span class="n">testargs</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">_fixtureinfo</span><span class="o">.</span><span class="n">argnames</span><span class="p">:</span> <span class="n">testargs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">funcargs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="n">testfunction</span><span class="p">(</span><span class="o">**</span><span class="n">testargs</span><span class="p">)</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">def</span> <span class="nf">pytest_collect_file</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span> <span class="n">ext</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">ext</span> <span class="k">if</span> <span class="n">ext</span> <span class="o">==</span> <span class="s2">".py"</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">parent</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">isinitpath</span><span class="p">(</span><span class="n">path</span><span class="p">):</span> <span class="k">for</span> <span class="n">pat</span> <span class="ow">in</span> <span class="n">parent</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getini</span><span class="p">(</span><span class="s1">'python_files'</span><span class="p">):</span> <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">fnmatch</span><span class="p">(</span><span class="n">pat</span><span class="p">):</span> <span class="k">break</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">ihook</span> <span class="o">=</span> <span class="n">parent</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">gethookproxy</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="k">return</span> <span class="n">ihook</span><span class="o">.</span><span class="n">pytest_pycollect_makemodule</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">parent</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_pycollect_makemodule</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span> <span class="k">return</span> <span class="n">Module</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span> <span class="nd">@pytest</span><span class="o">.</span><span class="n">hookimpl</span><span class="p">(</span><span class="n">hookwrapper</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_pycollect_makeitem</span><span class="p">(</span><span class="n">collector</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span> <span class="n">outcome</span> <span class="o">=</span> <span class="k">yield</span> <span class="n">res</span> <span class="o">=</span> <span class="n">outcome</span><span class="o">.</span><span class="n">get_result</span><span class="p">()</span> <span class="k">if</span> <span class="n">res</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span> <span class="c1"># nothing was collected elsewhere, let's do it here</span> <span class="k">if</span> <span class="n">isclass</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="k">if</span> <span class="n">collector</span><span class="o">.</span><span class="n">istestclass</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="n">Class</span> <span class="o">=</span> <span class="n">collector</span><span class="o">.</span><span class="n">_getcustomclass</span><span class="p">(</span><span class="s2">"Class"</span><span class="p">)</span> <span class="n">outcome</span><span class="o">.</span><span class="n">force_result</span><span class="p">(</span><span class="n">Class</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">collector</span><span class="p">))</span> <span class="k">elif</span> <span class="n">collector</span><span class="o">.</span><span class="n">istestfunction</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="c1"># mock seems to store unbound methods (issue473), normalize it</span> <span class="n">obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"__func__"</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span> <span class="c1"># We need to try and unwrap the function if it's a functools.partial</span> <span class="c1"># or a funtools.wrapped.</span> <span class="c1"># We musn't if it's been wrapped with mock.patch (python 2 only)</span> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">isfunction</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">or</span> <span class="n">isfunction</span><span class="p">(</span><span class="n">get_real_func</span><span class="p">(</span><span class="n">obj</span><span class="p">))):</span> <span class="n">collector</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">code</span><span class="o">=</span><span class="s2">"C2"</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span> <span class="s2">"cannot collect </span><span class="si">%r</span><span class="s2"> because it is not a function."</span> <span class="o">%</span> <span class="n">name</span><span class="p">,</span> <span class="p">)</span> <span class="k">elif</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"__test__"</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="k">if</span> <span class="n">is_generator</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="n">res</span> <span class="o">=</span> <span class="n">Generator</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">collector</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">res</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">collector</span><span class="o">.</span><span class="n">_genfunctions</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span> <span class="n">outcome</span><span class="o">.</span><span class="n">force_result</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_make_parametrize_id</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">class</span> <span class="nc">PyobjContext</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="n">module</span> <span class="o">=</span> <span class="n">pyobj_property</span><span class="p">(</span><span class="s2">"Module"</span><span class="p">)</span> <span class="bp">cls</span> <span class="o">=</span> <span class="n">pyobj_property</span><span class="p">(</span><span class="s2">"Class"</span><span class="p">)</span> <span class="n">instance</span> <span class="o">=</span> <span class="n">pyobj_property</span><span class="p">(</span><span class="s2">"Instance"</span><span class="p">)</span> <span class="k">class</span> <span class="nc">PyobjMixin</span><span class="p">(</span><span class="n">PyobjContext</span><span class="p">):</span> <span class="k">def</span> <span class="nf">obj</span><span class="p">():</span> <span class="k">def</span> <span class="nf">fget</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'_obj'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_obj</span> <span class="o">=</span> <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getobj</span><span class="p">()</span> <span class="k">return</span> <span class="n">obj</span> <span class="k">def</span> <span class="nf">fset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_obj</span> <span class="o">=</span> <span class="n">value</span> <span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">fget</span><span class="p">,</span> <span class="n">fset</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">"underlying python object"</span><span class="p">)</span> <span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span><span class="p">()</span> <span class="k">def</span> <span class="nf">_getobj</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="k">def</span> <span class="nf">getmodpath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stopatmodule</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">includemodule</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="sd">""" return python path relative to the containing module. """</span> <span class="n">chain</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">listchain</span><span class="p">()</span> <span class="n">chain</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span> <span class="n">parts</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">chain</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">Instance</span><span class="p">):</span> <span class="k">continue</span> <span class="n">name</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">Module</span><span class="p">):</span> <span class="k">assert</span> <span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">".py"</span><span class="p">)</span> <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[:</span><span class="o">-</span><span class="mi">3</span><span class="p">]</span> <span class="k">if</span> <span class="n">stopatmodule</span><span class="p">:</span> <span class="k">if</span> <span class="n">includemodule</span><span class="p">:</span> <span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">break</span> <span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="n">parts</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span> <span class="n">s</span> <span class="o">=</span> <span class="s2">"."</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">".["</span><span class="p">,</span> <span class="s2">"["</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_getfslineno</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="n">getfslineno</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span> <span class="k">def</span> <span class="nf">reportinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># XXX caching?</span> <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="n">compat_co_firstlineno</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'compat_co_firstlineno'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">compat_co_firstlineno</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span> <span class="c1"># nose compatibility</span> <span class="n">fspath</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="n">obj</span><span class="o">.</span><span class="vm">__module__</span><span class="p">]</span><span class="o">.</span><span class="vm">__file__</span> <span class="k">if</span> <span class="n">fspath</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">".pyc"</span><span class="p">):</span> <span class="n">fspath</span> <span class="o">=</span> <span class="n">fspath</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="n">lineno</span> <span class="o">=</span> <span class="n">compat_co_firstlineno</span> <span class="k">else</span><span class="p">:</span> <span class="n">fspath</span><span class="p">,</span> <span class="n">lineno</span> <span class="o">=</span> <span class="n">getfslineno</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="n">modpath</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getmodpath</span><span class="p">()</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="k">return</span> <span class="n">fspath</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">modpath</span> <span class="k">class</span> <span class="nc">PyCollector</span><span class="p">(</span><span class="n">PyobjMixin</span><span class="p">,</span> <span class="n">pytest</span><span class="o">.</span><span class="n">Collector</span><span class="p">):</span> <span class="k">def</span> <span class="nf">funcnamefilter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_matches_prefix_or_glob_option</span><span class="p">(</span><span class="s1">'python_functions'</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="k">def</span> <span class="nf">isnosetest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span> <span class="sd">""" Look for the __test__ attribute, which is applied by the</span> <span class="sd"> @nose.tools.istest decorator</span> <span class="sd"> """</span> <span class="c1"># We explicitly check for "is True" here to not mistakenly treat</span> <span class="c1"># classes with a custom __getattr__ returning something truthy (like a</span> <span class="c1"># function) as test classes.</span> <span class="k">return</span> <span class="n">safe_getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'__test__'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span> <span class="k">def</span> <span class="nf">classnamefilter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_matches_prefix_or_glob_option</span><span class="p">(</span><span class="s1">'python_classes'</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="k">def</span> <span class="nf">istestfunction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="k">return</span> <span class="p">(</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">funcnamefilter</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">isnosetest</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span> <span class="ow">and</span> <span class="n">safe_getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"__call__"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">getfixturemarker</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">istestclass</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">classnamefilter</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">isnosetest</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_matches_prefix_or_glob_option</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">option_name</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> checks if the given name matches the prefix or glob-pattern defined</span> <span class="sd"> in ini configuration.</span> <span class="sd"> """</span> <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getini</span><span class="p">(</span><span class="n">option_name</span><span class="p">):</span> <span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">option</span><span class="p">):</span> <span class="k">return</span> <span class="kc">True</span> <span class="c1"># check that name looks like a glob-string before calling fnmatch</span> <span class="c1"># because this is called for every name in each collected module,</span> <span class="c1"># and fnmatch is somewhat expensive to call</span> <span class="k">elif</span> <span class="p">(</span><span class="s1">'*'</span> <span class="ow">in</span> <span class="n">option</span> <span class="ow">or</span> <span class="s1">'?'</span> <span class="ow">in</span> <span class="n">option</span> <span class="ow">or</span> <span class="s1">'['</span> <span class="ow">in</span> <span class="n">option</span><span class="p">)</span> <span class="ow">and</span> \ <span class="n">fnmatch</span><span class="o">.</span><span class="n">fnmatch</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">option</span><span class="p">):</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"__test__"</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="k">return</span> <span class="p">[]</span> <span class="c1"># NB. we avoid random getattrs and peek in the __dict__ instead</span> <span class="c1"># (XXX originally introduced from a PyPy need, still true?)</span> <span class="n">dicts</span> <span class="o">=</span> <span class="p">[</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'__dict__'</span><span class="p">,</span> <span class="p">{})]</span> <span class="k">for</span> <span class="n">basecls</span> <span class="ow">in</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getmro</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="p">):</span> <span class="n">dicts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">basecls</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span> <span class="n">seen</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">l</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">dic</span> <span class="ow">in</span> <span class="n">dicts</span><span class="p">:</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">dic</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span> <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">seen</span><span class="p">:</span> <span class="k">continue</span> <span class="n">seen</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">makeitem</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span> <span class="k">if</span> <span class="n">res</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">continue</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span> <span class="n">res</span> <span class="o">=</span> <span class="p">[</span><span class="n">res</span><span class="p">]</span> <span class="n">l</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="n">l</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">item</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">reportinfo</span><span class="p">()[:</span><span class="mi">2</span><span class="p">])</span> <span class="k">return</span> <span class="n">l</span> <span class="k">def</span> <span class="nf">makeitem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span> <span class="c1">#assert self.ihook.fspath == self.fspath, self</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_pycollect_makeitem</span><span class="p">(</span> <span class="n">collector</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="n">obj</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_genfunctions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">funcobj</span><span class="p">):</span> <span class="n">module</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="n">Module</span><span class="p">)</span><span class="o">.</span><span class="n">obj</span> <span class="n">clscol</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="n">Class</span><span class="p">)</span> <span class="bp">cls</span> <span class="o">=</span> <span class="n">clscol</span> <span class="ow">and</span> <span class="n">clscol</span><span class="o">.</span><span class="n">obj</span> <span class="ow">or</span> <span class="kc">None</span> <span class="n">transfer_markers</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">module</span><span class="p">)</span> <span class="n">fm</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="n">fixtureinfo</span> <span class="o">=</span> <span class="n">fm</span><span class="o">.</span><span class="n">getfixtureinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcobj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="n">metafunc</span> <span class="o">=</span> <span class="n">Metafunc</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="n">fixtureinfo</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">,</span> <span class="bp">cls</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">module</span><span class="p">)</span> <span class="n">methods</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="s2">"pytest_generate_tests"</span><span class="p">):</span> <span class="n">methods</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">module</span><span class="o">.</span><span class="n">pytest_generate_tests</span><span class="p">)</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="s2">"pytest_generate_tests"</span><span class="p">):</span> <span class="n">methods</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">cls</span><span class="p">()</span><span class="o">.</span><span class="n">pytest_generate_tests</span><span class="p">)</span> <span class="k">if</span> <span class="n">methods</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_generate_tests</span><span class="o">.</span><span class="n">call_extra</span><span class="p">(</span><span class="n">methods</span><span class="p">,</span> <span class="nb">dict</span><span class="p">(</span><span class="n">metafunc</span><span class="o">=</span><span class="n">metafunc</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_generate_tests</span><span class="p">(</span><span class="n">metafunc</span><span class="o">=</span><span class="n">metafunc</span><span class="p">)</span> <span class="n">Function</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getcustomclass</span><span class="p">(</span><span class="s2">"Function"</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">metafunc</span><span class="o">.</span><span class="n">_calls</span><span class="p">:</span> <span class="k">yield</span> <span class="n">Function</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">fixtureinfo</span><span class="o">=</span><span class="n">fixtureinfo</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># add funcargs() as fixturedefs to fixtureinfo.arg2fixturedefs</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">add_funcarg_pseudo_fixture_def</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metafunc</span><span class="p">,</span> <span class="n">fm</span><span class="p">)</span> <span class="k">for</span> <span class="n">callspec</span> <span class="ow">in</span> <span class="n">metafunc</span><span class="o">.</span><span class="n">_calls</span><span class="p">:</span> <span class="n">subname</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">[</span><span class="si">%s</span><span class="s2">]"</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">callspec</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="k">yield</span> <span class="n">Function</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">subname</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">callspec</span><span class="o">=</span><span class="n">callspec</span><span class="p">,</span> <span class="n">callobj</span><span class="o">=</span><span class="n">funcobj</span><span class="p">,</span> <span class="n">fixtureinfo</span><span class="o">=</span><span class="n">fixtureinfo</span><span class="p">,</span> <span class="n">keywords</span><span class="o">=</span><span class="p">{</span><span class="n">callspec</span><span class="o">.</span><span class="n">id</span><span class="p">:</span><span class="kc">True</span><span class="p">},</span> <span class="n">originalname</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">_marked</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">mark</span><span class="p">):</span> <span class="sd">""" Returns True if :func: is already marked with :mark:, False otherwise.</span> <span class="sd"> This can happen if marker is applied to class and the test file is</span> <span class="sd"> invoked more than once.</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="n">func_mark</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">mark</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">return</span> <span class="n">mark</span><span class="o">.</span><span class="n">args</span> <span class="o">==</span> <span class="n">func_mark</span><span class="o">.</span><span class="n">args</span> <span class="ow">and</span> <span class="n">mark</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">==</span> <span class="n">func_mark</span><span class="o">.</span><span class="n">kwargs</span> <span class="k">def</span> <span class="nf">transfer_markers</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span> <span class="c1"># XXX this should rather be code in the mark plugin or the mark</span> <span class="c1"># plugin should merge with the python plugin.</span> <span class="k">for</span> <span class="n">holder</span> <span class="ow">in</span> <span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="n">pytestmark</span> <span class="o">=</span> <span class="n">holder</span><span class="o">.</span><span class="n">pytestmark</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">continue</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pytestmark</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span> <span class="k">for</span> <span class="n">mark</span> <span class="ow">in</span> <span class="n">pytestmark</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">_marked</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="n">mark</span><span class="p">):</span> <span class="n">mark</span><span class="p">(</span><span class="n">funcobj</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">_marked</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="n">pytestmark</span><span class="p">):</span> <span class="n">pytestmark</span><span class="p">(</span><span class="n">funcobj</span><span class="p">)</span> <span class="k">class</span> <span class="nc">Module</span><span class="p">(</span><span class="n">pytest</span><span class="o">.</span><span class="n">File</span><span class="p">,</span> <span class="n">PyCollector</span><span class="p">):</span> <span class="sd">""" Collector for test classes and functions. """</span> <span class="k">def</span> <span class="nf">_getobj</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_memoizedcall</span><span class="p">(</span><span class="s1">'_obj'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_importtestmodule</span><span class="p">)</span> <span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">parsefactories</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">Module</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span> <span class="k">def</span> <span class="nf">_importtestmodule</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># we assume we are only called once per module</span> <span class="n">importmode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getoption</span><span class="p">(</span><span class="s2">"--import-mode"</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">mod</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="o">.</span><span class="n">pyimport</span><span class="p">(</span><span class="n">ensuresyspath</span><span class="o">=</span><span class="n">importmode</span><span class="p">)</span> <span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">(</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span><span class="o">.</span><span class="n">getrepr</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="s2">"short"</span><span class="p">))</span> <span class="k">except</span> <span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="o">.</span><span class="n">ImportMismatchError</span><span class="p">:</span> <span class="n">e</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">(</span> <span class="s2">"import file mismatch:</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"imported module </span><span class="si">%r</span><span class="s2"> has this __file__ attribute:</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">" </span><span class="si">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"which is not the same as the test file we want to collect:</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">" </span><span class="si">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"HINT: remove __pycache__ / .pyc files and/or use a "</span> <span class="s2">"unique basename for your test file modules"</span> <span class="o">%</span> <span class="n">e</span><span class="o">.</span><span class="n">args</span> <span class="p">)</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">_pytest._code.code</span> <span class="k">import</span> <span class="n">ExceptionInfo</span> <span class="n">exc_info</span> <span class="o">=</span> <span class="n">ExceptionInfo</span><span class="p">()</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getoption</span><span class="p">(</span><span class="s1">'verbose'</span><span class="p">)</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">traceback</span> <span class="o">=</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">traceback</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">filter_traceback</span><span class="p">)</span> <span class="n">exc_repr</span> <span class="o">=</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">getrepr</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="s1">'short'</span><span class="p">)</span> <span class="k">if</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">traceback</span> <span class="k">else</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">exconly</span><span class="p">()</span> <span class="n">formatted_tb</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">_builtin</span><span class="o">.</span><span class="n">_totext</span><span class="p">(</span><span class="n">exc_repr</span><span class="p">)</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">(</span> <span class="s2">"ImportError while importing test module '</span><span class="si">{fspath}</span><span class="s2">'.</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"Hint: make sure your test modules/packages have valid Python names.</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"Traceback:</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="si">{traceback}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">fspath</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="p">,</span> <span class="n">traceback</span><span class="o">=</span><span class="n">formatted_tb</span><span class="p">)</span> <span class="p">)</span> <span class="k">except</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">runner</span><span class="o">.</span><span class="n">Skipped</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">allow_module_level</span><span class="p">:</span> <span class="k">raise</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">(</span> <span class="s2">"Using pytest.skip outside of a test is not allowed. If you are "</span> <span class="s2">"trying to decorate a test function, use the @pytest.mark.skip "</span> <span class="s2">"or @pytest.mark.skipif decorators instead."</span> <span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">pluginmanager</span><span class="o">.</span><span class="n">consider_module</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span> <span class="k">return</span> <span class="n">mod</span> <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">setup_module</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"setUpModule"</span><span class="p">)</span> <span class="k">if</span> <span class="n">setup_module</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">setup_module</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">"setup_module"</span><span class="p">)</span> <span class="k">if</span> <span class="n">setup_module</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">setup_module</span><span class="p">()</span> <span class="n">teardown_module</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'tearDownModule'</span><span class="p">)</span> <span class="k">if</span> <span class="n">teardown_module</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">teardown_module</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'teardown_module'</span><span class="p">)</span> <span class="k">if</span> <span class="n">teardown_module</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">addfinalizer</span><span class="p">(</span><span class="n">teardown_module</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_get_xunit_setup_teardown</span><span class="p">(</span><span class="n">holder</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">,</span> <span class="n">param_obj</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Return a callable to perform xunit-style setup or teardown if</span> <span class="sd"> the function exists in the ``holder`` object.</span> <span class="sd"> The ``param_obj`` parameter is the parameter which will be passed to the function</span> <span class="sd"> when the callable is called without arguments, defaults to the ``holder`` object.</span> <span class="sd"> Return ``None`` if a suitable callable is not found.</span> <span class="sd"> """</span> <span class="n">param_obj</span> <span class="o">=</span> <span class="n">param_obj</span> <span class="k">if</span> <span class="n">param_obj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">holder</span> <span class="n">result</span> <span class="o">=</span> <span class="n">_get_xunit_func</span><span class="p">(</span><span class="n">holder</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">)</span> <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">arg_count</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="vm">__code__</span><span class="o">.</span><span class="n">co_argcount</span> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">ismethod</span><span class="p">(</span><span class="n">result</span><span class="p">):</span> <span class="n">arg_count</span> <span class="o">-=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">arg_count</span><span class="p">:</span> <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">result</span><span class="p">(</span><span class="n">param_obj</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">result</span> <span class="k">def</span> <span class="nf">_get_xunit_func</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="sd">"""Return the attribute from the given object to be used as a setup/teardown</span> <span class="sd"> xunit-style function, but only if not marked as a fixture to</span> <span class="sd"> avoid calling it twice.</span> <span class="sd"> """</span> <span class="n">meth</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">getfixturemarker</span><span class="p">(</span><span class="n">meth</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span> <span class="n">meth</span> <span class="k">class</span> <span class="nc">Class</span><span class="p">(</span><span class="n">PyCollector</span><span class="p">):</span> <span class="sd">""" Collector for test methods. """</span> <span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="n">hasinit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"C1"</span><span class="p">,</span> <span class="s2">"cannot collect test class </span><span class="si">%r</span><span class="s2"> because it has a "</span> <span class="s2">"__init__ constructor"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="k">return</span> <span class="p">[]</span> <span class="k">elif</span> <span class="n">hasnew</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"C1"</span><span class="p">,</span> <span class="s2">"cannot collect test class </span><span class="si">%r</span><span class="s2"> because it has a "</span> <span class="s2">"__new__ constructor"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="k">return</span> <span class="p">[]</span> <span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_getcustomclass</span><span class="p">(</span><span class="s2">"Instance"</span><span class="p">)(</span><span class="n">name</span><span class="o">=</span><span class="s2">"()"</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">self</span><span class="p">)]</span> <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">setup_class</span> <span class="o">=</span> <span class="n">_get_xunit_func</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'setup_class'</span><span class="p">)</span> <span class="k">if</span> <span class="n">setup_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">setup_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">setup_class</span><span class="p">,</span> <span class="s1">'im_func'</span><span class="p">,</span> <span class="n">setup_class</span><span class="p">)</span> <span class="n">setup_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">setup_class</span><span class="p">,</span> <span class="s1">'__func__'</span><span class="p">,</span> <span class="n">setup_class</span><span class="p">)</span> <span class="n">setup_class</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span> <span class="n">fin_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'teardown_class'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">fin_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">fin_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">fin_class</span><span class="p">,</span> <span class="s1">'im_func'</span><span class="p">,</span> <span class="n">fin_class</span><span class="p">)</span> <span class="n">fin_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">fin_class</span><span class="p">,</span> <span class="s1">'__func__'</span><span class="p">,</span> <span class="n">fin_class</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">addfinalizer</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">fin_class</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">))</span> <span class="k">class</span> <span class="nc">Instance</span><span class="p">(</span><span class="n">PyCollector</span><span class="p">):</span> <span class="k">def</span> <span class="nf">_getobj</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">obj</span><span class="p">()</span> <span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">parsefactories</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">Instance</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span> <span class="k">def</span> <span class="nf">newinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getobj</span><span class="p">()</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="k">class</span> <span class="nc">FunctionMixin</span><span class="p">(</span><span class="n">PyobjMixin</span><span class="p">):</span> <span class="sd">""" mixin for the code common to Function and Generator.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" perform setup for this test function. """</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'_preservedparent'</span><span class="p">):</span> <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_preservedparent</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">Instance</span><span class="p">):</span> <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">newinstance</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getobj</span><span class="p">()</span> <span class="k">else</span><span class="p">:</span> <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">obj</span> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">ismethod</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">):</span> <span class="n">setup_name</span> <span class="o">=</span> <span class="s1">'setup_method'</span> <span class="n">teardown_name</span> <span class="o">=</span> <span class="s1">'teardown_method'</span> <span class="k">else</span><span class="p">:</span> <span class="n">setup_name</span> <span class="o">=</span> <span class="s1">'setup_function'</span> <span class="n">teardown_name</span> <span class="o">=</span> <span class="s1">'teardown_function'</span> <span class="n">setup_func_or_method</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">setup_name</span><span class="p">,</span> <span class="n">param_obj</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span> <span class="k">if</span> <span class="n">setup_func_or_method</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">setup_func_or_method</span><span class="p">()</span> <span class="n">teardown_func_or_method</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">teardown_name</span><span class="p">,</span> <span class="n">param_obj</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span> <span class="k">if</span> <span class="n">teardown_func_or_method</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">addfinalizer</span><span class="p">(</span><span class="n">teardown_func_or_method</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_prunetraceback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">excinfo</span><span class="p">):</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'_obj'</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">fulltrace</span><span class="p">:</span> <span class="n">code</span> <span class="o">=</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">Code</span><span class="p">(</span><span class="n">get_real_func</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">))</span> <span class="n">path</span><span class="p">,</span> <span class="n">firstlineno</span> <span class="o">=</span> <span class="n">code</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="n">code</span><span class="o">.</span><span class="n">firstlineno</span> <span class="n">traceback</span> <span class="o">=</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span> <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">cut</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">firstlineno</span><span class="o">=</span><span class="n">firstlineno</span><span class="p">)</span> <span class="k">if</span> <span class="n">ntraceback</span> <span class="o">==</span> <span class="n">traceback</span><span class="p">:</span> <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">ntraceback</span><span class="o">.</span><span class="n">cut</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span> <span class="k">if</span> <span class="n">ntraceback</span> <span class="o">==</span> <span class="n">traceback</span><span class="p">:</span> <span class="c1">#ntraceback = ntraceback.cut(excludepath=cutdir2)</span> <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">ntraceback</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">filter_traceback</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">ntraceback</span><span class="p">:</span> <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">traceback</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span> <span class="o">=</span> <span class="n">ntraceback</span><span class="o">.</span><span class="n">filter</span><span class="p">()</span> <span class="c1"># issue364: mark all but first and last frames to</span> <span class="c1"># only show a single-line message for each frame</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">tbstyle</span> <span class="o">==</span> <span class="s2">"auto"</span><span class="p">:</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span><span class="p">)</span> <span class="o">></span> <span class="mi">2</span><span class="p">:</span> <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span> <span class="n">entry</span><span class="o">.</span><span class="n">set_repr_style</span><span class="p">(</span><span class="s1">'short'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_repr_failure_py</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">excinfo</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s2">"long"</span><span class="p">):</span> <span class="k">if</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">errisinstance</span><span class="p">(</span><span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="o">.</span><span class="n">Exception</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">pytrace</span><span class="p">:</span> <span class="k">return</span> <span class="n">py</span><span class="o">.</span><span class="n">_builtin</span><span class="o">.</span><span class="n">_totext</span><span class="p">(</span><span class="n">excinfo</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">FunctionMixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">_repr_failure_py</span><span class="p">(</span><span class="n">excinfo</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="n">style</span><span class="p">)</span> <span class="k">def</span> <span class="nf">repr_failure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">excinfo</span><span class="p">,</span> <span class="n">outerr</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">assert</span> <span class="n">outerr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">"XXX outerr usage is deprecated"</span> <span class="n">style</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">tbstyle</span> <span class="k">if</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">"auto"</span><span class="p">:</span> <span class="n">style</span> <span class="o">=</span> <span class="s2">"long"</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_repr_failure_py</span><span class="p">(</span><span class="n">excinfo</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="n">style</span><span class="p">)</span> <span class="k">class</span> <span class="nc">Generator</span><span class="p">(</span><span class="n">FunctionMixin</span><span class="p">,</span> <span class="n">PyCollector</span><span class="p">):</span> <span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># test generators are seen as collectors but they also</span> <span class="c1"># invoke setup/teardown on popular request</span> <span class="c1"># (induced by the common "test_*" naming shared with normal tests)</span> <span class="kn">from</span> <span class="nn">_pytest</span> <span class="k">import</span> <span class="n">deprecated</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_setupstate</span><span class="o">.</span><span class="n">prepare</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="c1"># see FunctionMixin.setup and test_setupstate_is_preserved_134</span> <span class="bp">self</span><span class="o">.</span><span class="n">_preservedparent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">obj</span> <span class="n">l</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">seen</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">()):</span> <span class="n">name</span><span class="p">,</span> <span class="n">call</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getcallargs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">callable</span><span class="p">(</span><span class="n">call</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"</span><span class="si">%r</span><span class="s2"> yielded non callable test </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="n">call</span><span class="p">,))</span> <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"[</span><span class="si">%d</span><span class="s2">]"</span> <span class="o">%</span> <span class="n">i</span> <span class="k">else</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"['</span><span class="si">%s</span><span class="s2">']"</span> <span class="o">%</span> <span class="n">name</span> <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">seen</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"</span><span class="si">%r</span><span class="s2"> generated tests with non-unique name </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span> <span class="n">seen</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">l</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Function</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">callobj</span><span class="o">=</span><span class="n">call</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s1">'C1'</span><span class="p">,</span> <span class="n">deprecated</span><span class="o">.</span><span class="n">YIELD_TESTS</span><span class="p">,</span> <span class="n">fslocation</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="p">)</span> <span class="k">return</span> <span class="n">l</span> <span class="k">def</span> <span class="nf">getcallargs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span> <span class="n">obj</span> <span class="o">=</span> <span class="p">(</span><span class="n">obj</span><span class="p">,)</span> <span class="c1"># explicit naming</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">_basestring</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="n">obj</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="k">else</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">call</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="n">obj</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">obj</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">call</span><span class="p">,</span> <span class="n">args</span> <span class="k">def</span> <span class="nf">hasinit</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="n">init</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'__init__'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">init</span><span class="p">:</span> <span class="k">return</span> <span class="n">init</span> <span class="o">!=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__init__</span> <span class="k">def</span> <span class="nf">hasnew</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="n">new</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'__new__'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">new</span><span class="p">:</span> <span class="k">return</span> <span class="n">new</span> <span class="o">!=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__new__</span> <span class="k">class</span> <span class="nc">CallSpec2</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metafunc</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">metafunc</span> <span class="o">=</span> <span class="n">metafunc</span> <span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span> <span class="o">=</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalid</span> <span class="o">=</span> <span class="n">NOTSET</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalid_args</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="o">=</span> <span class="n">NOTSET</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2scopenum</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># used for sorting parametrized resources</span> <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">indices</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metafunc</span><span class="p">):</span> <span class="n">cs</span> <span class="o">=</span> <span class="n">CallSpec2</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">metafunc</span><span class="p">)</span> <span class="n">cs</span><span class="o">.</span><span class="n">funcargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span><span class="p">)</span> <span class="n">cs</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span> <span class="n">cs</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="p">)</span> <span class="n">cs</span><span class="o">.</span><span class="n">indices</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">indices</span><span class="p">)</span> <span class="n">cs</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">)</span> <span class="n">cs</span><span class="o">.</span><span class="n">_idlist</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span><span class="p">)</span> <span class="n">cs</span><span class="o">.</span><span class="n">_globalid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalid</span> <span class="n">cs</span><span class="o">.</span><span class="n">_globalid_args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalid_args</span> <span class="n">cs</span><span class="o">.</span><span class="n">_globalparam</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="k">return</span> <span class="n">cs</span> <span class="k">def</span> <span class="nf">_checkargnotcontained</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span> <span class="k">if</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="ow">or</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"duplicate </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span><span class="p">(</span><span class="n">arg</span><span class="p">,))</span> <span class="k">def</span> <span class="nf">getparam</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="ow">is</span> <span class="n">NOTSET</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s2">"-"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">filter</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span><span class="p">)))</span> <span class="k">def</span> <span class="nf">setmulti</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">valtypes</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">keywords</span><span class="p">,</span> <span class="n">scopenum</span><span class="p">,</span> <span class="n">param_index</span><span class="p">):</span> <span class="k">for</span> <span class="n">arg</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">valset</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_checkargnotcontained</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="n">valtype_for_arg</span> <span class="o">=</span> <span class="n">valtypes</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">valtype_for_arg</span><span class="p">)[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> <span class="bp">self</span><span class="o">.</span><span class="n">indices</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">param_index</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">scopenum</span> <span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">keywords</span><span class="p">)</span> <span class="k">def</span> <span class="nf">setall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcargs</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">param</span><span class="p">):</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">funcargs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_checkargnotcontained</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">funcargs</span><span class="p">)</span> <span class="k">if</span> <span class="nb">id</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOTSET</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOTSET</span><span class="p">:</span> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="ow">is</span> <span class="n">NOTSET</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="o">=</span> <span class="n">param</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">funcargs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">scopenum_function</span> <span class="k">class</span> <span class="nc">Metafunc</span><span class="p">(</span><span class="n">fixtures</span><span class="o">.</span><span class="n">FuncargnamesCompatAttr</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Metafunc objects are passed to the ``pytest_generate_tests`` hook.</span> <span class="sd"> They help to inspect a test function and to generate tests according to</span> <span class="sd"> test configuration or values specified in the class or module where a</span> <span class="sd"> test function is defined.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">function</span><span class="p">,</span> <span class="n">fixtureinfo</span><span class="p">,</span> <span class="n">config</span><span class="p">,</span> <span class="bp">cls</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="c1">#: access to the :class:`_pytest.config.Config` object for the test session</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">config</span> <span class="c1">#: the module object where the test function is defined in.</span> <span class="bp">self</span><span class="o">.</span><span class="n">module</span> <span class="o">=</span> <span class="n">module</span> <span class="c1">#: underlying python test function</span> <span class="bp">self</span><span class="o">.</span><span class="n">function</span> <span class="o">=</span> <span class="n">function</span> <span class="c1">#: set of fixture names required by the test function</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span> <span class="o">=</span> <span class="n">fixtureinfo</span><span class="o">.</span><span class="n">names_closure</span> <span class="c1">#: class object where the test function is defined in or ``None``.</span> <span class="bp">self</span><span class="o">.</span><span class="n">cls</span> <span class="o">=</span> <span class="bp">cls</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calls</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ids</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">set</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span> <span class="o">=</span> <span class="n">fixtureinfo</span><span class="o">.</span><span class="n">name2fixturedefs</span> <span class="k">def</span> <span class="nf">parametrize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">argvalues</span><span class="p">,</span> <span class="n">indirect</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ids</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">""" Add new invocations to the underlying test function using the list</span> <span class="sd"> of argvalues for the given argnames. Parametrization is performed</span> <span class="sd"> during the collection phase. If you need to setup expensive resources</span> <span class="sd"> see about setting indirect to do it rather at test setup time.</span> <span class="sd"> :arg argnames: a comma-separated string denoting one or more argument</span> <span class="sd"> names, or a list/tuple of argument strings.</span> <span class="sd"> :arg argvalues: The list of argvalues determines how often a</span> <span class="sd"> test is invoked with different argument values. If only one</span> <span class="sd"> argname was specified argvalues is a list of values. If N</span> <span class="sd"> argnames were specified, argvalues must be a list of N-tuples,</span> <span class="sd"> where each tuple-element specifies a value for its respective</span> <span class="sd"> argname.</span> <span class="sd"> :arg indirect: The list of argnames or boolean. A list of arguments'</span> <span class="sd"> names (subset of argnames). If True the list contains all names from</span> <span class="sd"> the argnames. Each argvalue corresponding to an argname in this list will</span> <span class="sd"> be passed as request.param to its respective argname fixture</span> <span class="sd"> function so that it can perform more expensive setups during the</span> <span class="sd"> setup phase of a test rather than at collection time.</span> <span class="sd"> :arg ids: list of string ids, or a callable.</span> <span class="sd"> If strings, each is corresponding to the argvalues so that they are</span> <span class="sd"> part of the test id. If None is given as id of specific test, the</span> <span class="sd"> automatically generated id for that argument will be used.</span> <span class="sd"> If callable, it should take one argument (a single argvalue) and return</span> <span class="sd"> a string or return None. If None, the automatically generated id for that</span> <span class="sd"> argument will be used.</span> <span class="sd"> If no ids are provided they will be generated automatically from</span> <span class="sd"> the argvalues.</span> <span class="sd"> :arg scope: if specified it denotes the scope of the parameters.</span> <span class="sd"> The scope is used for grouping tests by parameter instances.</span> <span class="sd"> It will also override any fixture-function defined scope, allowing</span> <span class="sd"> to set a dynamic scope using test context or configuration.</span> <span class="sd"> """</span> <span class="kn">from</span> <span class="nn">_pytest.fixtures</span> <span class="k">import</span> <span class="n">scope2index</span> <span class="kn">from</span> <span class="nn">_pytest.mark</span> <span class="k">import</span> <span class="n">extract_argvalue</span> <span class="kn">from</span> <span class="nn">py.io</span> <span class="k">import</span> <span class="n">saferepr</span> <span class="n">unwrapped_argvalues</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">newkeywords</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">maybe_marked_args</span> <span class="ow">in</span> <span class="n">argvalues</span><span class="p">:</span> <span class="n">argval</span><span class="p">,</span> <span class="n">newmarks</span> <span class="o">=</span> <span class="n">extract_argvalue</span><span class="p">(</span><span class="n">maybe_marked_args</span><span class="p">)</span> <span class="n">unwrapped_argvalues</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">argval</span><span class="p">)</span> <span class="n">newkeywords</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">newmarks</span><span class="p">)</span> <span class="n">argvalues</span> <span class="o">=</span> <span class="n">unwrapped_argvalues</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span> <span class="n">argnames</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">argnames</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">","</span><span class="p">)</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">argnames</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">argvalues</span> <span class="o">=</span> <span class="p">[(</span><span class="n">val</span><span class="p">,)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">argvalues</span><span class="p">]</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">argvalues</span><span class="p">:</span> <span class="n">argvalues</span> <span class="o">=</span> <span class="p">[(</span><span class="n">NOTSET</span><span class="p">,)</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">argnames</span><span class="p">)]</span> <span class="c1"># we passed a empty list to parameterize, skip that test</span> <span class="c1">#</span> <span class="n">fs</span><span class="p">,</span> <span class="n">lineno</span> <span class="o">=</span> <span class="n">getfslineno</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="p">)</span> <span class="n">newmark</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">mark</span><span class="o">.</span><span class="n">skip</span><span class="p">(</span> <span class="n">reason</span><span class="o">=</span><span class="s2">"got empty parameter set </span><span class="si">%r</span><span class="s2">, function </span><span class="si">%s</span><span class="s2"> at </span><span class="si">%s</span><span class="s2">:</span><span class="si">%d</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span> <span class="n">argnames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">fs</span><span class="p">,</span> <span class="n">lineno</span><span class="p">))</span> <span class="n">newkeywords</span> <span class="o">=</span> <span class="p">[{</span><span class="n">newmark</span><span class="o">.</span><span class="n">markname</span><span class="p">:</span> <span class="n">newmark</span><span class="p">}]</span> <span class="k">if</span> <span class="n">scope</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">scope</span> <span class="o">=</span> <span class="n">_find_parametrized_scope</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="p">,</span> <span class="n">indirect</span><span class="p">)</span> <span class="n">scopenum</span> <span class="o">=</span> <span class="n">scope2index</span><span class="p">(</span> <span class="n">scope</span><span class="p">,</span> <span class="n">descr</span><span class="o">=</span><span class="s1">'call to </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parametrize</span><span class="p">))</span> <span class="n">valtypes</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">argnames</span><span class="p">:</span> <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">indirect</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'fixture'</span> <span class="k">if</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">indirect</span> <span class="k">else</span> <span class="s1">'argument'</span> <span class="k">else</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'fixture'</span> <span class="k">if</span> <span class="n">indirect</span> <span class="k">else</span> <span class="s1">'argument'</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s2">"</span><span class="si">%r</span><span class="s2"> uses no </span><span class="si">%s</span><span class="s2"> </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span> <span class="k">if</span> <span class="n">indirect</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span> <span class="n">valtypes</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="s2">"params"</span><span class="p">)</span> <span class="k">elif</span> <span class="n">indirect</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span> <span class="n">valtypes</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="s2">"funcargs"</span><span class="p">)</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">indirect</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span> <span class="n">valtypes</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="s2">"funcargs"</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">indirect</span><span class="p">:</span> <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">argnames</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"indirect given to </span><span class="si">%r</span><span class="s2">: fixture </span><span class="si">%r</span><span class="s2"> doesn't exist"</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span> <span class="n">valtypes</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"params"</span> <span class="n">idfn</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">ids</span><span class="p">):</span> <span class="n">idfn</span> <span class="o">=</span> <span class="n">ids</span> <span class="n">ids</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="n">ids</span><span class="p">:</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">argvalues</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'</span><span class="si">%d</span><span class="s1"> tests specified with </span><span class="si">%d</span><span class="s1"> ids'</span> <span class="o">%</span><span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="n">argvalues</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">)))</span> <span class="k">for</span> <span class="n">id_value</span> <span class="ow">in</span> <span class="n">ids</span><span class="p">:</span> <span class="k">if</span> <span class="n">id_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">id_value</span><span class="p">,</span> <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">_basestring</span><span class="p">):</span> <span class="n">msg</span> <span class="o">=</span> <span class="s1">'ids must be list of strings, found: </span><span class="si">%s</span><span class="s1"> (type: </span><span class="si">%s</span><span class="s1">)'</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="p">(</span><span class="n">saferepr</span><span class="p">(</span><span class="n">id_value</span><span class="p">),</span> <span class="nb">type</span><span class="p">(</span><span class="n">id_value</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span> <span class="n">ids</span> <span class="o">=</span> <span class="n">idmaker</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">argvalues</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">ids</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">)</span> <span class="n">newcalls</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">callspec</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calls</span> <span class="ow">or</span> <span class="p">[</span><span class="n">CallSpec2</span><span class="p">(</span><span class="bp">self</span><span class="p">)]:</span> <span class="n">elements</span> <span class="o">=</span> <span class="nb">zip</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">argvalues</span><span class="p">,</span> <span class="n">newkeywords</span><span class="p">,</span> <span class="n">count</span><span class="p">())</span> <span class="k">for</span> <span class="n">a_id</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="n">keywords</span><span class="p">,</span> <span class="n">param_index</span> <span class="ow">in</span> <span class="n">elements</span><span class="p">:</span> <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">valset</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">argnames</span><span class="p">)</span> <span class="n">newcallspec</span> <span class="o">=</span> <span class="n">callspec</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="n">newcallspec</span><span class="o">.</span><span class="n">setmulti</span><span class="p">(</span><span class="n">valtypes</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="n">a_id</span><span class="p">,</span> <span class="n">keywords</span><span class="p">,</span> <span class="n">scopenum</span><span class="p">,</span> <span class="n">param_index</span><span class="p">)</span> <span class="n">newcalls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">newcallspec</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calls</span> <span class="o">=</span> <span class="n">newcalls</span> <span class="k">def</span> <span class="nf">addcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcargs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">NOTSET</span><span class="p">,</span> <span class="n">param</span><span class="o">=</span><span class="n">NOTSET</span><span class="p">):</span> <span class="sd">""" (deprecated, use parametrize) Add a new call to the underlying</span> <span class="sd"> test function during the collection phase of a test run. Note that</span> <span class="sd"> request.addcall() is called during the test collection phase prior and</span> <span class="sd"> independently to actual test execution. You should only use addcall()</span> <span class="sd"> if you need to specify multiple arguments of a test function.</span> <span class="sd"> :arg funcargs: argument keyword dictionary used when invoking</span> <span class="sd"> the test function.</span> <span class="sd"> :arg id: used for reporting and identification purposes. If you</span> <span class="sd"> don't supply an `id` an automatic unique id will be generated.</span> <span class="sd"> :arg param: a parameter which will be exposed to a later fixture function</span> <span class="sd"> invocation through the ``request.param`` attribute.</span> <span class="sd"> """</span> <span class="k">assert</span> <span class="n">funcargs</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">funcargs</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="k">if</span> <span class="n">funcargs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">funcargs</span><span class="p">:</span> <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span><span class="p">:</span> <span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="s2">"funcarg </span><span class="si">%r</span><span class="s2"> not used in this function."</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">funcargs</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="nb">id</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"id=None not allowed"</span><span class="p">)</span> <span class="k">if</span> <span class="nb">id</span> <span class="ow">is</span> <span class="n">NOTSET</span><span class="p">:</span> <span class="nb">id</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_calls</span><span class="p">)</span> <span class="nb">id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span> <span class="k">if</span> <span class="nb">id</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ids</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"duplicate id </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">id</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span> <span class="n">cs</span> <span class="o">=</span> <span class="n">CallSpec2</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="n">cs</span><span class="o">.</span><span class="n">setall</span><span class="p">(</span><span class="n">funcargs</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_find_parametrized_scope</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">arg2fixturedefs</span><span class="p">,</span> <span class="n">indirect</span><span class="p">):</span> <span class="sd">"""Find the most appropriate scope for a parametrized call based on its arguments.</span> <span class="sd"> When there's at least one direct argument, always use "function" scope.</span> <span class="sd"> When a test function is parametrized and all its arguments are indirect</span> <span class="sd"> (e.g. fixtures), return the most narrow scope based on the fixtures used.</span> <span class="sd"> Related to issue #1832, based on code posted by @Kingdread.</span> <span class="sd"> """</span> <span class="kn">from</span> <span class="nn">_pytest.fixtures</span> <span class="k">import</span> <span class="n">scopes</span> <span class="n">indirect_as_list</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">indirect</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">))</span> <span class="n">all_arguments_are_fixtures</span> <span class="o">=</span> <span class="n">indirect</span> <span class="ow">is</span> <span class="kc">True</span> <span class="ow">or</span> \ <span class="n">indirect_as_list</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">indirect</span><span class="p">)</span> <span class="o">==</span> <span class="n">argnames</span> <span class="k">if</span> <span class="n">all_arguments_are_fixtures</span><span class="p">:</span> <span class="n">fixturedefs</span> <span class="o">=</span> <span class="n">arg2fixturedefs</span> <span class="ow">or</span> <span class="p">{}</span> <span class="n">used_scopes</span> <span class="o">=</span> <span class="p">[</span><span class="n">fixturedef</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">scope</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">fixturedef</span> <span class="ow">in</span> <span class="n">fixturedefs</span><span class="o">.</span><span class="n">items</span><span class="p">()]</span> <span class="k">if</span> <span class="n">used_scopes</span><span class="p">:</span> <span class="c1"># Takes the most narrow scope from used fixtures</span> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">scopes</span><span class="p">):</span> <span class="k">if</span> <span class="n">scope</span> <span class="ow">in</span> <span class="n">used_scopes</span><span class="p">:</span> <span class="k">return</span> <span class="n">scope</span> <span class="k">return</span> <span class="s1">'function'</span> <span class="k">def</span> <span class="nf">_idval</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="n">idfn</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">idfn</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">if</span> <span class="n">s</span><span class="p">:</span> <span class="k">return</span> <span class="n">_escape_strings</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="k">pass</span> <span class="k">if</span> <span class="n">config</span><span class="p">:</span> <span class="n">hook_id</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">hook</span><span class="o">.</span><span class="n">pytest_make_parametrize_id</span><span class="p">(</span><span class="n">config</span><span class="o">=</span><span class="n">config</span><span class="p">,</span> <span class="n">val</span><span class="o">=</span><span class="n">val</span><span class="p">)</span> <span class="k">if</span> <span class="n">hook_id</span><span class="p">:</span> <span class="k">return</span> <span class="n">hook_id</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">STRING_TYPES</span><span class="p">):</span> <span class="k">return</span> <span class="n">_escape_strings</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="p">(</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">)):</span> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">REGEX_TYPE</span><span class="p">):</span> <span class="k">return</span> <span class="n">_escape_strings</span><span class="p">(</span><span class="n">val</span><span class="o">.</span><span class="n">pattern</span><span class="p">)</span> <span class="k">elif</span> <span class="n">enum</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">enum</span><span class="o">.</span><span class="n">Enum</span><span class="p">):</span> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">elif</span> <span class="n">isclass</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="s1">'__name__'</span><span class="p">):</span> <span class="k">return</span> <span class="n">val</span><span class="o">.</span><span class="vm">__name__</span> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">argname</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_idvalset</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">ids</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="n">ids</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="p">(</span><span class="n">idx</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">)</span> <span class="ow">or</span> <span class="n">ids</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span> <span class="n">this_id</span> <span class="o">=</span> <span class="p">[</span><span class="n">_idval</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span><span class="p">,</span> <span class="n">argname</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">valset</span><span class="p">,</span> <span class="n">argnames</span><span class="p">)]</span> <span class="k">return</span> <span class="s2">"-"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">this_id</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">_escape_strings</span><span class="p">(</span><span class="n">ids</span><span class="p">[</span><span class="n">idx</span><span class="p">])</span> <span class="k">def</span> <span class="nf">idmaker</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">argvalues</span><span class="p">,</span> <span class="n">idfn</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ids</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="n">ids</span> <span class="o">=</span> <span class="p">[</span><span class="n">_idvalset</span><span class="p">(</span><span class="n">valindex</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">ids</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span> <span class="k">for</span> <span class="n">valindex</span><span class="p">,</span> <span class="n">valset</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">argvalues</span><span class="p">)]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">ids</span><span class="p">))</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">):</span> <span class="c1"># The ids are not unique</span> <span class="n">duplicates</span> <span class="o">=</span> <span class="p">[</span><span class="n">testid</span> <span class="k">for</span> <span class="n">testid</span> <span class="ow">in</span> <span class="n">ids</span> <span class="k">if</span> <span class="n">ids</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">testid</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">]</span> <span class="n">counters</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="mi">0</span><span class="p">)</span> <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">testid</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">ids</span><span class="p">):</span> <span class="k">if</span> <span class="n">testid</span> <span class="ow">in</span> <span class="n">duplicates</span><span class="p">:</span> <span class="n">ids</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">testid</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">counters</span><span class="p">[</span><span class="n">testid</span><span class="p">])</span> <span class="n">counters</span><span class="p">[</span><span class="n">testid</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">return</span> <span class="n">ids</span> <span class="k">def</span> <span class="nf">show_fixtures_per_test</span><span class="p">(</span><span class="n">config</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">_pytest.main</span> <span class="k">import</span> <span class="n">wrap_session</span> <span class="k">return</span> <span class="n">wrap_session</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">_show_fixtures_per_test</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_show_fixtures_per_test</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span> <span class="kn">import</span> <span class="nn">_pytest.config</span> <span class="n">session</span><span class="o">.</span><span class="n">perform_collect</span><span class="p">()</span> <span class="n">curdir</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">()</span> <span class="n">tw</span> <span class="o">=</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">create_terminal_writer</span><span class="p">(</span><span class="n">config</span><span class="p">)</span> <span class="n">verbose</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">getvalue</span><span class="p">(</span><span class="s2">"verbose"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_best_rel</span><span class="p">(</span><span class="n">func</span><span class="p">):</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">getlocation</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">curdir</span><span class="p">)</span> <span class="k">return</span> <span class="n">curdir</span><span class="o">.</span><span class="n">bestrelpath</span><span class="p">(</span><span class="n">loc</span><span class="p">)</span> <span class="k">def</span> <span class="nf">write_fixture</span><span class="p">(</span><span class="n">fixture_def</span><span class="p">):</span> <span class="n">argname</span> <span class="o">=</span> <span class="n">fixture_def</span><span class="o">.</span><span class="n">argname</span> <span class="k">if</span> <span class="n">verbose</span> <span class="o"><=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">argname</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"_"</span><span class="p">):</span> <span class="k">return</span> <span class="k">if</span> <span class="n">verbose</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span> <span class="n">bestrel</span> <span class="o">=</span> <span class="n">get_best_rel</span><span class="p">(</span><span class="n">fixture_def</span><span class="o">.</span><span class="n">func</span><span class="p">)</span> <span class="n">funcargspec</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{0}</span><span class="s2"> -- </span><span class="si">{1}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="n">bestrel</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">funcargspec</span> <span class="o">=</span> <span class="n">argname</span> <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">funcargspec</span><span class="p">,</span> <span class="n">green</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="n">INDENT</span> <span class="o">=</span> <span class="s1">' </span><span class="si">{0}</span><span class="s1">'</span> <span class="n">fixture_doc</span> <span class="o">=</span> <span class="n">fixture_def</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__doc__</span> <span class="k">if</span> <span class="n">fixture_doc</span><span class="p">:</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">fixture_doc</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">):</span> <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">INDENT</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()))</span> <span class="k">else</span><span class="p">:</span> <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">INDENT</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">'no docstring available'</span><span class="p">),</span> <span class="n">red</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">write_item</span><span class="p">(</span><span class="n">item</span><span class="p">):</span> <span class="n">name2fixturedefs</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">_fixtureinfo</span><span class="o">.</span><span class="n">name2fixturedefs</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">name2fixturedefs</span><span class="p">:</span> <span class="c1"># The given test item does not use any fixtures</span> <span class="k">return</span> <span class="n">bestrel</span> <span class="o">=</span> <span class="n">get_best_rel</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">function</span><span class="p">)</span> <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">()</span> <span class="n">tw</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">'-'</span><span class="p">,</span> <span class="s1">'fixtures used by </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">))</span> <span class="n">tw</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">'-'</span><span class="p">,</span> <span class="s1">'(</span><span class="si">{0}</span><span class="s1">)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">bestrel</span><span class="p">))</span> <span class="k">for</span> <span class="n">argname</span><span class="p">,</span> <span class="n">fixture_defs</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">name2fixturedefs</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span> <span class="k">assert</span> <span class="n">fixture_defs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">fixture_defs</span><span class="p">:</span> <span class="k">continue</span> <span class="c1"># The last fixture def item in the list is expected</span> <span class="c1"># to be the one used by the test item</span> <span class="n">write_fixture</span><span class="p">(</span><span class="n">fixture_defs</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">session</span><span class="o">.</span><span class="n">items</span><span class="p">:</span> <span class="n">write_item</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">def</span> <span class="nf">showfixtures</span><span class="p">(</span><span class="n">config</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">_pytest.main</span> <span class="k">import</span> <span class="n">wrap_session</span> <span class="k">return</span> <span class="n">wrap_session</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">_showfixtures_main</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_showfixtures_main</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span> <span class="kn">import</span> <span class="nn">_pytest.config</span> <span class="n">session</span><span class="o">.</span><span class="n">perform_collect</span><span class="p">()</span> <span class="n">curdir</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">()</span> <span class="n">tw</span> <span class="o">=</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">create_terminal_writer</span><span class="p">(</span><span class="n">config</span><span class="p">)</span> <span class="n">verbose</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">getvalue</span><span class="p">(</span><span class="s2">"verbose"</span><span class="p">)</span> <span class="n">fm</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="n">available</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">seen</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="k">for</span> <span class="n">argname</span><span class="p">,</span> <span class="n">fixturedefs</span> <span class="ow">in</span> <span class="n">fm</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="k">assert</span> <span class="n">fixturedefs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">fixturedefs</span><span class="p">:</span> <span class="k">continue</span> <span class="k">for</span> <span class="n">fixturedef</span> <span class="ow">in</span> <span class="n">fixturedefs</span><span class="p">:</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">getlocation</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">func</span><span class="p">,</span> <span class="n">curdir</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">argname</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span> <span class="ow">in</span> <span class="n">seen</span><span class="p">:</span> <span class="k">continue</span> <span class="n">seen</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">argname</span><span class="p">,</span> <span class="n">loc</span><span class="p">))</span> <span class="n">available</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">baseid</span><span class="p">),</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="n">curdir</span><span class="o">.</span><span class="n">bestrelpath</span><span class="p">(</span><span class="n">loc</span><span class="p">),</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">argname</span><span class="p">,</span> <span class="n">fixturedef</span><span class="p">))</span> <span class="n">available</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> <span class="n">currentmodule</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">for</span> <span class="n">baseid</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="n">bestrel</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="n">fixturedef</span> <span class="ow">in</span> <span class="n">available</span><span class="p">:</span> <span class="k">if</span> <span class="n">currentmodule</span> <span class="o">!=</span> <span class="n">module</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">module</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"_pytest."</span><span class="p">):</span> <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">()</span> <span class="n">tw</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s2">"-"</span><span class="p">,</span> <span class="s2">"fixtures defined from </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span><span class="p">(</span><span class="n">module</span><span class="p">,))</span> <span class="n">currentmodule</span> <span class="o">=</span> <span class="n">module</span> <span class="k">if</span> <span class="n">verbose</span> <span class="o"><=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">argname</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"_"</span><span class="p">:</span> <span class="k">continue</span> <span class="k">if</span> <span class="n">verbose</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span> <span class="n">funcargspec</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> -- </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span><span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="n">bestrel</span><span class="p">,)</span> <span class="k">else</span><span class="p">:</span> <span class="n">funcargspec</span> <span class="o">=</span> <span class="n">argname</span> <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">funcargspec</span><span class="p">,</span> <span class="n">green</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">getlocation</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">func</span><span class="p">,</span> <span class="n">curdir</span><span class="p">)</span> <span class="n">doc</span> <span class="o">=</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__doc__</span> <span class="ow">or</span> <span class="s2">""</span> <span class="k">if</span> <span class="n">doc</span><span class="p">:</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">doc</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">):</span> <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="s2">" "</span> <span class="o">+</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span> <span class="k">else</span><span class="p">:</span> <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="s2">" </span><span class="si">%s</span><span class="s2">: no docstring available"</span> <span class="o">%</span><span class="p">(</span><span class="n">loc</span><span class="p">,),</span> <span class="n">red</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># builtin pytest.raises helper</span> <div class="viewcode-block" id="raises"><a class="viewcode-back" href="../../api/sqlobject.tests.dbtest.html#sqlobject.tests.dbtest.raises">[docs]</a><span class="k">def</span> <span class="nf">raises</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Assert that a code block/function call raises ``expected_exception``</span> <span class="sd"> and raise a failure exception otherwise.</span> <span class="sd"> This helper produces a ``ExceptionInfo()`` object (see below).</span> <span class="sd"> If using Python 2.5 or above, you may use this function as a</span> <span class="sd"> context manager::</span> <span class="sd"> >>> with raises(ZeroDivisionError):</span> <span class="sd"> ... 1/0</span> <span class="sd"> .. versionchanged:: 2.10</span> <span class="sd"> In the context manager form you may use the keyword argument</span> <span class="sd"> ``message`` to specify a custom failure message::</span> <span class="sd"> >>> with raises(ZeroDivisionError, message="Expecting ZeroDivisionError"):</span> <span class="sd"> ... pass</span> <span class="sd"> Traceback (most recent call last):</span> <span class="sd"> ...</span> <span class="sd"> Failed: Expecting ZeroDivisionError</span> <span class="sd"> .. note::</span> <span class="sd"> When using ``pytest.raises`` as a context manager, it's worthwhile to</span> <span class="sd"> note that normal context manager rules apply and that the exception</span> <span class="sd"> raised *must* be the final line in the scope of the context manager.</span> <span class="sd"> Lines of code after that, within the scope of the context manager will</span> <span class="sd"> not be executed. For example::</span> <span class="sd"> >>> value = 15</span> <span class="sd"> >>> with raises(ValueError) as exc_info:</span> <span class="sd"> ... if value > 10:</span> <span class="sd"> ... raise ValueError("value must be <= 10")</span> <span class="sd"> ... assert str(exc_info.value) == "value must be <= 10" # this will not execute</span> <span class="sd"> Instead, the following approach must be taken (note the difference in</span> <span class="sd"> scope)::</span> <span class="sd"> >>> with raises(ValueError) as exc_info:</span> <span class="sd"> ... if value > 10:</span> <span class="sd"> ... raise ValueError("value must be <= 10")</span> <span class="sd"> ...</span> <span class="sd"> >>> assert str(exc_info.value) == "value must be <= 10"</span> <span class="sd"> Or you can specify a callable by passing a to-be-called lambda::</span> <span class="sd"> >>> raises(ZeroDivisionError, lambda: 1/0)</span> <span class="sd"> <ExceptionInfo ...></span> <span class="sd"> or you can specify an arbitrary callable with arguments::</span> <span class="sd"> >>> def f(x): return 1/x</span> <span class="sd"> ...</span> <span class="sd"> >>> raises(ZeroDivisionError, f, 0)</span> <span class="sd"> <ExceptionInfo ...></span> <span class="sd"> >>> raises(ZeroDivisionError, f, x=0)</span> <span class="sd"> <ExceptionInfo ...></span> <span class="sd"> A third possibility is to use a string to be executed::</span> <span class="sd"> >>> raises(ZeroDivisionError, "f(0)")</span> <span class="sd"> <ExceptionInfo ...></span> <span class="sd"> .. autoclass:: _pytest._code.ExceptionInfo</span> <span class="sd"> :members:</span> <span class="sd"> .. note::</span> <span class="sd"> Similar to caught exception objects in Python, explicitly clearing</span> <span class="sd"> local references to returned ``ExceptionInfo`` objects can</span> <span class="sd"> help the Python interpreter speed up its garbage collection.</span> <span class="sd"> Clearing those references breaks a reference cycle</span> <span class="sd"> (``ExceptionInfo`` --> caught exception --> frame stack raising</span> <span class="sd"> the exception --> current frame stack --> local variables --></span> <span class="sd"> ``ExceptionInfo``) which makes Python keep all objects referenced</span> <span class="sd"> from that cycle (including all local variables in the current</span> <span class="sd"> frame) alive until the next cyclic garbage collection run. See the</span> <span class="sd"> official Python ``try`` statement documentation for more detailed</span> <span class="sd"> information.</span> <span class="sd"> """</span> <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">expected_exception</span> <span class="ow">is</span> <span class="ne">AssertionError</span><span class="p">:</span> <span class="c1"># we want to catch a AssertionError</span> <span class="c1"># replace our subclass with the builtin one</span> <span class="c1"># see https://github.com/pytest-dev/pytest/issues/176</span> <span class="kn">from</span> <span class="nn">_pytest.assertion.util</span> <span class="k">import</span> <span class="n">BuiltinAssertionError</span> \ <span class="k">as</span> <span class="n">expected_exception</span> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"exceptions must be old-style classes or"</span> <span class="s2">" derived from BaseException, not </span><span class="si">%s</span><span class="s2">"</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span> <span class="k">for</span> <span class="n">exc</span> <span class="ow">in</span> <span class="n">expected_exception</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">isclass</span><span class="p">(</span><span class="n">exc</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="n">exc</span><span class="p">))</span> <span class="k">elif</span> <span class="ow">not</span> <span class="n">isclass</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">))</span> <span class="n">message</span> <span class="o">=</span> <span class="s2">"DID NOT RAISE </span><span class="si">{0}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span> <span class="k">if</span> <span class="s2">"message"</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span> <span class="n">message</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"message"</span><span class="p">)</span> <span class="k">return</span> <span class="n">RaisesContext</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">str</span><span class="p">):</span> <span class="n">code</span><span class="p">,</span> <span class="o">=</span> <span class="n">args</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="n">frame</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">_getframe</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_locals</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="n">loc</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="c1">#print "raises frame scope: %r" % frame.f_locals</span> <span class="k">try</span><span class="p">:</span> <span class="n">code</span> <span class="o">=</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">Source</span><span class="p">(</span><span class="n">code</span><span class="p">)</span><span class="o">.</span><span class="n">compile</span><span class="p">()</span> <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">exec_</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span> <span class="c1"># XXX didn'T mean f_globals == f_locals something special?</span> <span class="c1"># this is destroyed here ...</span> <span class="k">except</span> <span class="n">expected_exception</span><span class="p">:</span> <span class="k">return</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span> <span class="k">else</span><span class="p">:</span> <span class="n">func</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">try</span><span class="p">:</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">except</span> <span class="n">expected_exception</span><span class="p">:</span> <span class="k">return</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span> <span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">message</span><span class="p">)</span> </div> <span class="k">class</span> <span class="nc">RaisesContext</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_exception</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_exception</span> <span class="o">=</span> <span class="n">expected_exception</span> <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span> <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span> <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">tp</span><span class="p">):</span> <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">tp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">)</span> <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o"><</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">):</span> <span class="c1"># py26: on __exit__() exc_value often does not contain the</span> <span class="c1"># exception value.</span> <span class="c1"># http://bugs.python.org/issue7853</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tp</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="ne">BaseException</span><span class="p">):</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">traceback</span> <span class="o">=</span> <span class="n">tp</span> <span class="n">tp</span> <span class="o">=</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">traceback</span> <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">tp</span><span class="p">)</span> <span class="n">suppress_exception</span> <span class="o">=</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_exception</span><span class="p">)</span> <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">suppress_exception</span><span class="p">:</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_clear</span><span class="p">()</span> <span class="k">return</span> <span class="n">suppress_exception</span> <span class="c1"># builtin pytest.approx helper</span> <span class="k">class</span> <span class="nc">approx</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Assert that two numbers (or two sets of numbers) are equal to each other</span> <span class="sd"> within some tolerance.</span> <span class="sd"> Due to the `intricacies of floating-point arithmetic`__, numbers that we</span> <span class="sd"> would intuitively expect to be equal are not always so::</span> <span class="sd"> >>> 0.1 + 0.2 == 0.3</span> <span class="sd"> False</span> <span class="sd"> __ https://docs.python.org/3/tutorial/floatingpoint.html</span> <span class="sd"> This problem is commonly encountered when writing tests, e.g. when making</span> <span class="sd"> sure that floating-point values are what you expect them to be. One way to</span> <span class="sd"> deal with this problem is to assert that two floating-point numbers are</span> <span class="sd"> equal to within some appropriate tolerance::</span> <span class="sd"> >>> abs((0.1 + 0.2) - 0.3) < 1e-6</span> <span class="sd"> True</span> <span class="sd"> However, comparisons like this are tedious to write and difficult to</span> <span class="sd"> understand. Furthermore, absolute comparisons like the one above are</span> <span class="sd"> usually discouraged because there's no tolerance that works well for all</span> <span class="sd"> situations. ``1e-6`` is good for numbers around ``1``, but too small for</span> <span class="sd"> very big numbers and too big for very small ones. It's better to express</span> <span class="sd"> the tolerance as a fraction of the expected value, but relative comparisons</span> <span class="sd"> like that are even more difficult to write correctly and concisely.</span> <span class="sd"> The ``approx`` class performs floating-point comparisons using a syntax</span> <span class="sd"> that's as intuitive as possible::</span> <span class="sd"> >>> from pytest import approx</span> <span class="sd"> >>> 0.1 + 0.2 == approx(0.3)</span> <span class="sd"> True</span> <span class="sd"> The same syntax also works on sequences of numbers::</span> <span class="sd"> >>> (0.1 + 0.2, 0.2 + 0.4) == approx((0.3, 0.6))</span> <span class="sd"> True</span> <span class="sd"> By default, ``approx`` considers numbers within a relative tolerance of</span> <span class="sd"> ``1e-6`` (i.e. one part in a million) of its expected value to be equal.</span> <span class="sd"> This treatment would lead to surprising results if the expected value was</span> <span class="sd"> ``0.0``, because nothing but ``0.0`` itself is relatively close to ``0.0``.</span> <span class="sd"> To handle this case less surprisingly, ``approx`` also considers numbers</span> <span class="sd"> within an absolute tolerance of ``1e-12`` of its expected value to be</span> <span class="sd"> equal. Infinite numbers are another special case. They are only</span> <span class="sd"> considered equal to themselves, regardless of the relative tolerance. Both</span> <span class="sd"> the relative and absolute tolerances can be changed by passing arguments to</span> <span class="sd"> the ``approx`` constructor::</span> <span class="sd"> >>> 1.0001 == approx(1)</span> <span class="sd"> False</span> <span class="sd"> >>> 1.0001 == approx(1, rel=1e-3)</span> <span class="sd"> True</span> <span class="sd"> >>> 1.0001 == approx(1, abs=1e-3)</span> <span class="sd"> True</span> <span class="sd"> If you specify ``abs`` but not ``rel``, the comparison will not consider</span> <span class="sd"> the relative tolerance at all. In other words, two numbers that are within</span> <span class="sd"> the default relative tolerance of ``1e-6`` will still be considered unequal</span> <span class="sd"> if they exceed the specified absolute tolerance. If you specify both</span> <span class="sd"> ``abs`` and ``rel``, the numbers will be considered equal if either</span> <span class="sd"> tolerance is met::</span> <span class="sd"> >>> 1 + 1e-8 == approx(1)</span> <span class="sd"> True</span> <span class="sd"> >>> 1 + 1e-8 == approx(1, abs=1e-12)</span> <span class="sd"> False</span> <span class="sd"> >>> 1 + 1e-8 == approx(1, rel=1e-6, abs=1e-12)</span> <span class="sd"> True</span> <span class="sd"> If you're thinking about using ``approx``, then you might want to know how</span> <span class="sd"> it compares to other good ways of comparing floating-point numbers. All of</span> <span class="sd"> these algorithms are based on relative and absolute tolerances and should</span> <span class="sd"> agree for the most part, but they do have meaningful differences:</span> <span class="sd"> - ``math.isclose(a, b, rel_tol=1e-9, abs_tol=0.0)``: True if the relative</span> <span class="sd"> tolerance is met w.r.t. either ``a`` or ``b`` or if the absolute</span> <span class="sd"> tolerance is met. Because the relative tolerance is calculated w.r.t.</span> <span class="sd"> both ``a`` and ``b``, this test is symmetric (i.e. neither ``a`` nor</span> <span class="sd"> ``b`` is a "reference value"). You have to specify an absolute tolerance</span> <span class="sd"> if you want to compare to ``0.0`` because there is no tolerance by</span> <span class="sd"> default. Only available in python>=3.5. `More information...`__</span> <span class="sd"> __ https://docs.python.org/3/library/math.html#math.isclose</span> <span class="sd"> - ``numpy.isclose(a, b, rtol=1e-5, atol=1e-8)``: True if the difference</span> <span class="sd"> between ``a`` and ``b`` is less that the sum of the relative tolerance</span> <span class="sd"> w.r.t. ``b`` and the absolute tolerance. Because the relative tolerance</span> <span class="sd"> is only calculated w.r.t. ``b``, this test is asymmetric and you can</span> <span class="sd"> think of ``b`` as the reference value. Support for comparing sequences</span> <span class="sd"> is provided by ``numpy.allclose``. `More information...`__</span> <span class="sd"> __ http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.isclose.html</span> <span class="sd"> - ``unittest.TestCase.assertAlmostEqual(a, b)``: True if ``a`` and ``b``</span> <span class="sd"> are within an absolute tolerance of ``1e-7``. No relative tolerance is</span> <span class="sd"> considered and the absolute tolerance cannot be changed, so this function</span> <span class="sd"> is not appropriate for very large or very small numbers. Also, it's only</span> <span class="sd"> available in subclasses of ``unittest.TestCase`` and it's ugly because it</span> <span class="sd"> doesn't follow PEP8. `More information...`__</span> <span class="sd"> __ https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertAlmostEqual</span> <span class="sd"> - ``a == pytest.approx(b, rel=1e-6, abs=1e-12)``: True if the relative</span> <span class="sd"> tolerance is met w.r.t. ``b`` or if the absolute tolerance is met.</span> <span class="sd"> Because the relative tolerance is only calculated w.r.t. ``b``, this test</span> <span class="sd"> is asymmetric and you can think of ``b`` as the reference value. In the</span> <span class="sd"> special case that you explicitly specify an absolute tolerance but not a</span> <span class="sd"> relative tolerance, only the absolute tolerance is considered.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected</span><span class="p">,</span> <span class="n">rel</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">abs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span> <span class="o">=</span> <span class="n">expected</span> <span class="bp">self</span><span class="o">.</span><span class="n">abs</span> <span class="o">=</span> <span class="nb">abs</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="o">=</span> <span class="n">rel</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actual</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">Iterable</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">actual</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">):</span> <span class="n">actual</span> <span class="o">=</span> <span class="p">[</span><span class="n">actual</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">actual</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">):</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="n">x</span> <span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">actual</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">))</span> <span class="fm">__hash__</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actual</span><span class="p">):</span> <span class="k">return</span> <span class="ow">not</span> <span class="p">(</span><span class="n">actual</span> <span class="o">==</span> <span class="bp">self</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">expected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Regardless of whether the user-specified expected value is a number</span> <span class="c1"># or a sequence of numbers, return a list of ApproxNotIterable objects</span> <span class="c1"># that can be compared against.</span> <span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">Iterable</span> <span class="n">approx_non_iter</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">ApproxNonIterable</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">abs</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_expected</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">):</span> <span class="k">return</span> <span class="p">[</span><span class="n">approx_non_iter</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_expected</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="p">[</span><span class="n">approx_non_iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_expected</span><span class="p">)]</span> <span class="nd">@expected</span><span class="o">.</span><span class="n">setter</span> <span class="k">def</span> <span class="nf">expected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_expected</span> <span class="o">=</span> <span class="n">expected</span> <span class="k">class</span> <span class="nc">ApproxNonIterable</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Perform approximate comparisons for single numbers only.</span> <span class="sd"> In other words, the ``expected`` attribute for objects of this class must</span> <span class="sd"> be some sort of number. This is in contrast to the ``approx`` class, where</span> <span class="sd"> the ``expected`` attribute can either be a number of a sequence of numbers.</span> <span class="sd"> This class is responsible for making comparisons, while ``approx`` is</span> <span class="sd"> responsible for abstracting the difference between numbers and sequences of</span> <span class="sd"> numbers. Although this class can stand on its own, it's only meant to be</span> <span class="sd"> used within ``approx``.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected</span><span class="p">,</span> <span class="n">rel</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">abs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span> <span class="o">=</span> <span class="n">expected</span> <span class="bp">self</span><span class="o">.</span><span class="n">abs</span> <span class="o">=</span> <span class="nb">abs</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="o">=</span> <span class="n">rel</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">,</span> <span class="nb">complex</span><span class="p">):</span> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span> <span class="c1"># Infinities aren't compared using tolerances, so don't show a</span> <span class="c1"># tolerance.</span> <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">isinf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">):</span> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span> <span class="c1"># If a sensible tolerance can't be calculated, self.tolerance will</span> <span class="c1"># raise a ValueError. In this case, display '???'.</span> <span class="k">try</span><span class="p">:</span> <span class="n">vetted_tolerance</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{:.1e}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tolerance</span><span class="p">)</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="n">vetted_tolerance</span> <span class="o">=</span> <span class="s1">'???'</span> <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'</span><span class="si">{0}</span><span class="s1"> +- </span><span class="si">{1}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">,</span> <span class="n">vetted_tolerance</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="sa">u</span><span class="s1">'</span><span class="si">{0}</span><span class="s1"> </span><span class="se">\u00b1</span><span class="s1"> </span><span class="si">{1}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">,</span> <span class="n">vetted_tolerance</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actual</span><span class="p">):</span> <span class="c1"># Short-circuit exact equality.</span> <span class="k">if</span> <span class="n">actual</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">:</span> <span class="k">return</span> <span class="kc">True</span> <span class="c1"># Infinity shouldn't be approximately equal to anything but itself, but</span> <span class="c1"># if there's a relative tolerance, it will be infinite and infinity</span> <span class="c1"># will seem approximately equal to everything. The equal-to-itself</span> <span class="c1"># case would have been short circuited above, so here we can just</span> <span class="c1"># return false if the expected value is infinite. The abs() call is</span> <span class="c1"># for compatibility with complex numbers.</span> <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">isinf</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)):</span> <span class="k">return</span> <span class="kc">False</span> <span class="c1"># Return true if the two numbers are within the tolerance.</span> <span class="k">return</span> <span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span> <span class="o">-</span> <span class="n">actual</span><span class="p">)</span> <span class="o"><=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tolerance</span> <span class="fm">__hash__</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actual</span><span class="p">):</span> <span class="k">return</span> <span class="ow">not</span> <span class="p">(</span><span class="n">actual</span> <span class="o">==</span> <span class="bp">self</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">tolerance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">set_default</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">default</span><span class="p">:</span> <span class="n">x</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">default</span> <span class="c1"># Figure out what the absolute tolerance should be. ``self.abs`` is</span> <span class="c1"># either None or a value specified by the user.</span> <span class="n">absolute_tolerance</span> <span class="o">=</span> <span class="n">set_default</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">abs</span><span class="p">,</span> <span class="mf">1e-12</span><span class="p">)</span> <span class="k">if</span> <span class="n">absolute_tolerance</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"absolute tolerance can't be negative: </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">absolute_tolerance</span><span class="p">))</span> <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">absolute_tolerance</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"absolute tolerance can't be NaN."</span><span class="p">)</span> <span class="c1"># If the user specified an absolute tolerance but not a relative one,</span> <span class="c1"># just return the absolute tolerance.</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">abs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span> <span class="n">absolute_tolerance</span> <span class="c1"># Figure out what the relative tolerance should be. ``self.rel`` is</span> <span class="c1"># either None or a value specified by the user. This is done after</span> <span class="c1"># we've made sure the user didn't ask for an absolute tolerance only,</span> <span class="c1"># because we don't want to raise errors about the relative tolerance if</span> <span class="c1"># we aren't even going to use it.</span> <span class="n">relative_tolerance</span> <span class="o">=</span> <span class="n">set_default</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="mf">1e-6</span><span class="p">)</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span> <span class="k">if</span> <span class="n">relative_tolerance</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"relative tolerance can't be negative: </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">absolute_tolerance</span><span class="p">))</span> <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">relative_tolerance</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"relative tolerance can't be NaN."</span><span class="p">)</span> <span class="c1"># Return the larger of the relative and absolute tolerances.</span> <span class="k">return</span> <span class="nb">max</span><span class="p">(</span><span class="n">relative_tolerance</span><span class="p">,</span> <span class="n">absolute_tolerance</span><span class="p">)</span> <span class="c1">#</span> <span class="c1"># the basic pytest Function item</span> <span class="c1">#</span> <span class="k">class</span> <span class="nc">Function</span><span class="p">(</span><span class="n">FunctionMixin</span><span class="p">,</span> <span class="n">pytest</span><span class="o">.</span><span class="n">Item</span><span class="p">,</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">FuncargnamesCompatAttr</span><span class="p">):</span> <span class="sd">""" a Function Item is responsible for setting up and executing a</span> <span class="sd"> Python test function.</span> <span class="sd"> """</span> <span class="n">_genid</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">callspec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">callobj</span><span class="o">=</span><span class="n">NOTSET</span><span class="p">,</span> <span class="n">keywords</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">fixtureinfo</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">originalname</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">Function</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="n">config</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_args</span> <span class="o">=</span> <span class="n">args</span> <span class="k">if</span> <span class="n">callobj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOTSET</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">callobj</span> <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span> <span class="k">if</span> <span class="n">callspec</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">callspec</span> <span class="o">=</span> <span class="n">callspec</span> <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">callspec</span><span class="o">.</span><span class="n">keywords</span><span class="p">)</span> <span class="k">if</span> <span class="n">keywords</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">keywords</span><span class="p">)</span> <span class="k">if</span> <span class="n">fixtureinfo</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">fixtureinfo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">getfixtureinfo</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cls</span><span class="p">,</span> <span class="n">funcargs</span><span class="o">=</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_isyieldedfunction</span><span class="p">())</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixtureinfo</span> <span class="o">=</span> <span class="n">fixtureinfo</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span> <span class="o">=</span> <span class="n">fixtureinfo</span><span class="o">.</span><span class="n">names_closure</span> <span class="bp">self</span><span class="o">.</span><span class="n">_initrequest</span><span class="p">()</span> <span class="c1">#: original function name, without any decorations (for example</span> <span class="c1">#: parametrization adds a ``"[...]"`` suffix to function names).</span> <span class="c1">#:</span> <span class="c1">#: .. versionadded:: 3.0</span> <span class="bp">self</span><span class="o">.</span><span class="n">originalname</span> <span class="o">=</span> <span class="n">originalname</span> <span class="k">def</span> <span class="nf">_initrequest</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_isyieldedfunction</span><span class="p">():</span> <span class="k">assert</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"callspec"</span><span class="p">),</span> <span class="p">(</span> <span class="s2">"yielded functions (deprecated) cannot have funcargs"</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"callspec"</span><span class="p">):</span> <span class="n">callspec</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">callspec</span> <span class="k">assert</span> <span class="ow">not</span> <span class="n">callspec</span><span class="o">.</span><span class="n">funcargs</span> <span class="bp">self</span><span class="o">.</span><span class="n">_genid</span> <span class="o">=</span> <span class="n">callspec</span><span class="o">.</span><span class="n">id</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">callspec</span><span class="p">,</span> <span class="s2">"param"</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">param</span> <span class="o">=</span> <span class="n">callspec</span><span class="o">.</span><span class="n">param</span> <span class="bp">self</span><span class="o">.</span><span class="n">_request</span> <span class="o">=</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">FixtureRequest</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">function</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s2">"underlying python 'function' object"</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'im_func'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_getobj</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="n">i</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">"["</span><span class="p">)</span> <span class="c1"># parametrization</span> <span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">_pyfuncitem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s2">"(compatonly) for code expecting pytest-2.2 style request objects"</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">def</span> <span class="nf">_isyieldedfunction</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"_args"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">runtest</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" execute the underlying test function. """</span> <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_pyfunc_call</span><span class="p">(</span><span class="n">pyfuncitem</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span> <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">Function</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">setup</span><span class="p">()</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">fillfixtures</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> </pre></div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="../../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="nav-item nav-item-0"><a href="../../index.html">SQLObject 3.7.0 documentation</a> »</li> <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> »</li> </ul> </div> <div class="footer" role="contentinfo"> © Copyright 2004-2018, Ian Bicking and contributors. Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.7.4. </div> </body> </html>