<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>_pytest.python</title> <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../../', VERSION: '2.3.4.1', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </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> <link rel="top" title="None" href="../../index.html" /> <link rel="up" title="Module code" href="../index.html" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li><a href="../../contents.html">pytest-2.3.4.1</a> »</li> <li><a href="../index.html" accesskey="U">Module code</a> »</li> <g:plusone></g:plusone> </ul> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <div id="searchbox" style="display: none"> <form class="search" action="../../search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="Search" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> <script type="text/javascript">$('#searchbox').show(0);</script> <h3>quicklinks</h3> <div style="text-align: left; font-size: 100%; vertical-align: middle;"> <table> <tr> <td> <a href="../../index.html">home</a> </td><td> <a href="../../contents.html">TOC/contents</a> </td></tr><tr><td> <a href="../../getting-started.html">install</a> </td><td> <a href="../../changelog.html">changelog</a> </td></tr><tr><td> <a href="../../example/index.html">examples</a> </td><td> <a href="../../customize.html">customize</a> </td></tr><tr><td> <a href="https://bitbucket.org/hpk42/pytest/issues?status=new&status=open">issues[bb]</a> </td><td> <a href="../../contact.html">contact</a> </td></tr></table> </div> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <h1>Source code for _pytest.python</h1><div class="highlight"><pre> <span class="sd">""" Python test discovery, setup and run of test functions. """</span> <span class="kn">import</span> <span class="nn">py</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">pytest</span> <span class="kn">from</span> <span class="nn">_pytest.main</span> <span class="kn">import</span> <span class="n">getfslineno</span> <span class="kn">from</span> <span class="nn">_pytest.monkeypatch</span> <span class="kn">import</span> <span class="n">monkeypatch</span> <span class="kn">from</span> <span class="nn">py._code.code</span> <span class="kn">import</span> <span class="n">TerminalRepr</span> <span class="kn">import</span> <span class="nn">_pytest</span> <span class="n">cutdir</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="n">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">dirpath</span><span class="p">()</span> <span class="nb">callable</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">callable</span> <span class="k">def</span> <span class="nf">getimfunc</span><span class="p">(</span><span class="n">func</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">func</span><span class="o">.</span><span class="n">__func__</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">func</span><span class="o">.</span><span class="n">im_func</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">return</span> <span class="n">func</span> <span class="k">class</span> <span class="nc">FixtureFunctionMarker</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">scope</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">autouse</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="n">scope</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="n">params</span> <span class="bp">self</span><span class="o">.</span><span class="n">autouse</span> <span class="o">=</span> <span class="n">autouse</span> <span class="k">def</span> <span class="nf">__call__</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="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">function</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"class fixtures not supported (may be in the future)"</span><span class="p">)</span> <span class="n">function</span><span class="o">.</span><span class="n">_pytestfixturefunction</span> <span class="o">=</span> <span class="bp">self</span> <span class="k">return</span> <span class="n">function</span> <div class="viewcode-block" id="fixture"><a class="viewcode-back" href="../../builtin.html#_pytest.python.fixture">[docs]</a><span class="k">def</span> <span class="nf">fixture</span><span class="p">(</span><span class="n">scope</span><span class="o">=</span><span class="s">"function"</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">autouse</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span> <span class="sd">""" (return a) decorator to mark a fixture factory function.</span> <span class="sd"> This decorator can be used (with or or without parameters) to define</span> <span class="sd"> a fixture function. The name of the fixture function can later be</span> <span class="sd"> referenced to cause its invocation ahead of running tests: test</span> <span class="sd"> modules or classes can use the pytest.mark.usefixtures(fixturename)</span> <span class="sd"> marker. Test functions can directly use fixture names as input</span> <span class="sd"> arguments in which case the fixture instance returned from the fixture</span> <span class="sd"> function will be injected.</span> <span class="sd"> :arg scope: the scope for which this fixture is shared, one of</span> <span class="sd"> "function" (default), "class", "module", "session".</span> <span class="sd"> :arg params: an optional list of parameters which will cause multiple</span> <span class="sd"> invocations of the fixture function and all of the tests</span> <span class="sd"> using it.</span> <span class="sd"> :arg autouse: if True, the fixture func is activated for all tests that</span> <span class="sd"> can see it. If False (the default) then an explicit</span> <span class="sd"> reference is needed to activate the fixture.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span> <span class="ow">and</span> <span class="n">params</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">autouse</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span> <span class="c"># direct decoration</span> <span class="k">return</span> <span class="n">FixtureFunctionMarker</span><span class="p">(</span><span class="s">"function"</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">autouse</span><span class="p">)(</span><span class="n">scope</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">FixtureFunctionMarker</span><span class="p">(</span><span class="n">scope</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">autouse</span><span class="o">=</span><span class="n">autouse</span><span class="p">)</span> </div> <span class="n">defaultfuncargprefixmarker</span> <span class="o">=</span> <span class="n">fixture</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="bp">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="s">"python </span><span class="si">%s</span><span class="s"> 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="bp">None</span><span class="p">,</span> <span class="bp">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="s">"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="s">'--fixtures'</span><span class="p">,</span> <span class="s">'--funcargs'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">"store_true"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">"showfixtures"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">"show available fixtures, sorted by plugin appearance"</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="s">"usefixtures"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">"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="s">"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="s">"python_files"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">"args"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">(</span><span class="s">'test_*.py'</span><span class="p">,</span> <span class="s">'*_test.py'</span><span class="p">),</span> <span class="n">help</span><span class="o">=</span><span class="s">"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="s">"python_classes"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">"args"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">(</span><span class="s">"Test"</span><span class="p">,),</span> <span class="n">help</span><span class="o">=</span><span class="s">"prefixes 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="s">"python_functions"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">"args"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">(</span><span class="s">"test"</span><span class="p">,),</span> <span class="n">help</span><span class="o">=</span><span class="s">"prefixes for Python test function and method discovery"</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">def</span> <span class="nf">pytest_generate_tests</span><span class="p">(</span><span class="n">metafunc</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="s">"markers"</span><span class="p">,</span> <span class="s">"parametrize(argnames, argvalues): call a test function multiple "</span> <span class="s">"times passing in multiple different argument value sets. Example: "</span> <span class="s">"@parametrize('arg1', [1,2]) would lead to two calls of the decorated "</span> <span class="s">"test function, one with arg1=1 and another with arg1=2."</span> <span class="s">" see http://pytest.org/latest/parametrize.html for more info and "</span> <span class="s">"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="s">"markers"</span><span class="p">,</span> <span class="s">"usefixtures(fixturename1, fixturename2, ...): mark tests as needing "</span> <span class="s">"all of the specified fixtures. see http://pytest.org/latest/fixture.html#usefixtures "</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_sessionstart</span><span class="p">(</span><span class="n">session</span><span class="p">):</span> <span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="o">=</span> <span class="n">FixtureManager</span><span class="p">(</span><span class="n">session</span><span class="p">)</span> <span class="nd">@pytest.mark.trylast</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="s">'fixture'</span><span class="p">:</span> <span class="n">fixture</span><span class="p">,</span> <span class="s">'raises'</span> <span class="p">:</span> <span class="n">raises</span><span class="p">,</span> <span class="s">'collect'</span><span class="p">:</span> <span class="p">{</span> <span class="s">'Module'</span><span class="p">:</span> <span class="n">Module</span><span class="p">,</span> <span class="s">'Class'</span><span class="p">:</span> <span class="n">Class</span><span class="p">,</span> <span class="s">'Instance'</span><span class="p">:</span> <span class="n">Instance</span><span class="p">,</span> <span class="s">'Function'</span><span class="p">:</span> <span class="n">Function</span><span class="p">,</span> <span class="s">'Generator'</span><span class="p">:</span> <span class="n">Generator</span><span class="p">,</span> <span class="s">'_fillfuncargs'</span><span class="p">:</span> <span class="n">fillfixtures</span><span class="p">}</span> <span class="p">}</span> <span class="nd">@fixture</span><span class="p">()</span> <span class="k">def</span> <span class="nf">pytestconfig</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="sd">""" the pytest config object with access to command line opts."""</span> <span class="k">return</span> <span class="n">request</span><span class="o">.</span><span class="n">config</span> <span class="k">def</span> <span class="nf">pytest_pyfunc_call</span><span class="p">(</span><span class="n">__multicall__</span><span class="p">,</span> <span class="n">pyfuncitem</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">__multicall__</span><span class="o">.</span><span class="n">execute</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">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="n">pb</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">purebasename</span> <span class="k">if</span> <span class="n">ext</span> <span class="o">==</span> <span class="s">".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="s">'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="k">def</span> <span class="nf">pytest_pycollect_makeitem</span><span class="p">(</span><span class="n">__multicall__</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">res</span> <span class="o">=</span> <span class="n">__multicall__</span><span class="o">.</span><span class="n">execute</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="bp">None</span><span class="p">:</span> <span class="k">return</span> <span class="n">res</span> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="c">#if hasattr(collector.obj, 'unittest'):</span> <span class="c"># return # we assume it's a mixin class for a TestCase derived one</span> <span class="k">if</span> <span class="n">collector</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="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="s">"Class"</span><span class="p">)</span> <span class="k">return</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">funcnamefilter</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s">'__call__'</span><span class="p">)</span> <span class="ow">and</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="bp">None</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="k">return</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="k">return</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="k">def</span> <span class="nf">is_generator</span><span class="p">(</span><span class="n">func</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">py</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">getrawcode</span><span class="p">(</span><span class="n">func</span><span class="p">)</span><span class="o">.</span><span class="n">co_flags</span> <span class="o">&</span> <span class="mi">32</span> <span class="c"># generator function</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="c"># builtin functions have no bytecode</span> <span class="c"># assume them to not be generators</span> <span class="k">return</span> <span class="bp">False</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="s">"Module"</span><span class="p">)</span> <span class="n">cls</span> <span class="o">=</span> <span class="n">pyobj_property</span><span class="p">(</span><span class="s">"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="s">"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="k">try</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">except</span> <span class="ne">AttributeError</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="bp">None</span><span class="p">,</span> <span class="s">"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="bp">True</span><span class="p">,</span> <span class="n">includemodule</span><span class="o">=</span><span class="bp">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="s">".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="s">"."</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="s">".["</span><span class="p">,</span> <span class="s">"["</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="c"># 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="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s">'compat_co_firstlineno'</span><span class="p">):</span> <span class="c"># 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="n">__module__</span><span class="p">]</span><span class="o">.</span><span class="n">__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="s">".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">obj</span><span class="o">.</span><span class="n">compat_co_firstlineno</span> <span class="n">modpath</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">__module__</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">for</span> <span class="n">prefix</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="s">"python_functions"</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">prefix</span><span class="p">):</span> <span class="k">return</span> <span class="bp">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">for</span> <span class="n">prefix</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="s">"python_classes"</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">prefix</span><span class="p">):</span> <span class="k">return</span> <span class="bp">True</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="c"># NB. we avoid random getattrs and peek in the __dict__ instead</span> <span class="c"># (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="s">'__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="n">__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="n">__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="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="bp">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="bp">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="c">#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="n">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="bp">None</span> <span class="n">transfer_markers</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="n">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="n">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="n">cls</span><span class="o">=</span><span class="n">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">gentesthook</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">hook</span><span class="o">.</span><span class="n">pytest_generate_tests</span> <span class="n">extra</span> <span class="o">=</span> <span class="p">[</span><span class="n">module</span><span class="p">]</span> <span class="k">if</span> <span class="n">cls</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">extra</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cls</span><span class="p">())</span> <span class="n">plugins</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getplugins</span><span class="p">()</span> <span class="o">+</span> <span class="n">extra</span> <span class="n">gentesthook</span><span class="o">.</span><span class="n">pcall</span><span class="p">(</span><span class="n">plugins</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="s">"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="k">else</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="s">"</span><span class="si">%s</span><span class="s">[</span><span class="si">%s</span><span class="s">]"</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">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="bp">True</span><span class="p">})</span> <span class="k">class</span> <span class="nc">FuncFixtureInfo</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">argnames</span><span class="p">,</span> <span class="n">names_closure</span><span class="p">,</span> <span class="n">name2fixturedefs</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">argnames</span> <span class="o">=</span> <span class="n">argnames</span> <span class="bp">self</span><span class="o">.</span><span class="n">names_closure</span> <span class="o">=</span> <span class="n">names_closure</span> <span class="bp">self</span><span class="o">.</span><span class="n">name2fixturedefs</span> <span class="o">=</span> <span class="n">name2fixturedefs</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="n">cls</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span> <span class="c"># XXX this should rather be code in the mark plugin or the mark</span> <span class="c"># 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="n">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="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="n">pytestmark</span><span class="p">(</span><span class="n">funcobj</span><span class="p">)</span> <div class="viewcode-block" id="Module"><a class="viewcode-back" href="../../plugins.html#_pytest.python.Module">[docs]</a><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="s">'_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="c"># we assume we are only called once per module</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="bp">True</span><span class="p">)</span> <span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span> <span class="n">excinfo</span> <span class="o">=</span> <span class="n">py</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">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">(</span><span class="n">excinfo</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="s">"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="s">"import file mismatch:</span><span class="se">\n</span><span class="s">"</span> <span class="s">"imported module </span><span class="si">%r</span><span class="s"> has this __file__ attribute:</span><span class="se">\n</span><span class="s">"</span> <span class="s">" </span><span class="si">%s</span><span class="se">\n</span><span class="s">"</span> <span class="s">"which is not the same as the test file we want to collect:</span><span class="se">\n</span><span class="s">"</span> <span class="s">" </span><span class="si">%s</span><span class="se">\n</span><span class="s">"</span> <span class="s">"HINT: remove __pycache__ / .pyc files and/or use a "</span> <span class="s">"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="c">#print "imported test module", mod</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">xunitsetup</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="s">"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="bp">None</span><span class="p">:</span> <span class="c">#XXX: nose compat hack, move to nose plugin</span> <span class="c"># if it takes a positional arg, its probably a pytest style one</span> <span class="c"># so we pass the current module object</span> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getargspec</span><span class="p">(</span><span class="n">setup_module</span><span class="p">)[</span><span class="mi">0</span><span class="p">]:</span> <span class="n">setup_module</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">else</span><span class="p">:</span> <span class="n">setup_module</span><span class="p">()</span> <span class="k">def</span> <span class="nf">teardown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">teardown_module</span> <span class="o">=</span> <span class="n">xunitsetup</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="s">'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="bp">None</span><span class="p">:</span> <span class="c">#XXX: nose compat hack, move to nose plugin</span> <span class="c"># if it takes a positional arg, its probably a py.test style one</span> <span class="c"># so we pass the current module object</span> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getargspec</span><span class="p">(</span><span class="n">teardown_module</span><span class="p">)[</span><span class="mi">0</span><span class="p">]:</span> <span class="n">teardown_module</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">else</span><span class="p">:</span> <span class="n">teardown_module</span><span class="p">()</span> </div> <div class="viewcode-block" id="Class"><a class="viewcode-back" href="../../plugins.html#_pytest.python.Class">[docs]</a><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="n">pytest</span><span class="o">.</span><span class="n">skip</span><span class="p">(</span><span class="s">"class </span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s"> with __init__ won't get collected"</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="o">.</span><span class="n">__module__</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">__name__</span><span class="p">,</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="s">"Instance"</span><span class="p">)(</span><span class="n">name</span><span class="o">=</span><span class="s">"()"</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">xunitsetup</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="s">'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="bp">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="s">'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="s">'__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="k">def</span> <span class="nf">teardown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">teardown_class</span> <span class="o">=</span> <span class="n">xunitsetup</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="s">'teardown_class'</span><span class="p">)</span> <span class="k">if</span> <span class="n">teardown_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">teardown_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">teardown_class</span><span class="p">,</span> <span class="s">'im_func'</span><span class="p">,</span> <span class="n">teardown_class</span><span class="p">)</span> <span class="n">teardown_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">teardown_class</span><span class="p">,</span> <span class="s">'__func__'</span><span class="p">,</span> <span class="n">teardown_class</span><span class="p">)</span> <span class="n">teardown_class</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span> </div> <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="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="p">()</span> <span class="k">return</span> <span class="n">obj</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="s">'_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">name</span> <span class="o">=</span> <span class="s">'setup_method'</span> <span class="k">else</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="s">'setup_function'</span> <span class="n">setup_func_or_method</span> <span class="o">=</span> <span class="n">xunitsetup</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">if</span> <span class="n">setup_func_or_method</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">setup_func_or_method</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">teardown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" perform teardown for this test function. """</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">name</span> <span class="o">=</span> <span class="s">'teardown_method'</span> <span class="k">else</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="s">'teardown_function'</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="n">teardown_func_or_meth</span> <span class="o">=</span> <span class="n">xunitsetup</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">if</span> <span class="n">teardown_func_or_meth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">teardown_func_or_meth</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">_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="s">'_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">py</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="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="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">excludepath</span><span class="o">=</span><span class="n">cutdir</span><span class="p">)</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="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="s">"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="nb">str</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="bp">None</span><span class="p">):</span> <span class="k">assert</span> <span class="n">outerr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">,</span> <span class="s">"XXX outerr usage is deprecated"</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="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="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="c"># test generators are seen as collectors but they also</span> <span class="c"># invoke setup/teardown on popular request</span> <span class="c"># (induced by the common "test_*" naming shared with normal tests)</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="c"># 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="nb">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="s">"</span><span class="si">%r</span><span class="s"> yielded non callable test </span><span class="si">%r</span><span class="s">"</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="bp">None</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="s">"[</span><span class="si">%d</span><span class="s">]"</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="s">"['</span><span class="si">%s</span><span class="s">']"</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="s">"</span><span class="si">%r</span><span class="s"> generated tests with non-unique name </span><span class="si">%r</span><span class="s">"</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="bp">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="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="c"># explict 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="bp">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="s">'__init__'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">init</span><span class="p">:</span> <span class="k">if</span> <span class="n">init</span> <span class="o">!=</span> <span class="nb">object</span><span class="o">.</span><span class="n">__init__</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">def</span> <span class="nf">fillfixtures</span><span class="p">(</span><span class="n">function</span><span class="p">):</span> <span class="sd">""" fill missing funcargs for a test function. """</span> <span class="k">if</span> <span class="mi">1</span> <span class="ow">or</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="s">"_args"</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="c"># not a yielded function</span> <span class="k">try</span><span class="p">:</span> <span class="n">request</span> <span class="o">=</span> <span class="n">function</span><span class="o">.</span><span class="n">_request</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="c"># XXX this special code path is only expected to execute</span> <span class="c"># with the oejskit plugin. It uses classes with funcargs</span> <span class="c"># and we thus have to work a bit to allow this.</span> <span class="n">fm</span> <span class="o">=</span> <span class="n">function</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="n">fi</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="n">function</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">function</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="n">function</span><span class="o">.</span><span class="n">_fixtureinfo</span> <span class="o">=</span> <span class="n">fi</span> <span class="n">request</span> <span class="o">=</span> <span class="n">function</span><span class="o">.</span><span class="n">_request</span> <span class="o">=</span> <span class="n">FixtureRequest</span><span class="p">(</span><span class="n">function</span><span class="p">)</span> <span class="n">request</span><span class="o">.</span><span class="n">_fillfixtures</span><span class="p">()</span> <span class="c"># prune out funcargs for jstests</span> <span class="n">newfuncargs</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">fi</span><span class="o">.</span><span class="n">argnames</span><span class="p">:</span> <span class="n">newfuncargs</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">function</span><span class="o">.</span><span class="n">funcargs</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="n">function</span><span class="o">.</span><span class="n">funcargs</span> <span class="o">=</span> <span class="n">newfuncargs</span> <span class="k">else</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">_fillfixtures</span><span class="p">()</span> <span class="n">_notexists</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</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">_notexists</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">_notexists</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="c"># used for sorting parametrized resources</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">_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="s">"duplicate </span><span class="si">%r</span><span class="s">"</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">_notexists</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="s">"-"</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="bp">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">valtype</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">scopenum</span><span class="o">=</span><span class="mi">0</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="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">valtype</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="c"># we want self.params to be always set because of</span> <span class="c"># parametrize_sorted() which groups tests by params/scope</span> <span class="k">if</span> <span class="n">valtype</span> <span class="o">==</span> <span class="s">"funcargs"</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">arg</span><span class="p">]</span> <span class="o">=</span> <span class="nb">id</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="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="n">_notexists</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_emptyparamspecified</span> <span class="o">=</span> <span class="bp">True</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">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">_notexists</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">_notexists</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">_notexists</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">class</span> <span class="nc">FuncargnamesCompatAttr</span><span class="p">:</span> <span class="sd">""" helper class so that Metafunc, Function and FixtureRequest</span> <span class="sd"> don't need to each define the "funcargnames" compatibility attribute.</span> <span class="sd"> """</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">funcargnames</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" alias attribute for ``fixturenames`` for pre-2.3 compatibility"""</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span> <span class="k">class</span> <span class="nc">Metafunc</span><span class="p">(</span><span class="n">FuncargnamesCompatAttr</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">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="n">cls</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="bp">None</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">config</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="bp">self</span><span class="o">.</span><span class="n">function</span> <span class="o">=</span> <span class="n">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="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="bp">self</span><span class="o">.</span><span class="n">cls</span> <span class="o">=</span> <span class="n">cls</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="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> <div class="viewcode-block" id="Metafunc.parametrize"><a class="viewcode-back" href="../../parametrize.html#_pytest.python.Metafunc.parametrize">[docs]</a> <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="bp">False</span><span class="p">,</span> <span class="n">ids</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="bp">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=True to do it rather at test setup time.</span> <span class="sd"> :arg argnames: an argument name or a list of argument names</span> <span class="sd"> :arg argvalues: The list of argvalues determines how often a test is invoked</span> <span class="sd"> with different argument values. If only one argname was specified argvalues</span> <span class="sd"> is a list of simple values. If N argnames were specified, argvalues must</span> <span class="sd"> be a list of N-tuples, where each tuple-element specifies a value for its</span> <span class="sd"> respective argname.</span> <span class="sd"> :arg indirect: if True each argvalue corresponding to an argname 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 each corresponding to the argvalues so</span> <span class="sd"> that they are part of the test id. If no ids are provided they will</span> <span class="sd"> be generated automatically from 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="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">argnames</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">_notexists</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="k">if</span> <span class="n">scope</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">scope</span> <span class="o">=</span> <span class="s">"subfunction"</span> <span class="n">scopenum</span> <span class="o">=</span> <span class="n">scopes</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">indirect</span><span class="p">:</span> <span class="c">#XXX should we also check for the opposite case?</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">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"</span><span class="si">%r</span><span class="s"> uses no fixture </span><span class="si">%r</span><span class="s">"</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">valtype</span> <span class="o">=</span> <span class="n">indirect</span> <span class="ow">and</span> <span class="s">"params"</span> <span class="ow">or</span> <span class="s">"funcargs"</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">ids</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">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="k">for</span> <span class="n">i</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">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">valtype</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">ids</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">scopenum</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> </div> <div class="viewcode-block" id="Metafunc.addcall"><a class="viewcode-back" href="../../parametrize.html#_pytest.python.Metafunc.addcall">[docs]</a> <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="bp">None</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">_notexists</span><span class="p">,</span> <span class="n">param</span><span class="o">=</span><span class="n">_notexists</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="bp">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="bp">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="s">"funcarg </span><span class="si">%r</span><span class="s"> 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="bp">None</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"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">_notexists</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="s">"duplicate id </span><span class="si">%r</span><span class="s">"</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> </div> <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">idlist</span> <span class="o">=</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="n">this_id</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">nameindex</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">valset</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">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">str</span><span class="p">)):</span> <span class="n">this_id</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">argnames</span><span class="p">[</span><span class="n">nameindex</span><span class="p">])</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">valindex</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="n">this_id</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">))</span> <span class="n">idlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"-"</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">return</span> <span class="n">idlist</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="kn">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="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="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">items</span><span class="p">:</span> <span class="n">nodeid</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">items</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">nodeid</span> <span class="k">else</span><span class="p">:</span> <span class="n">part</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">_initialparts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">nodeid</span> <span class="o">=</span> <span class="s">"::"</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="p">[</span><span class="n">curdir</span><span class="o">.</span><span class="n">bestrelpath</span><span class="p">(</span><span class="n">part</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span> <span class="o">+</span> <span class="n">part</span><span class="p">[</span><span class="mi">1</span><span class="p">:]))</span> <span class="n">nodeid</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">fspath</span><span class="o">.</span><span class="n">sep</span><span class="p">,</span> <span class="s">"/"</span><span class="p">)</span> <span class="n">tw</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">io</span><span class="o">.</span><span class="n">TerminalWriter</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="s">"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="k">for</span> <span class="n">argname</span> <span class="ow">in</span> <span class="n">fm</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="p">:</span> <span class="n">fixturedefs</span> <span class="o">=</span> <span class="n">fm</span><span class="o">.</span><span class="n">getfixturedefs</span><span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="n">nodeid</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="bp">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="n">fixturedef</span> <span class="o">=</span> <span class="n">fixturedefs</span><span class="p">[</span><span class="o">-</span><span class="mi">1</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">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="n">__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="bp">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="s">"_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="s">"-"</span><span class="p">,</span> <span class="s">"fixtures defined from </span><span class="si">%s</span><span class="s">"</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="s">"_"</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="s">"</span><span class="si">%s</span><span class="s"> -- </span><span class="si">%s</span><span class="s">"</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="bp">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="n">__doc__</span> <span class="ow">or</span> <span class="s">""</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">split</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</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="s">" "</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="s">" </span><span class="si">%s</span><span class="s">: 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="bp">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">getlocation</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="n">curdir</span><span class="p">):</span> <span class="kn">import</span> <span class="nn">inspect</span> <span class="n">fn</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">inspect</span><span class="o">.</span><span class="n">getfile</span><span class="p">(</span><span class="n">function</span><span class="p">))</span> <span class="n">lineno</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">_getcode</span><span class="p">(</span><span class="n">function</span><span class="p">)</span><span class="o">.</span><span class="n">co_firstlineno</span> <span class="k">if</span> <span class="n">fn</span><span class="o">.</span><span class="n">relto</span><span class="p">(</span><span class="n">curdir</span><span class="p">):</span> <span class="n">fn</span> <span class="o">=</span> <span class="n">fn</span><span class="o">.</span><span class="n">relto</span><span class="p">(</span><span class="n">curdir</span><span class="p">)</span> <span class="k">return</span> <span class="s">"</span><span class="si">%s</span><span class="s">:</span><span class="si">%d</span><span class="s">"</span> <span class="o">%</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span> <span class="n">lineno</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="c"># builtin pytest.raises helper</span> <span class="k">def</span> <span class="nf">raises</span><span class="p">(</span><span class="n">ExpectedException</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">""" assert that a code block/function call raises @ExpectedException</span> <span class="sd"> and raise a failure exception otherwise.</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"> 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"> """</span> <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">if</span> <span class="n">ExpectedException</span> <span class="ow">is</span> <span class="ne">AssertionError</span><span class="p">:</span> <span class="c"># we want to catch a AssertionError</span> <span class="c"># replace our subclass with the builtin one</span> <span class="c"># see https://bitbucket.org/hpk42/pytest/issue/176/pytestraises</span> <span class="kn">from</span> <span class="nn">_pytest.assertion.util</span> <span class="kn">import</span> <span class="n">BuiltinAssertionError</span> <span class="k">as</span> <span class="n">ExpectedException</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span> <span class="k">return</span> <span class="n">RaisesContext</span><span class="p">(</span><span class="n">ExpectedException</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="c">#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">py</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="c"># XXX didn'T mean f_globals == f_locals something special?</span> <span class="c"># this is destroyed here ...</span> <span class="k">except</span> <span class="n">ExpectedException</span><span class="p">:</span> <span class="k">return</span> <span class="n">py</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">ExpectedException</span><span class="p">:</span> <span class="k">return</span> <span class="n">py</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">k</span> <span class="o">=</span> <span class="s">", "</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">"</span><span class="si">%s</span><span class="s">=</span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()])</span> <span class="k">if</span> <span class="n">k</span><span class="p">:</span> <span class="n">k</span> <span class="o">=</span> <span class="s">', '</span> <span class="o">+</span> <span class="n">k</span> <span class="n">expr</span> <span class="o">=</span> <span class="s">'</span><span class="si">%s</span><span class="s">(</span><span class="si">%r%s</span><span class="s">)'</span> <span class="o">%</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="s">'__name__'</span><span class="p">,</span> <span class="n">func</span><span class="p">),</span> <span class="n">args</span><span class="p">,</span> <span class="n">k</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="s">"DID NOT RAISE"</span><span class="p">)</span> <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">ExpectedException</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">ExpectedException</span> <span class="o">=</span> <span class="n">ExpectedException</span> <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span> <span class="o">=</span> <span class="bp">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="n">__new__</span><span class="p">(</span><span class="n">py</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="bp">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="bp">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="s">"DID NOT RAISE"</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">__init__</span><span class="p">(</span><span class="n">tp</span><span class="p">)</span> <span class="k">return</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">ExpectedException</span><span class="p">)</span> <span class="c">#</span> <span class="c"># the basic py.test Function item</span> <span class="c">#</span> <span class="n">_dummy</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span> <div class="viewcode-block" id="Function"><a class="viewcode-back" href="../../plugins.html#_pytest.python.Function">[docs]</a><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">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="bp">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="bp">None</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">callspec</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">callobj</span><span class="o">=</span><span class="n">_dummy</span><span class="p">,</span> <span class="n">keywords</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="bp">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="n">__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">_dummy</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="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</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">_getfuncdict</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="ow">or</span> <span class="p">{})</span><span class="o">.</span><span class="n">items</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">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> <span class="k">if</span> <span class="n">keywords</span><span class="p">:</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">keywords</span><span class="o">.</span><span class="n">items</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">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</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">isyield</span> <span class="o">=</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">fi</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="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="n">isyield</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span> <span class="o">=</span> <span class="n">fi</span><span class="o">.</span><span class="n">names_closure</span> <span class="k">if</span> <span class="n">callspec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</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">_initrequest</span><span class="p">()</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="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="s">"callspec"</span><span class="p">),</span> <span class="p">(</span> <span class="s">"yielded functions (deprecated) cannot have funcargs"</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">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="s">"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="bp">self</span><span class="o">.</span><span class="n">funcargs</span> <span class="o">=</span> <span class="n">callspec</span><span class="o">.</span><span class="n">funcargs</span><span class="o">.</span><span class="n">copy</span><span class="p">()</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="s">"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="k">else</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="bp">self</span><span class="o">.</span><span class="n">_request</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> <div class="viewcode-block" id="Function.function"><a class="viewcode-back" href="../../plugins.html#_pytest.python.Function.function">[docs]</a> <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="s">"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="s">'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> </div> <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="s">"["</span><span class="p">)</span> <span class="c"># 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="s">"(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="s">"_args"</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <div class="viewcode-block" id="Function.runtest"><a class="viewcode-back" href="../../plugins.html#_pytest.python.Function.runtest">[docs]</a> <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> </div> <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="c"># check if parametrization happend with an empty list</span> <span class="k">try</span><span class="p">:</span> <span class="n">empty</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">callspec</span><span class="o">.</span><span class="n">_emptyparamspecified</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">else</span><span class="p">:</span> <span class="n">fs</span><span class="p">,</span> <span class="n">lineno</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getfslineno</span><span class="p">()</span> <span class="n">pytest</span><span class="o">.</span><span class="n">skip</span><span class="p">(</span><span class="s">"got empty parameter set, function </span><span class="si">%s</span><span class="s"> at </span><span class="si">%s</span><span class="s">:</span><span class="si">%d</span><span class="s">"</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="o">.</span><span class="n">__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="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">fillfixtures</span><span class="p">(</span><span class="bp">self</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">other</span><span class="p">):</span> <span class="k">try</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">name</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_args</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">_args</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">parent</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">obj</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'_genid'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s">'_genid'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="p">)</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">return</span> <span class="bp">False</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">other</span><span class="p">):</span> <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span> <span class="o">==</span> <span class="n">other</span> <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">hash</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">name</span><span class="p">))</span> </div> <span class="n">scope2props</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">session</span><span class="o">=</span><span class="p">())</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">"module"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="s">"fspath"</span><span class="p">,</span> <span class="s">"module"</span><span class="p">)</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">"class"</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">"module"</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="s">"cls"</span><span class="p">,)</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">"instance"</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">"class"</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="s">"instance"</span><span class="p">,</span> <span class="p">)</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">"function"</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">"instance"</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="s">"function"</span><span class="p">,</span> <span class="s">"keywords"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">scopeproperty</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="k">def</span> <span class="nf">decoratescope</span><span class="p">(</span><span class="n">func</span><span class="p">):</span> <span class="n">scopename</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="n">func</span><span class="o">.</span><span class="n">__name__</span> <span class="k">def</span> <span class="nf">provide</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="n">func</span><span class="o">.</span><span class="n">__name__</span> <span class="ow">in</span> <span class="n">scope2props</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">]:</span> <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s">"</span><span class="si">%s</span><span class="s"> not available in </span><span class="si">%s</span><span class="s">-scoped context"</span> <span class="o">%</span> <span class="p">(</span> <span class="n">scopename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">))</span> <span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">provide</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="n">func</span><span class="o">.</span><span class="n">__doc__</span><span class="p">)</span> <span class="k">return</span> <span class="n">decoratescope</span> <div class="viewcode-block" id="FixtureRequest"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest">[docs]</a><span class="k">class</span> <span class="nc">FixtureRequest</span><span class="p">(</span><span class="n">FuncargnamesCompatAttr</span><span class="p">):</span> <span class="sd">""" A request for a fixture from a test or fixture function.</span> <span class="sd"> A request object gives access to the requesting test context</span> <span class="sd"> and has an optional ``param`` attribute in case</span> <span class="sd"> the fixture is parametrized indirectly.</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">pyfuncitem</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span> <span class="o">=</span> <span class="n">pyfuncitem</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">pyfuncitem</span><span class="p">,</span> <span class="s">'_requestparam'</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">pyfuncitem</span><span class="o">.</span><span class="n">_requestparam</span> <span class="c">#: fixture for which this request is being performed</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturename</span> <span class="o">=</span> <span class="bp">None</span> <span class="c">#: Scope string, one of "function", "cls", "module", "session"</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="s">"function"</span> <span class="bp">self</span><span class="o">.</span><span class="n">getparent</span> <span class="o">=</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">getparent</span> <span class="bp">self</span><span class="o">.</span><span class="n">_funcargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">funcargs</span><span class="o">.</span><span class="n">copy</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">fi</span> <span class="o">=</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">_fixtureinfo</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span> <span class="o">=</span> <span class="n">fi</span><span class="o">.</span><span class="n">name2fixturedefs</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2index</span> <span class="o">=</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span> <span class="o">=</span> <span class="bp">self</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">_fixturemanager</span> <span class="o">=</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parentid</span> <span class="o">=</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">nodeid</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturestack</span> <span class="o">=</span> <span class="p">[]</span> <span class="nd">@property</span> <div class="viewcode-block" id="FixtureRequest.node"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.node">[docs]</a> <span class="k">def</span> <span class="nf">node</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" underlying collection node (depends on current request scope)"""</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getscopeitem</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">)</span> </div> <span class="k">def</span> <span class="nf">_getnextfixturedef</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argname</span><span class="p">):</span> <span class="n">fixturedefs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">fixturedefs</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="c"># we arrive here because of a getfuncargvalue(argname) usage which</span> <span class="c"># was naturally not knowable at parsing/collection time</span> <span class="n">fixturedefs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">getfixturedefs</span><span class="p">(</span> <span class="n">argname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parentid</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">argname</span><span class="p">]</span> <span class="o">=</span> <span class="n">fixturedefs</span> <span class="c"># fixturedefs is immutable so we maintain a decreasing index</span> <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2index</span><span class="o">.</span><span class="n">get</span><span class="p">(</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="mi">1</span> <span class="k">if</span> <span class="n">fixturedefs</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="p">(</span><span class="o">-</span><span class="n">index</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="n">fixturedefs</span><span class="p">)):</span> <span class="k">raise</span> <span class="n">FixtureLookupError</span><span class="p">(</span><span class="n">argname</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">_arg2index</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="o">=</span> <span class="n">index</span> <span class="k">return</span> <span class="n">fixturedefs</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="nd">@property</span> <div class="viewcode-block" id="FixtureRequest.config"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.config">[docs]</a> <span class="k">def</span> <span class="nf">config</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" the pytest config object associated with this request. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">config</span> </div> <span class="nd">@scopeproperty</span><span class="p">()</span> <div class="viewcode-block" id="FixtureRequest.function"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.function">[docs]</a> <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="sd">""" test function object if the request has a per-function scope. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">obj</span> </div> <span class="nd">@scopeproperty</span><span class="p">(</span><span class="s">"class"</span><span class="p">)</span> <div class="viewcode-block" id="FixtureRequest.cls"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.cls">[docs]</a> <span class="k">def</span> <span class="nf">cls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" class (can be None) where the test function was collected. """</span> <span class="n">clscol</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="n">pytest</span><span class="o">.</span><span class="n">Class</span><span class="p">)</span> <span class="k">if</span> <span class="n">clscol</span><span class="p">:</span> <span class="k">return</span> <span class="n">clscol</span><span class="o">.</span><span class="n">obj</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="FixtureRequest.instance"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.instance">[docs]</a> <span class="k">def</span> <span class="nf">instance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" instance (can be None) on which test function was collected. """</span> <span class="c"># unittest support hack, see _pytest.unittest.TestCaseFunction</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">_pyfuncitem</span><span class="o">.</span><span class="n">_testcase</span> <span class="k">except</span> <span class="ne">AttributeError</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">_getimself</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="p">)</span> </div> <span class="nd">@scopeproperty</span><span class="p">()</span> <div class="viewcode-block" id="FixtureRequest.module"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.module">[docs]</a> <span class="k">def</span> <span class="nf">module</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" python module object where the test function was collected. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="n">pytest</span><span class="o">.</span><span class="n">Module</span><span class="p">)</span><span class="o">.</span><span class="n">obj</span> </div> <span class="nd">@scopeproperty</span><span class="p">()</span> <div class="viewcode-block" id="FixtureRequest.fspath"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.fspath">[docs]</a> <span class="k">def</span> <span class="nf">fspath</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" the file system path of the test module which collected this test. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">fspath</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="FixtureRequest.keywords"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.keywords">[docs]</a> <span class="k">def</span> <span class="nf">keywords</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" keywords/markers dictionary for the underlying node. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">keywords</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="FixtureRequest.session"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.session">[docs]</a> <span class="k">def</span> <span class="nf">session</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" pytest session object. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">session</span> </div> <div class="viewcode-block" id="FixtureRequest.addfinalizer"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.addfinalizer">[docs]</a> <span class="k">def</span> <span class="nf">addfinalizer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">finalizer</span><span class="p">):</span> <span class="sd">"""add finalizer/teardown function to be called after the</span> <span class="sd"> last test within the requesting test context finished</span> <span class="sd"> execution. """</span> <span class="c"># XXX usually this method is shadowed by fixturedef specific ones</span> <span class="bp">self</span><span class="o">.</span><span class="n">_addfinalizer</span><span class="p">(</span><span class="n">finalizer</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">)</span> </div> <span class="k">def</span> <span class="nf">_addfinalizer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">finalizer</span><span class="p">,</span> <span class="n">scope</span><span class="p">):</span> <span class="k">if</span> <span class="n">scope</span> <span class="o">!=</span> <span class="s">"function"</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"param"</span><span class="p">):</span> <span class="c"># parametrized resources are sorted by param</span> <span class="c"># so we rather store finalizers per (argname, param)</span> <span class="n">colitem</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fixturename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">param</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">colitem</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getscopeitem</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</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">addfinalizer</span><span class="p">(</span> <span class="n">finalizer</span><span class="o">=</span><span class="n">finalizer</span><span class="p">,</span> <span class="n">colitem</span><span class="o">=</span><span class="n">colitem</span><span class="p">)</span> <div class="viewcode-block" id="FixtureRequest.applymarker"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.applymarker">[docs]</a> <span class="k">def</span> <span class="nf">applymarker</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">marker</span><span class="p">):</span> <span class="sd">""" Apply a marker to a single test function invocation.</span> <span class="sd"> This method is useful if you don't want to have a keyword/marker</span> <span class="sd"> on all function invocations.</span> <span class="sd"> :arg marker: a :py:class:`_pytest.mark.MarkDecorator` object</span> <span class="sd"> created by a call to ``py.test.mark.NAME(...)``.</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">keywords</span><span class="p">[</span><span class="n">marker</span><span class="o">.</span><span class="n">markname</span><span class="p">]</span> <span class="o">=</span> <span class="n">marker</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">marker</span><span class="p">)</span> </div> <div class="viewcode-block" id="FixtureRequest.raiseerror"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.raiseerror">[docs]</a> <span class="k">def</span> <span class="nf">raiseerror</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span> <span class="sd">""" raise a FixtureLookupError with the given message. """</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">FixtureLookupError</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> </div> <span class="k">def</span> <span class="nf">_fillfixtures</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">item</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span> <span class="n">fixturenames</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s">"fixturenames"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span><span class="p">)</span> <span class="k">for</span> <span class="n">argname</span> <span class="ow">in</span> <span class="n">fixturenames</span><span class="p">:</span> <span class="k">if</span> <span class="n">argname</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">item</span><span class="o">.</span><span class="n">funcargs</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">funcargs</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getfuncargvalue</span><span class="p">(</span><span class="n">argname</span><span class="p">)</span> <div class="viewcode-block" id="FixtureRequest.cached_setup"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.cached_setup">[docs]</a> <span class="k">def</span> <span class="nf">cached_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">setup</span><span class="p">,</span> <span class="n">teardown</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="s">"module"</span><span class="p">,</span> <span class="n">extrakey</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="sd">""" (deprecated) Return a testing resource managed by ``setup`` &</span> <span class="sd"> ``teardown`` calls. ``scope`` and ``extrakey`` determine when the</span> <span class="sd"> ``teardown`` function will be called so that subsequent calls to</span> <span class="sd"> ``setup`` would recreate the resource. With pytest-2.3 you often</span> <span class="sd"> do not need ``cached_setup()`` as you can directly declare a scope</span> <span class="sd"> on a fixture function and register a finalizer through</span> <span class="sd"> ``request.addfinalizer()``.</span> <span class="sd"> :arg teardown: function receiving a previously setup resource.</span> <span class="sd"> :arg setup: a no-argument function creating a resource.</span> <span class="sd"> :arg scope: a string value out of ``function``, ``class``, ``module``</span> <span class="sd"> or ``session`` indicating the caching lifecycle of the resource.</span> <span class="sd"> :arg extrakey: added to internal caching key of (funcargname, scope).</span> <span class="sd"> """</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</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="s">'_setupcache'</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">_setupcache</span> <span class="o">=</span> <span class="p">{}</span> <span class="c"># XXX weakref?</span> <span class="n">cachekey</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fixturename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getscopeitem</span><span class="p">(</span><span class="n">scope</span><span class="p">),</span> <span class="n">extrakey</span><span class="p">)</span> <span class="n">cache</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">_setupcache</span> <span class="k">try</span><span class="p">:</span> <span class="n">val</span> <span class="o">=</span> <span class="n">cache</span><span class="p">[</span><span class="n">cachekey</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">if</span> <span class="n">scopemismatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">,</span> <span class="n">scope</span><span class="p">):</span> <span class="k">raise</span> <span class="n">ScopeMismatchError</span><span class="p">(</span><span class="s">"You tried to access a </span><span class="si">%r</span><span class="s"> scoped "</span> <span class="s">"resource with a </span><span class="si">%r</span><span class="s"> scoped request object"</span> <span class="o">%</span><span class="p">(</span> <span class="p">(</span><span class="n">scope</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">)))</span> <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">val</span> <span class="o">=</span> <span class="n">setup</span><span class="p">()</span> <span class="n">cache</span><span class="p">[</span><span class="n">cachekey</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> <span class="k">if</span> <span class="n">teardown</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="k">def</span> <span class="nf">finalizer</span><span class="p">():</span> <span class="k">del</span> <span class="n">cache</span><span class="p">[</span><span class="n">cachekey</span><span class="p">]</span> <span class="n">teardown</span><span class="p">(</span><span class="n">val</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">finalizer</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">scope</span><span class="p">)</span> <span class="k">return</span> <span class="n">val</span> </div> <div class="viewcode-block" id="FixtureRequest.getfuncargvalue"><a class="viewcode-back" href="../../builtin.html#_pytest.python.FixtureRequest.getfuncargvalue">[docs]</a> <span class="k">def</span> <span class="nf">getfuncargvalue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argname</span><span class="p">):</span> <span class="sd">""" Dynamically retrieve a named fixture function argument.</span> <span class="sd"> As of pytest-2.3, it is easier and usually better to access other</span> <span class="sd"> fixture values by stating it as an input argument in the fixture</span> <span class="sd"> function. If you only can decide about using another fixture at test</span> <span class="sd"> setup time, you may use this function to retrieve it inside a fixture</span> <span class="sd"> function body.</span> <span class="sd"> """</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">_funcargs</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">try</span><span class="p">:</span> <span class="n">fixturedef</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getnextfixturedef</span><span class="p">(</span><span class="n">argname</span><span class="p">)</span> <span class="k">except</span> <span class="n">FixtureLookupError</span><span class="p">:</span> <span class="k">if</span> <span class="n">argname</span> <span class="o">==</span> <span class="s">"request"</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturestack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fixturedef</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getfuncargvalue</span><span class="p">(</span><span class="n">fixturedef</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">argname</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span> <span class="k">return</span> <span class="n">result</span> <span class="k">finally</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturestack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> </div> <span class="k">def</span> <span class="nf">_getfuncargvalue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fixturedef</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">cached_result</span> <span class="c"># set by fixturedef.execute()</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="c"># prepare request fixturename and param attributes before</span> <span class="c"># calling into fixture function</span> <span class="n">argname</span> <span class="o">=</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">argname</span> <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span> <span class="n">mp</span> <span class="o">=</span> <span class="n">monkeypatch</span><span class="p">()</span> <span class="n">mp</span><span class="o">.</span><span class="n">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'fixturename'</span><span class="p">,</span> <span class="n">argname</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">param</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">callspec</span><span class="o">.</span><span class="n">getparam</span><span class="p">(</span><span class="n">argname</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span> <span class="k">pass</span> <span class="k">else</span><span class="p">:</span> <span class="n">mp</span><span class="o">.</span><span class="n">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'param'</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">raising</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span> <span class="c"># if a parametrize invocation set a scope it will override</span> <span class="c"># the static scope defined with the fixture function</span> <span class="n">scope</span> <span class="o">=</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">scope</span> <span class="k">try</span><span class="p">:</span> <span class="n">paramscopenum</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">callspec</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="k">except</span> <span class="p">(</span><span class="ne">KeyError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span> <span class="k">pass</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">paramscopenum</span> <span class="o">!=</span> <span class="n">scopenum_subfunction</span><span class="p">:</span> <span class="n">scope</span> <span class="o">=</span> <span class="n">scopes</span><span class="p">[</span><span class="n">paramscopenum</span><span class="p">]</span> <span class="c"># check if a higher-level scoped fixture accesses a lower level one</span> <span class="k">if</span> <span class="n">scope</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">if</span> <span class="n">scopemismatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">,</span> <span class="n">scope</span><span class="p">):</span> <span class="c"># try to report something helpful</span> <span class="n">lines</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_factorytraceback</span><span class="p">()</span> <span class="k">raise</span> <span class="n">ScopeMismatchError</span><span class="p">(</span><span class="s">"You tried to access the </span><span class="si">%r</span><span class="s"> scoped "</span> <span class="s">"funcarg </span><span class="si">%r</span><span class="s"> with a </span><span class="si">%r</span><span class="s"> scoped request object, "</span> <span class="s">"involved factories</span><span class="se">\n</span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span><span class="p">(</span> <span class="p">(</span><span class="n">scope</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">))))</span> <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">mp</span><span class="o">.</span><span class="n">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"scope"</span><span class="p">,</span> <span class="n">scope</span><span class="p">)</span> <span class="c"># route request.addfinalizer to fixturedef</span> <span class="n">mp</span><span class="o">.</span><span class="n">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"addfinalizer"</span><span class="p">,</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">addfinalizer</span><span class="p">)</span> <span class="c"># perform the fixture call</span> <span class="n">val</span> <span class="o">=</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">request</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span> <span class="c"># prepare finalization according to scope</span> <span class="c"># (XXX analyse exact finalizing mechanics / cleanup)</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">addfinalizer</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">finish</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">addargfinalizer</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">finish</span><span class="p">,</span> <span class="n">argname</span><span class="p">)</span> <span class="k">for</span> <span class="n">subargname</span> <span class="ow">in</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">argnames</span><span class="p">:</span> <span class="c"># XXX all deps?</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">addargfinalizer</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">finish</span><span class="p">,</span> <span class="n">subargname</span><span class="p">)</span> <span class="n">mp</span><span class="o">.</span><span class="n">undo</span><span class="p">()</span> <span class="k">return</span> <span class="n">val</span> <span class="k">def</span> <span class="nf">_factorytraceback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">fixturedef</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturestack</span><span class="p">:</span> <span class="n">factory</span> <span class="o">=</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">func</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="n">factory</span><span class="p">)</span> <span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">fspath</span><span class="o">.</span><span class="n">bestrelpath</span><span class="p">(</span><span class="n">fs</span><span class="p">)</span> <span class="n">args</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">formatargspec</span><span class="p">(</span><span class="o">*</span><span class="n">inspect</span><span class="o">.</span><span class="n">getargspec</span><span class="p">(</span><span class="n">factory</span><span class="p">))</span> <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"</span><span class="si">%s</span><span class="s">:</span><span class="si">%d</span><span class="s">: def </span><span class="si">%s%s</span><span class="s">"</span> <span class="o">%</span><span class="p">(</span> <span class="n">p</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">factory</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="n">args</span><span class="p">))</span> <span class="k">return</span> <span class="n">lines</span> <span class="k">def</span> <span class="nf">_getscopeitem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">scope</span><span class="p">):</span> <span class="k">if</span> <span class="n">scope</span> <span class="o">==</span> <span class="s">"function"</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span> <span class="k">elif</span> <span class="n">scope</span> <span class="o">==</span> <span class="s">"session"</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="k">elif</span> <span class="n">scope</span> <span class="o">==</span> <span class="s">"class"</span><span class="p">:</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="n">pytest</span><span class="o">.</span><span class="n">Class</span><span class="p">)</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="k">return</span> <span class="n">x</span> <span class="n">scope</span> <span class="o">=</span> <span class="s">"module"</span> <span class="k">if</span> <span class="n">scope</span> <span class="o">==</span> <span class="s">"module"</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="n">pytest</span><span class="o">.</span><span class="n">Module</span><span class="p">)</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"unknown finalization scope </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span><span class="p">(</span><span class="n">scope</span><span class="p">,))</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="s">"<FixtureRequest for </span><span class="si">%r</span><span class="s">>"</span> <span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">)</span> </div> <span class="k">class</span> <span class="nc">ScopeMismatchError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="sd">""" A fixture function tries to use a different fixture function which</span> <span class="sd"> which has a lower scope (e.g. a Session one calls a function one)</span> <span class="sd"> """</span> <span class="n">scopes</span> <span class="o">=</span> <span class="s">"session module class function subfunction"</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> <span class="n">scopenum_subfunction</span> <span class="o">=</span> <span class="n">scopes</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s">"subfunction"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">scopemismatch</span><span class="p">(</span><span class="n">currentscope</span><span class="p">,</span> <span class="n">newscope</span><span class="p">):</span> <span class="k">return</span> <span class="n">scopes</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">newscope</span><span class="p">)</span> <span class="o">></span> <span class="n">scopes</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">currentscope</span><span class="p">)</span> <span class="k">class</span> <span class="nc">FixtureLookupError</span><span class="p">(</span><span class="ne">LookupError</span><span class="p">):</span> <span class="sd">""" could not return a requested Fixture (missing or invalid). """</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">argname</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">argname</span> <span class="o">=</span> <span class="n">argname</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="n">request</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturestack</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">_fixturestack</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="k">def</span> <span class="nf">formatrepr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">tblines</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">addline</span> <span class="o">=</span> <span class="n">tblines</span><span class="o">.</span><span class="n">append</span> <span class="n">stack</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">_pyfuncitem</span><span class="o">.</span><span class="n">obj</span><span class="p">]</span> <span class="n">stack</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">func</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturestack</span><span class="p">))</span> <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">stack</span> <span class="o">=</span> <span class="n">stack</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c"># the last fixture raise an error, let's present</span> <span class="c"># it at the requesting side</span> <span class="k">for</span> <span class="n">function</span> <span class="ow">in</span> <span class="n">stack</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">function</span><span class="p">)</span> <span class="n">lines</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getsourcelines</span><span class="p">(</span><span class="n">function</span><span class="p">)</span> <span class="n">addline</span><span class="p">(</span><span class="s">"file </span><span class="si">%s</span><span class="s">, line </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</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="mi">1</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span> <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span> <span class="n">addline</span><span class="p">(</span><span class="s">" "</span> <span class="o">+</span> <span class="n">line</span><span class="p">)</span> <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">lstrip</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">'def'</span><span class="p">):</span> <span class="k">break</span> <span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="bp">None</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">request</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="n">nodeid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">_parentid</span> <span class="n">available</span> <span class="o">=</span> <span class="p">[]</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">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="n">faclist</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">fm</span><span class="o">.</span><span class="n">_matchfactories</span><span class="p">(</span><span class="n">fixturedef</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">_parentid</span><span class="p">))</span> <span class="k">if</span> <span class="n">faclist</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="n">name</span><span class="p">)</span> <span class="n">msg</span> <span class="o">=</span> <span class="s">"fixture </span><span class="si">%r</span><span class="s"> not found"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">argname</span><span class="p">,)</span> <span class="n">msg</span> <span class="o">+=</span> <span class="s">"</span><span class="se">\n</span><span class="s"> available fixtures: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span><span class="p">(</span><span class="s">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">available</span><span class="p">),)</span> <span class="n">msg</span> <span class="o">+=</span> <span class="s">"</span><span class="se">\n</span><span class="s"> use 'py.test --fixtures [testpath]' for help on them."</span> <span class="k">return</span> <span class="n">FixtureLookupErrorRepr</span><span class="p">(</span><span class="n">fspath</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">tblines</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">argname</span><span class="p">)</span> <span class="k">class</span> <span class="nc">FixtureLookupErrorRepr</span><span class="p">(</span><span class="n">TerminalRepr</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">filename</span><span class="p">,</span> <span class="n">firstlineno</span><span class="p">,</span> <span class="n">tblines</span><span class="p">,</span> <span class="n">errorstring</span><span class="p">,</span> <span class="n">argname</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">tblines</span> <span class="o">=</span> <span class="n">tblines</span> <span class="bp">self</span><span class="o">.</span><span class="n">errorstring</span> <span class="o">=</span> <span class="n">errorstring</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span> <span class="bp">self</span><span class="o">.</span><span class="n">firstlineno</span> <span class="o">=</span> <span class="n">firstlineno</span> <span class="bp">self</span><span class="o">.</span><span class="n">argname</span> <span class="o">=</span> <span class="n">argname</span> <span class="k">def</span> <span class="nf">toterminal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tw</span><span class="p">):</span> <span class="c">#tw.line("FixtureLookupError: %s" %(self.argname), red=True)</span> <span class="k">for</span> <span class="n">tbline</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tblines</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">tbline</span><span class="o">.</span><span class="n">rstrip</span><span class="p">())</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">errorstring</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</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="s">" "</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="n">red</span><span class="o">=</span><span class="bp">True</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">line</span><span class="p">(</span><span class="s">"</span><span class="si">%s</span><span class="s">:</span><span class="si">%d</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">firstlineno</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> <span class="k">class</span> <span class="nc">FixtureManager</span><span class="p">:</span> <span class="sd">"""</span> <span class="sd"> pytest fixtures definitions and information is stored and managed</span> <span class="sd"> from this class.</span> <span class="sd"> During collection fm.parsefactories() is called multiple times to parse</span> <span class="sd"> fixture function definitions into FixtureDef objects and internal</span> <span class="sd"> data structures.</span> <span class="sd"> During collection of test functions, metafunc-mechanics instantiate</span> <span class="sd"> a FuncFixtureInfo object which is cached per node/func-name.</span> <span class="sd"> This FuncFixtureInfo object is later retrieved by Function nodes</span> <span class="sd"> which themselves offer a fixturenames attribute.</span> <span class="sd"> The FuncFixtureInfo object holds information about fixtures and FixtureDefs</span> <span class="sd"> relevant for a particular function. An initial list of fixtures is</span> <span class="sd"> assembled like this:</span> <span class="sd"> - ini-defined usefixtures</span> <span class="sd"> - autouse-marked fixtures along the collection chain up from the function</span> <span class="sd"> - usefixtures markers at module/class/function level</span> <span class="sd"> - test function funcargs</span> <span class="sd"> Subsequently the funcfixtureinfo.fixturenames attribute is computed</span> <span class="sd"> as the closure of the fixtures needed to setup the initial fixtures,</span> <span class="sd"> i. e. fixtures needed by fixture functions themselves are appended</span> <span class="sd"> to the fixturenames list.</span> <span class="sd"> Upon the test-setup phases all fixturenames are instantiated, retrieved</span> <span class="sd"> by a lookup of their FuncFixtureInfo.</span> <span class="sd"> """</span> <span class="n">_argprefix</span> <span class="o">=</span> <span class="s">"pytest_funcarg__"</span> <span class="n">FixtureLookupError</span> <span class="o">=</span> <span class="n">FixtureLookupError</span> <span class="n">FixtureLookupErrorRepr</span> <span class="o">=</span> <span class="n">FixtureLookupErrorRepr</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">session</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">session</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">config</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span> <span class="o">=</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seenplugins</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">_holderobjseen</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">_arg2finish</span> <span class="o">=</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodeid_and_autousenames</span> <span class="o">=</span> <span class="p">[(</span><span class="s">""</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">getini</span><span class="p">(</span><span class="s">"usefixtures"</span><span class="p">))]</span> <span class="n">session</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">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"funcmanage"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodename2fixtureinfo</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">def</span> <span class="nf">getfixtureinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="n">funcargs</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">func</span><span class="o">.</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">_nodename2fixtureinfo</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">if</span> <span class="n">funcargs</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s">"nofuncargs"</span><span class="p">):</span> <span class="k">if</span> <span class="n">cls</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">startindex</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="n">startindex</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">argnames</span> <span class="o">=</span> <span class="n">getfuncargnames</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">startindex</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">argnames</span> <span class="o">=</span> <span class="p">()</span> <span class="n">usefixtures</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="s">"usefixtures"</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="n">initialnames</span> <span class="o">=</span> <span class="n">argnames</span> <span class="k">if</span> <span class="n">usefixtures</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">initialnames</span> <span class="o">=</span> <span class="n">usefixtures</span><span class="o">.</span><span class="n">args</span> <span class="o">+</span> <span class="n">initialnames</span> <span class="n">fm</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="n">names_closure</span><span class="p">,</span> <span class="n">arg2fixturedefs</span> <span class="o">=</span> <span class="n">fm</span><span class="o">.</span><span class="n">getfixtureclosure</span><span class="p">(</span><span class="n">initialnames</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span> <span class="n">fixtureinfo</span> <span class="o">=</span> <span class="n">FuncFixtureInfo</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">names_closure</span><span class="p">,</span> <span class="n">arg2fixturedefs</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodename2fixtureinfo</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">fixtureinfo</span> <span class="k">return</span> <span class="n">fixtureinfo</span> <span class="c">### XXX this hook should be called for historic events like pytest_configure</span> <span class="c">### so that we don't have to do the below pytest_configure hook</span> <span class="k">def</span> <span class="nf">pytest_plugin_registered</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">plugin</span><span class="p">):</span> <span class="k">if</span> <span class="n">plugin</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seenplugins</span><span class="p">:</span> <span class="k">return</span> <span class="c">#print "plugin_registered", plugin</span> <span class="n">nodeid</span> <span class="o">=</span> <span class="s">""</span> <span class="k">try</span><span class="p">:</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">plugin</span><span class="o">.</span><span class="n">__file__</span><span class="p">)</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">basename</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">"conftest.py"</span><span class="p">):</span> <span class="n">nodeid</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">dirpath</span><span class="p">()</span><span class="o">.</span><span class="n">relto</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">fspath</span><span class="p">)</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">sep</span> <span class="o">!=</span> <span class="s">"/"</span><span class="p">:</span> <span class="n">nodeid</span> <span class="o">=</span> <span class="n">nodeid</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">sep</span><span class="p">,</span> <span class="s">"/"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">parsefactories</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">nodeid</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seenplugins</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">plugin</span><span class="p">)</span> <span class="nd">@pytest.mark.tryfirst</span> <span class="k">def</span> <span class="nf">pytest_configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span> <span class="n">plugins</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">getplugins</span><span class="p">()</span> <span class="k">for</span> <span class="n">plugin</span> <span class="ow">in</span> <span class="n">plugins</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">pytest_plugin_registered</span><span class="p">(</span><span class="n">plugin</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_getautousenames</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nodeid</span><span class="p">):</span> <span class="sd">""" return a tuple of fixture names to be used. """</span> <span class="n">autousenames</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">baseid</span><span class="p">,</span> <span class="n">basenames</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodeid_and_autousenames</span><span class="p">:</span> <span class="k">if</span> <span class="n">nodeid</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">baseid</span><span class="p">):</span> <span class="k">if</span> <span class="n">baseid</span><span class="p">:</span> <span class="n">i</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">baseid</span><span class="p">)</span> <span class="n">nextchar</span> <span class="o">=</span> <span class="n">nodeid</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">nextchar</span> <span class="ow">and</span> <span class="n">nextchar</span> <span class="ow">not</span> <span class="ow">in</span> <span class="s">":/"</span><span class="p">:</span> <span class="k">continue</span> <span class="n">autousenames</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">basenames</span><span class="p">)</span> <span class="c"># make sure autousenames are sorted by scope, scopenum 0 is session</span> <span class="n">autousenames</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">x</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">x</span><span class="p">][</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">scopenum</span><span class="p">)</span> <span class="k">return</span> <span class="n">autousenames</span> <span class="k">def</span> <span class="nf">getfixtureclosure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fixturenames</span><span class="p">,</span> <span class="n">parentnode</span><span class="p">):</span> <span class="c"># collect the closure of all fixtures , starting with the given</span> <span class="c"># fixturenames as the initial set. As we have to visit all</span> <span class="c"># factory definitions anyway, we also return a arg2fixturedefs</span> <span class="c"># mapping so that the caller can reuse it and does not have</span> <span class="c"># to re-discover fixturedefs again for each fixturename</span> <span class="c"># (discovering matching fixtures for a given name/node is expensive)</span> <span class="n">parentid</span> <span class="o">=</span> <span class="n">parentnode</span><span class="o">.</span><span class="n">nodeid</span> <span class="n">fixturenames_closure</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getautousenames</span><span class="p">(</span><span class="n">parentid</span><span class="p">)</span> <span class="k">def</span> <span class="nf">merge</span><span class="p">(</span><span class="n">otherlist</span><span class="p">):</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">otherlist</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">fixturenames_closure</span><span class="p">:</span> <span class="n">fixturenames_closure</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="n">merge</span><span class="p">(</span><span class="n">fixturenames</span><span class="p">)</span> <span class="n">arg2fixturedefs</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">lastlen</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="k">while</span> <span class="n">lastlen</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">fixturenames_closure</span><span class="p">):</span> <span class="n">lastlen</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">fixturenames_closure</span><span class="p">)</span> <span class="k">for</span> <span class="n">argname</span> <span class="ow">in</span> <span class="n">fixturenames_closure</span><span class="p">:</span> <span class="k">if</span> <span class="n">argname</span> <span class="ow">in</span> <span class="n">arg2fixturedefs</span><span class="p">:</span> <span class="k">continue</span> <span class="n">fixturedefs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getfixturedefs</span><span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="n">parentid</span><span class="p">)</span> <span class="n">arg2fixturedefs</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="o">=</span> <span class="n">fixturedefs</span> <span class="k">if</span> <span class="n">fixturedefs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</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">merge</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">argnames</span><span class="p">)</span> <span class="k">return</span> <span class="n">fixturenames_closure</span><span class="p">,</span> <span class="n">arg2fixturedefs</span> <span class="k">def</span> <span class="nf">pytest_generate_tests</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="k">for</span> <span class="n">argname</span> <span class="ow">in</span> <span class="n">metafunc</span><span class="o">.</span><span class="n">fixturenames</span><span class="p">:</span> <span class="n">faclist</span> <span class="o">=</span> <span class="n">metafunc</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="k">if</span> <span class="n">faclist</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="k">continue</span> <span class="c"># will raise FixtureLookupError at setup time</span> <span class="k">for</span> <span class="n">fixturedef</span> <span class="ow">in</span> <span class="n">faclist</span><span class="p">:</span> <span class="k">if</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">params</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</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="n">argname</span><span class="p">,</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">params</span><span class="p">,</span> <span class="n">indirect</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">scope</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_collection_modifyitems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">items</span><span class="p">):</span> <span class="c"># separate parametrized setups</span> <span class="n">items</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">parametrize_sorted</span><span class="p">(</span><span class="n">items</span><span class="p">,</span> <span class="nb">set</span><span class="p">(),</span> <span class="p">{},</span> <span class="mi">0</span><span class="p">)</span> <span class="k">def</span> <span class="nf">pytest_runtest_teardown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">nextitem</span><span class="p">):</span> <span class="c"># XXX teardown needs to be normalized for parametrized and</span> <span class="c"># no-parametrized functions</span> <span class="k">try</span><span class="p">:</span> <span class="n">cs1</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">callspec</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">return</span> <span class="c"># determine which fixtures are not needed anymore for the next test</span> <span class="n">keylist</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">cs1</span><span class="o">.</span><span class="n">params</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">nextitem</span><span class="o">.</span><span class="n">callspec</span><span class="o">.</span><span class="n">params</span> <span class="ow">and</span> \ <span class="n">cs1</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="o">==</span> <span class="n">nextitem</span><span class="o">.</span><span class="n">callspec</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">continue</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="n">cs1</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="n">name</span><span class="p">,</span> <span class="n">cs1</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="n">keylist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="c"># sort by scope (function scope first, then higher ones)</span> <span class="n">keylist</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> <span class="k">for</span> <span class="p">(</span><span class="n">scopenum</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> <span class="ow">in</span> <span class="n">keylist</span><span class="p">:</span> <span class="n">item</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">_callfinalizers</span><span class="p">((</span><span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">))</span> <span class="n">l</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2finish</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">l</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="k">for</span> <span class="n">fin</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">l</span><span class="p">):</span> <span class="n">fin</span><span class="p">()</span> <span class="k">def</span> <span class="nf">parsefactories</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node_or_obj</span><span class="p">,</span> <span class="n">nodeid</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">unittest</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span> <span class="k">if</span> <span class="n">nodeid</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">holderobj</span> <span class="o">=</span> <span class="n">node_or_obj</span> <span class="k">else</span><span class="p">:</span> <span class="n">holderobj</span> <span class="o">=</span> <span class="n">node_or_obj</span><span class="o">.</span><span class="n">obj</span> <span class="n">nodeid</span> <span class="o">=</span> <span class="n">node_or_obj</span><span class="o">.</span><span class="n">nodeid</span> <span class="k">if</span> <span class="n">holderobj</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_holderobjseen</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_holderobjseen</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">holderobj</span><span class="p">)</span> <span class="n">autousenames</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">holderobj</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="n">holderobj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="k">continue</span> <span class="c"># fixture functions have a pytest_funcarg__ prefix (pre-2.3 style)</span> <span class="c"># or are "@pytest.fixture" marked</span> <span class="n">marker</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="k">if</span> <span class="n">marker</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_argprefix</span><span class="p">):</span> <span class="k">continue</span> <span class="n">marker</span> <span class="o">=</span> <span class="n">defaultfuncargprefixmarker</span> <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_argprefix</span><span class="p">):]</span> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">marker</span><span class="p">,</span> <span class="n">FixtureFunctionMarker</span><span class="p">):</span> <span class="c"># magic globals with __getattr__ might have got us a wrong</span> <span class="c"># fixture attribute</span> <span class="k">continue</span> <span class="k">else</span><span class="p">:</span> <span class="k">assert</span> <span class="ow">not</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_argprefix</span><span class="p">)</span> <span class="n">fixturedef</span> <span class="o">=</span> <span class="n">FixtureDef</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nodeid</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">marker</span><span class="o">.</span><span class="n">scope</span><span class="p">,</span> <span class="n">marker</span><span class="o">.</span><span class="n">params</span><span class="p">,</span> <span class="n">unittest</span><span class="o">=</span><span class="n">unittest</span><span class="p">)</span> <span class="n">faclist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="p">[])</span> <span class="n">faclist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fixturedef</span><span class="p">)</span> <span class="k">if</span> <span class="n">marker</span><span class="o">.</span><span class="n">autouse</span><span class="p">:</span> <span class="n">autousenames</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">if</span> <span class="n">autousenames</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodeid_and_autousenames</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">nodeid</span><span class="p">,</span> <span class="n">autousenames</span><span class="p">))</span> <span class="k">def</span> <span class="nf">getfixturedefs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="n">nodeid</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="n">fixturedefs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">return</span> <span class="bp">None</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_matchfactories</span><span class="p">(</span><span class="n">fixturedefs</span><span class="p">,</span> <span class="n">nodeid</span><span class="p">))</span> <span class="k">def</span> <span class="nf">_matchfactories</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fixturedefs</span><span class="p">,</span> <span class="n">nodeid</span><span class="p">):</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="k">if</span> <span class="n">nodeid</span><span class="o">.</span><span class="n">startswith</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="k">yield</span> <span class="n">fixturedef</span> <span class="k">def</span> <span class="nf">addargfinalizer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">finalizer</span><span class="p">,</span> <span class="n">argname</span><span class="p">):</span> <span class="n">l</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2finish</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="p">[])</span> <span class="n">l</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">finalizer</span><span class="p">)</span> <span class="k">def</span> <span class="nf">removefinalizer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">finalizer</span><span class="p">):</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2finish</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="k">try</span><span class="p">:</span> <span class="n">l</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">finalizer</span><span class="p">)</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">class</span> <span class="nc">FixtureDef</span><span class="p">:</span> <span class="sd">""" A container for a factory definition. """</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">fixturemanager</span><span class="p">,</span> <span class="n">baseid</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">scope</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">unittest</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="o">=</span> <span class="n">fixturemanager</span> <span class="bp">self</span><span class="o">.</span><span class="n">baseid</span> <span class="o">=</span> <span class="n">baseid</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span> <span class="o">=</span> <span class="n">func</span> <span class="bp">self</span><span class="o">.</span><span class="n">argname</span> <span class="o">=</span> <span class="n">argname</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="n">scope</span> <span class="bp">self</span><span class="o">.</span><span class="n">scopenum</span> <span class="o">=</span> <span class="n">scopes</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">scope</span> <span class="ow">or</span> <span class="s">"function"</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="n">params</span> <span class="n">startindex</span> <span class="o">=</span> <span class="n">unittest</span> <span class="ow">and</span> <span class="mi">1</span> <span class="ow">or</span> <span class="bp">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">argnames</span> <span class="o">=</span> <span class="n">getfuncargnames</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">startindex</span><span class="o">=</span><span class="n">startindex</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">unittest</span> <span class="o">=</span> <span class="n">unittest</span> <span class="bp">self</span><span class="o">.</span><span class="n">_finalizer</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">addfinalizer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">finalizer</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_finalizer</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">finalizer</span><span class="p">)</span> <span class="k">def</span> <span class="nf">finish</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_finalizer</span><span class="p">:</span> <span class="n">func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_finalizer</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> <span class="n">func</span><span class="p">()</span> <span class="c"># check neccesity of next commented call</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">removefinalizer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">finish</span><span class="p">)</span> <span class="c">#print "finished", self</span> <span class="k">try</span><span class="p">:</span> <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">cached_result</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">newname</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">argnames</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">newname</span><span class="p">]</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">getfuncargvalue</span><span class="p">(</span><span class="n">newname</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unittest</span><span class="p">:</span> <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">fixturefunc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span> <span class="c"># the fixture function needs to be bound to the actual</span> <span class="c"># request.instance so that code working with "self" behaves</span> <span class="c"># as expected. XXX request.instance should maybe return None</span> <span class="c"># instead of raising AttributeError</span> <span class="k">try</span><span class="p">:</span> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">instance</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">fixturefunc</span> <span class="o">=</span> <span class="n">getimfunc</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">)</span> <span class="k">if</span> <span class="n">fixturefunc</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">:</span> <span class="n">fixturefunc</span> <span class="o">=</span> <span class="n">fixturefunc</span><span class="o">.</span><span class="n">__get__</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="n">result</span> <span class="o">=</span> <span class="n">fixturefunc</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</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="s">"cached_result"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">cached_result</span> <span class="o">=</span> <span class="n">result</span> <span class="k">return</span> <span class="n">result</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="s">"<FixtureDef name=</span><span class="si">%r</span><span class="s"> scope=</span><span class="si">%r</span><span class="s">>"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">argname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="p">)</span> <span class="k">def</span> <span class="nf">getfuncargnames</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="n">startindex</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="c"># XXX merge with main.py's varnames</span> <span class="c">#assert not inspect.isclass(function)</span> <span class="n">realfunction</span> <span class="o">=</span> <span class="n">function</span> <span class="k">while</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">realfunction</span><span class="p">,</span> <span class="s">"__wrapped__"</span><span class="p">):</span> <span class="n">realfunction</span> <span class="o">=</span> <span class="n">realfunction</span><span class="o">.</span><span class="n">__wrapped__</span> <span class="k">if</span> <span class="n">startindex</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">startindex</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">ismethod</span><span class="p">(</span><span class="n">function</span><span class="p">)</span> <span class="ow">and</span> <span class="mi">1</span> <span class="ow">or</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">realfunction</span> <span class="o">!=</span> <span class="n">function</span><span class="p">:</span> <span class="n">startindex</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="s">"patchings"</span><span class="p">,</span> <span class="p">[]))</span> <span class="n">function</span> <span class="o">=</span> <span class="n">realfunction</span> <span class="n">argnames</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getargs</span><span class="p">(</span><span class="n">py</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">getrawcode</span><span class="p">(</span><span class="n">function</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span> <span class="n">defaults</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="s">'func_defaults'</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="s">'__defaults__'</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span> <span class="ow">or</span> <span class="p">()</span> <span class="n">numdefaults</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">defaults</span><span class="p">)</span> <span class="k">if</span> <span class="n">numdefaults</span><span class="p">:</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">argnames</span><span class="p">[</span><span class="n">startindex</span><span class="p">:</span><span class="o">-</span><span class="n">numdefaults</span><span class="p">])</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">argnames</span><span class="p">[</span><span class="n">startindex</span><span class="p">:])</span> <span class="c"># algorithm for sorting on a per-parametrized resource setup basis</span> <span class="k">def</span> <span class="nf">parametrize_sorted</span><span class="p">(</span><span class="n">items</span><span class="p">,</span> <span class="n">ignore</span><span class="p">,</span> <span class="n">cache</span><span class="p">,</span> <span class="n">scopenum</span><span class="p">):</span> <span class="k">if</span> <span class="n">scopenum</span> <span class="o">>=</span> <span class="mi">3</span><span class="p">:</span> <span class="k">return</span> <span class="n">items</span> <span class="n">newitems</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">olditems</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">slicing_argparam</span> <span class="o">=</span> <span class="bp">None</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span><span class="p">:</span> <span class="n">argparamlist</span> <span class="o">=</span> <span class="n">getfuncargparams</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">ignore</span><span class="p">,</span> <span class="n">scopenum</span><span class="p">,</span> <span class="n">cache</span><span class="p">)</span> <span class="k">if</span> <span class="n">slicing_argparam</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">argparamlist</span><span class="p">:</span> <span class="n">slicing_argparam</span> <span class="o">=</span> <span class="n">argparamlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">slicing_index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">olditems</span><span class="p">)</span> <span class="k">if</span> <span class="n">slicing_argparam</span> <span class="ow">in</span> <span class="n">argparamlist</span><span class="p">:</span> <span class="n">newitems</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">olditems</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="n">newitems</span><span class="p">:</span> <span class="n">newignore</span> <span class="o">=</span> <span class="n">ignore</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="n">newignore</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">slicing_argparam</span><span class="p">)</span> <span class="n">newitems</span> <span class="o">=</span> <span class="n">parametrize_sorted</span><span class="p">(</span><span class="n">newitems</span> <span class="o">+</span> <span class="n">olditems</span><span class="p">[</span><span class="n">slicing_index</span><span class="p">:],</span> <span class="n">newignore</span><span class="p">,</span> <span class="n">cache</span><span class="p">,</span> <span class="n">scopenum</span><span class="p">)</span> <span class="n">old1</span> <span class="o">=</span> <span class="n">parametrize_sorted</span><span class="p">(</span><span class="n">olditems</span><span class="p">[:</span><span class="n">slicing_index</span><span class="p">],</span> <span class="n">newignore</span><span class="p">,</span> <span class="n">cache</span><span class="p">,</span> <span class="n">scopenum</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="n">old1</span> <span class="o">+</span> <span class="n">newitems</span> <span class="k">else</span><span class="p">:</span> <span class="n">olditems</span> <span class="o">=</span> <span class="n">parametrize_sorted</span><span class="p">(</span><span class="n">olditems</span><span class="p">,</span> <span class="n">ignore</span><span class="p">,</span> <span class="n">cache</span><span class="p">,</span> <span class="n">scopenum</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="n">olditems</span> <span class="o">+</span> <span class="n">newitems</span> <span class="k">def</span> <span class="nf">getfuncargparams</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">ignore</span><span class="p">,</span> <span class="n">scopenum</span><span class="p">,</span> <span class="n">cache</span><span class="p">):</span> <span class="sd">""" return list of (arg,param) tuple, sorted by broader scope first. """</span> <span class="k">assert</span> <span class="n">scopenum</span> <span class="o"><</span> <span class="mi">3</span> <span class="c"># function</span> <span class="k">try</span><span class="p">:</span> <span class="n">cs</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">callspec</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">return</span> <span class="p">[]</span> <span class="k">if</span> <span class="n">scopenum</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">argparams</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">cs</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ignore</span> <span class="ow">and</span> <span class="n">cs</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">==</span> <span class="n">scopenum</span><span class="p">]</span> <span class="k">elif</span> <span class="n">scopenum</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="c"># module</span> <span class="n">argparams</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">argname</span><span class="p">,</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">cs</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="k">if</span> <span class="n">cs</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="o">==</span> <span class="n">scopenum</span><span class="p">:</span> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">fspath</span><span class="p">)</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">ignore</span><span class="p">:</span> <span class="k">continue</span> <span class="n">argparams</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">elif</span> <span class="n">scopenum</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c"># class</span> <span class="n">argparams</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">argname</span><span class="p">,</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">cs</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="k">if</span> <span class="n">cs</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">argname</span><span class="p">]</span> <span class="o">==</span> <span class="n">scopenum</span><span class="p">:</span> <span class="n">l</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">fspath</span><span class="p">,</span> <span class="p">[])</span> <span class="k">try</span><span class="p">:</span> <span class="n">i</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">cls</span><span class="p">)</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="n">i</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">l</span><span class="p">)</span> <span class="n">l</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">cls</span><span class="p">)</span> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">fspath</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">ignore</span><span class="p">:</span> <span class="k">continue</span> <span class="n">argparams</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="c">#elif scopenum == 3:</span> <span class="c"># argparams = []</span> <span class="c"># for argname, param in cs.params.items():</span> <span class="c"># if cs._arg2scopenum[argname] == scopenum:</span> <span class="c"># key = (argname, param, getfslineno(item.obj))</span> <span class="c"># if key in ignore:</span> <span class="c"># continue</span> <span class="c"># argparams.append(key)</span> <span class="k">return</span> <span class="n">argparams</span> <span class="k">def</span> <span class="nf">xunitsetup</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">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="bp">None</span><span class="p">)</span> <span class="k">if</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="bp">None</span><span class="p">:</span> <span class="k">return</span> <span class="n">meth</span> <span class="k">def</span> <span class="nf">getfixturemarker</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="sd">""" return fixturemarker or None if it doesn't exist or raised</span> <span class="sd"> exceptions."""</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s">"_pytestfixturefunction"</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span> <span class="k">raise</span> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="c"># some objects raise errors like request (from flask import request)</span> <span class="c"># we don't expect them to be fixture functions</span> <span class="k">return</span> <span class="bp">None</span> </pre></div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li><a href="../../contents.html">pytest-2.3.4.1</a> »</li> <li><a href="../index.html" >Module code</a> »</li> <g:plusone></g:plusone> </ul> </div> <div class="footer"> © Copyright 2012, holger krekel. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. </div> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-7597274-13']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script> </body> </html>