Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > 7f671eb35339cf812de52087b0d93519 > files > 283

python3-pytest-2.3.5-3.fc18.noarch.rpm



<!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.2.4.0',
        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>
    <script type="text/javascript" src="../../_static/translations.js"></script>
    <link rel="top" title="None" href="../../index.html" />
    <link rel="up" title="モジュールコード" href="../index.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>ナビゲーション</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../../py-modindex.html" title="Pythonモジュール索引"
             >モジュール</a></li>
        <li><a href="../../contents.html">pytest-2.2.4.0</a> &raquo;</li>
          <li><a href="../index.html" accesskey="U">モジュールコード</a> &raquo;</li> 
      </ul>
    </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
  <h3>クイック検索</h3>
    <form class="search" action="../../search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="検索" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    モジュール、クラス、または関数名を入力してください
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <h1>_pytest.python のソースコード</h1><div class="highlight"><pre>
<span class="sd">&quot;&quot;&quot; Python test discovery, setup and run of test functions. &quot;&quot;&quot;</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">&quot;class fixtures not supported (may be in the future)&quot;</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>


<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">&quot;function&quot;</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">&quot;&quot;&quot; (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">                &quot;function&quot; (default), &quot;class&quot;, &quot;module&quot;, &quot;session&quot;.</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">    &quot;&quot;&quot;</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">&quot;function&quot;</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>

<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">&quot;python </span><span class="si">%s</span><span class="s"> object this node was collected from (can be None).&quot;</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">&quot;general&quot;</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">&#39;--fixtures&#39;</span><span class="p">,</span> <span class="s">&#39;--funcargs&#39;</span><span class="p">,</span>
               <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;showfixtures&quot;</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">&quot;show available fixtures, sorted by plugin appearance&quot;</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">&quot;usefixtures&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">&quot;args&quot;</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">&quot;list of default fixtures to be used with this project&quot;</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">&quot;python_files&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">&quot;args&quot;</span><span class="p">,</span>
        <span class="n">default</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;test_*.py&#39;</span><span class="p">,</span> <span class="s">&#39;*_test.py&#39;</span><span class="p">),</span>
        <span class="n">help</span><span class="o">=</span><span class="s">&quot;glob-style file patterns for Python test module discovery&quot;</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">&quot;python_classes&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">&quot;args&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">(</span><span class="s">&quot;Test&quot;</span><span class="p">,),</span>
        <span class="n">help</span><span class="o">=</span><span class="s">&quot;prefixes for Python test class discovery&quot;</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">&quot;python_functions&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">&quot;args&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">(</span><span class="s">&quot;test&quot;</span><span class="p">,),</span>
        <span class="n">help</span><span class="o">=</span><span class="s">&quot;prefixes for Python test function and method discovery&quot;</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">&quot;markers&quot;</span><span class="p">,</span>
        <span class="s">&quot;parametrize(argnames, argvalues): call a test function multiple &quot;</span>
        <span class="s">&quot;times passing in multiple different argument value sets. Example: &quot;</span>
        <span class="s">&quot;@parametrize(&#39;arg1&#39;, [1,2]) would lead to two calls of the decorated &quot;</span>
        <span class="s">&quot;test function, one with arg1=1 and another with arg1=2.&quot;</span>
        <span class="s">&quot; see http://pytest.org/latest/parametrize.html for more info and &quot;</span>
        <span class="s">&quot;examples.&quot;</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">&quot;markers&quot;</span><span class="p">,</span>
        <span class="s">&quot;usefixtures(fixturename1, fixturename2, ...): mark tests as needing &quot;</span>
        <span class="s">&quot;all of the specified fixtures. see http://pytest.org/latest/fixture.html#usefixtures &quot;</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">&#39;fixture&#39;</span><span class="p">:</span> <span class="n">fixture</span><span class="p">,</span>
        <span class="s">&#39;raises&#39;</span> <span class="p">:</span> <span class="n">raises</span><span class="p">,</span>
        <span class="s">&#39;collect&#39;</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">&#39;Module&#39;</span><span class="p">:</span> <span class="n">Module</span><span class="p">,</span> <span class="s">&#39;Class&#39;</span><span class="p">:</span> <span class="n">Class</span><span class="p">,</span> <span class="s">&#39;Instance&#39;</span><span class="p">:</span> <span class="n">Instance</span><span class="p">,</span>
        <span class="s">&#39;Function&#39;</span><span class="p">:</span> <span class="n">Function</span><span class="p">,</span> <span class="s">&#39;Generator&#39;</span><span class="p">:</span> <span class="n">Generator</span><span class="p">,</span>
        <span class="s">&#39;_fillfuncargs&#39;</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">&quot;&quot;&quot; the pytest config object with access to command line opts.&quot;&quot;&quot;</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">&quot;.py&quot;</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">&#39;python_files&#39;</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, &#39;unittest&#39;):</span>
        <span class="c">#    return # we assume it&#39;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">&quot;Class&quot;</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">&#39;__call__&#39;</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">&amp;</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">&quot;Module&quot;</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">&quot;Class&quot;</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">&quot;Instance&quot;</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">&quot;underlying python object&quot;</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">&quot;&quot;&quot; return python path relative to the containing module. &quot;&quot;&quot;</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">&quot;.py&quot;</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">&quot;.&quot;</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">&quot;.[&quot;</span><span class="p">,</span> <span class="s">&quot;[&quot;</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">&#39;compat_co_firstlineno&#39;</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">&quot;.pyc&quot;</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">&quot;python_functions&quot;</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">&quot;python_classes&quot;</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">&#39;__dict__&#39;</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">&quot;Function&quot;</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">&quot;</span><span class="si">%s</span><span class="s">[</span><span class="si">%s</span><span class="s">]&quot;</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>

<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">&quot;&quot;&quot; Collector for test classes and functions. &quot;&quot;&quot;</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">&#39;_obj&#39;</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">&quot;short&quot;</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">&quot;import file mismatch:</span><span class="se">\n</span><span class="s">&quot;</span>
                <span class="s">&quot;imported module </span><span class="si">%r</span><span class="s"> has this __file__ attribute:</span><span class="se">\n</span><span class="s">&quot;</span>
                <span class="s">&quot;  </span><span class="si">%s</span><span class="se">\n</span><span class="s">&quot;</span>
                <span class="s">&quot;which is not the same as the test file we want to collect:</span><span class="se">\n</span><span class="s">&quot;</span>
                <span class="s">&quot;  </span><span class="si">%s</span><span class="se">\n</span><span class="s">&quot;</span>
                <span class="s">&quot;HINT: remove __pycache__ / .pyc files and/or use a &quot;</span>
                <span class="s">&quot;unique basename for your test file modules&quot;</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 &quot;imported test module&quot;, 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">&quot;setup_module&quot;</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">&#39;teardown_module&#39;</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>

<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">&quot;&quot;&quot; Collector for test methods. &quot;&quot;&quot;</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">&quot;class </span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s"> with __init__ won&#39;t get collected&quot;</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">&quot;Instance&quot;</span><span class="p">)(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;()&quot;</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">&#39;setup_class&#39;</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">&#39;im_func&#39;</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">&#39;__func__&#39;</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">&#39;teardown_class&#39;</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">&#39;im_func&#39;</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">&#39;__func__&#39;</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>

<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">&quot;&quot;&quot; mixin for the code common to Function and Generator.</span>
<span class="sd">    &quot;&quot;&quot;</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">&quot;&quot;&quot; perform setup for this test function. &quot;&quot;&quot;</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">&#39;_preservedparent&#39;</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">&#39;setup_method&#39;</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;setup_function&#39;</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">&quot;&quot;&quot; perform teardown for this test function. &quot;&quot;&quot;</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">&#39;teardown_method&#39;</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;teardown_function&#39;</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">&#39;_obj&#39;</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">&quot;long&quot;</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">&quot;XXX outerr usage is deprecated&quot;</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 &quot;test_*&quot; 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">&quot;</span><span class="si">%r</span><span class="s"> yielded non callable test </span><span class="si">%r</span><span class="s">&quot;</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">&quot;[</span><span class="si">%d</span><span class="s">]&quot;</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">&quot;[&#39;</span><span class="si">%s</span><span class="s">&#39;]&quot;</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">&quot;</span><span class="si">%r</span><span class="s"> generated tests with non-unique name </span><span class="si">%r</span><span class="s">&quot;</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">&#39;__init__&#39;</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">&quot;&quot;&quot; fill missing funcargs for a test function. &quot;&quot;&quot;</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">&quot;_args&quot;</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">&quot;duplicate </span><span class="si">%r</span><span class="s">&quot;</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">&quot;-&quot;</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">&quot;funcargs&quot;</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">&quot;&quot;&quot; helper class so that Metafunc, Function and FixtureRequest</span>
<span class="sd">    don&#39;t need to each define the &quot;funcargnames&quot; compatibility attribute.</span>
<span class="sd">    &quot;&quot;&quot;</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">&quot;&quot;&quot; alias attribute for ``fixturenames`` for pre-2.3 compatibility&quot;&quot;&quot;</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="../../funcargs.html#_pytest.python.Metafunc.parametrize">[ドキュメント]</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;subfunction&quot;</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">&quot;</span><span class="si">%r</span><span class="s"> uses no fixture </span><span class="si">%r</span><span class="s">&quot;</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">&quot;params&quot;</span> <span class="ow">or</span> <span class="s">&quot;funcargs&quot;</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="../../funcargs.html#_pytest.python.Metafunc.addcall">[ドキュメント]</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">&quot;&quot;&quot; (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&#39;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">        &quot;&quot;&quot;</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">&quot;funcarg </span><span class="si">%r</span><span class="s"> not used in this function.&quot;</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">&quot;id=None not allowed&quot;</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">&quot;duplicate id </span><span class="si">%r</span><span class="s">&quot;</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">&quot;-&quot;</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">&quot;::&quot;</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">&quot;/&quot;</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">&quot;verbose&quot;</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">&quot;_pytest.&quot;</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">&quot;-&quot;</span><span class="p">,</span> <span class="s">&quot;fixtures defined from </span><span class="si">%s</span><span class="s">&quot;</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">&lt;=</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">&quot;_&quot;</span><span class="p">:</span>
            <span class="k">continue</span>
        <span class="k">if</span> <span class="n">verbose</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">funcargspec</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> -- </span><span class="si">%s</span><span class="s">&quot;</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">&quot;&quot;</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">&quot;</span><span class="se">\n</span><span class="s">&quot;</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">&quot;    &quot;</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">&quot;    </span><span class="si">%s</span><span class="s">: no docstring available&quot;</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">&quot;</span><span class="si">%s</span><span class="s">:</span><span class="si">%d</span><span class="s">&quot;</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">&quot;&quot;&quot; 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">        &gt;&gt;&gt; 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">        &gt;&gt;&gt; raises(ZeroDivisionError, lambda: 1/0)</span>
<span class="sd">        &lt;ExceptionInfo ...&gt;</span>

<span class="sd">    or you can specify an arbitrary callable with arguments::</span>

<span class="sd">        &gt;&gt;&gt; def f(x): return 1/x</span>
<span class="sd">        ...</span>
<span class="sd">        &gt;&gt;&gt; raises(ZeroDivisionError, f, 0)</span>
<span class="sd">        &lt;ExceptionInfo ...&gt;</span>
<span class="sd">        &gt;&gt;&gt; raises(ZeroDivisionError, f, x=0)</span>
<span class="sd">        &lt;ExceptionInfo ...&gt;</span>

<span class="sd">    A third possibility is to use a string to be executed::</span>

<span class="sd">        &gt;&gt;&gt; raises(ZeroDivisionError, &quot;f(0)&quot;)</span>
<span class="sd">        &lt;ExceptionInfo ...&gt;</span>
<span class="sd">    &quot;&quot;&quot;</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 &quot;raises frame scope: %r&quot; % 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&#39;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">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">=</span><span class="si">%r</span><span class="s">&quot;</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">&#39;, &#39;</span> <span class="o">+</span> <span class="n">k</span>
        <span class="n">expr</span> <span class="o">=</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s">(</span><span class="si">%r%s</span><span class="s">)&#39;</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">&#39;__name__&#39;</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">&quot;DID NOT RAISE&quot;</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">&quot;DID NOT RAISE&quot;</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>
<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">&quot;&quot;&quot; a Function Item is responsible for setting up and executing a</span>
<span class="sd">    Python test function.</span>
<span class="sd">    &quot;&quot;&quot;</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">&quot;callspec&quot;</span><span class="p">),</span> <span class="p">(</span>
                <span class="s">&quot;yielded functions (deprecated) cannot have funcargs&quot;</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">&quot;callspec&quot;</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">&quot;param&quot;</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>
    <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">&quot;underlying python &#39;function&#39; object&quot;</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">&#39;im_func&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_getobj</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
        <span class="n">i</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;[&quot;</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">&quot;(compatonly) for code expecting pytest-2.2 style request objects&quot;</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">&quot;_args&quot;</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>

    <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">&quot;&quot;&quot; execute the underlying test function. &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_pyfunc_call</span><span class="p">(</span><span class="n">pyfuncitem</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="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">&quot;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">&quot;</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">&#39;_genid&#39;</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">&#39;_genid&#39;</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>

<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">&quot;module&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="s">&quot;fspath&quot;</span><span class="p">,</span> <span class="s">&quot;module&quot;</span><span class="p">)</span>
<span class="n">scope2props</span><span class="p">[</span><span class="s">&quot;class&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">&quot;module&quot;</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="s">&quot;cls&quot;</span><span class="p">,)</span>
<span class="n">scope2props</span><span class="p">[</span><span class="s">&quot;instance&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">&quot;class&quot;</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="s">&quot;instance&quot;</span><span class="p">,</span> <span class="p">)</span>
<span class="n">scope2props</span><span class="p">[</span><span class="s">&quot;function&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope2props</span><span class="p">[</span><span class="s">&quot;instance&quot;</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="s">&quot;function&quot;</span><span class="p">,</span> <span class="s">&quot;keywords&quot;</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">&quot;</span><span class="si">%s</span><span class="s"> not available in </span><span class="si">%s</span><span class="s">-scoped context&quot;</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="../../funcargs.html#_pytest.python.FixtureRequest">[ドキュメント]</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">&quot;&quot;&quot; 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">    &quot;&quot;&quot;</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">&#39;_requestparam&#39;</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 &quot;function&quot;, &quot;cls&quot;, &quot;module&quot;, &quot;session&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="s">&quot;function&quot;</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>
    <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">&quot;&quot;&quot; underlying collection node (depends on current request scope)&quot;&quot;&quot;</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>

    <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">&gt;</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="../../funcargs.html#_pytest.python.FixtureRequest.config">[ドキュメント]</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">&quot;&quot;&quot; the pytest config object associated with this request. &quot;&quot;&quot;</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="../../funcargs.html#_pytest.python.FixtureRequest.function">[ドキュメント]</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">&quot;&quot;&quot; test function object if the request has a per-function scope. &quot;&quot;&quot;</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">&quot;class&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="FixtureRequest.cls"><a class="viewcode-back" href="../../funcargs.html#_pytest.python.FixtureRequest.cls">[ドキュメント]</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">&quot;&quot;&quot; class (can be None) where the test function was collected. &quot;&quot;&quot;</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>
    <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">&quot;&quot;&quot; instance (can be None) on which test function was collected. &quot;&quot;&quot;</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>

    <span class="nd">@scopeproperty</span><span class="p">()</span>
<div class="viewcode-block" id="FixtureRequest.module"><a class="viewcode-back" href="../../funcargs.html#_pytest.python.FixtureRequest.module">[ドキュメント]</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">&quot;&quot;&quot; python module object where the test function was collected. &quot;&quot;&quot;</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>
    <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">&quot;&quot;&quot; the file system path of the test module which collected this test. &quot;&quot;&quot;</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>

    <span class="nd">@property</span>
<div class="viewcode-block" id="FixtureRequest.keywords"><a class="viewcode-back" href="../../funcargs.html#_pytest.python.FixtureRequest.keywords">[ドキュメント]</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">&quot;&quot;&quot; keywords/markers dictionary for the underlying node. &quot;&quot;&quot;</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>
    <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">&quot;&quot;&quot; pytest session object. &quot;&quot;&quot;</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 class="viewcode-block" id="FixtureRequest.addfinalizer"><a class="viewcode-back" href="../../funcargs.html#_pytest.python.FixtureRequest.addfinalizer">[ドキュメント]</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">&quot;&quot;&quot;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. &quot;&quot;&quot;</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">&quot;function&quot;</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">&quot;param&quot;</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="../../funcargs.html#_pytest.python.FixtureRequest.applymarker">[ドキュメント]</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">&quot;&quot;&quot; Apply a marker to a single test function invocation.</span>
<span class="sd">        This method is useful if you don&#39;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">        &quot;&quot;&quot;</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>
    <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">&quot;&quot;&quot; raise a FixtureLookupError with the given message. &quot;&quot;&quot;</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>

    <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">&quot;fixturenames&quot;</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="../../funcargs.html#_pytest.python.FixtureRequest.cached_setup">[ドキュメント]</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">&quot;module&quot;</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">&quot;&quot;&quot; (deprecated) Return a testing resource managed by ``setup`` &amp;</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">        &quot;&quot;&quot;</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">&#39;_setupcache&#39;</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">&quot;You tried to access a </span><span class="si">%r</span><span class="s"> scoped &quot;</span>
                    <span class="s">&quot;resource with a </span><span class="si">%r</span><span class="s"> scoped request object&quot;</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="../../funcargs.html#_pytest.python.FixtureRequest.getfuncargvalue">[ドキュメント]</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;request&quot;</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">&#39;fixturename&#39;</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">&#39;param&#39;</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">&quot;You tried to access the </span><span class="si">%r</span><span class="s"> scoped &quot;</span>
                    <span class="s">&quot;funcarg </span><span class="si">%r</span><span class="s"> with a </span><span class="si">%r</span><span class="s"> scoped request object, &quot;</span>
                    <span class="s">&quot;involved factories</span><span class="se">\n</span><span class="si">%s</span><span class="s">&quot;</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">&quot;</span><span class="se">\n</span><span class="s">&quot;</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">&quot;scope&quot;</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">&quot;addfinalizer&quot;</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">&quot;</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">&quot;</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">&quot;function&quot;</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">&quot;session&quot;</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">&quot;class&quot;</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">&quot;module&quot;</span>
        <span class="k">if</span> <span class="n">scope</span> <span class="o">==</span> <span class="s">&quot;module&quot;</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">&quot;unknown finalization scope </span><span class="si">%r</span><span class="s">&quot;</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">&quot;&lt;FixtureRequest for </span><span class="si">%r</span><span class="s">&gt;&quot;</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">&quot;&quot;&quot; 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">    &quot;&quot;&quot;</span>

<span class="n">scopes</span> <span class="o">=</span> <span class="s">&quot;session module class function subfunction&quot;</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">&quot;subfunction&quot;</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">&gt;</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">&quot;&quot;&quot; could not return a requested Fixture (missing or invalid). &quot;&quot;&quot;</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&#39;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">&quot;file </span><span class="si">%s</span><span class="s">, line </span><span class="si">%s</span><span class="s">&quot;</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">&quot;  &quot;</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">&#39;def&#39;</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">&quot;fixture </span><span class="si">%r</span><span class="s"> not found&quot;</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">&quot;</span><span class="se">\n</span><span class="s"> available fixtures: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span><span class="p">(</span><span class="s">&quot;, &quot;</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">&quot;</span><span class="se">\n</span><span class="s"> use &#39;py.test --fixtures [testpath]&#39; for help on them.&quot;</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(&quot;FixtureLookupError: %s&quot; %(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">&quot;</span><span class="se">\n</span><span class="s">&quot;</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">&quot;        &quot;</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">&quot;</span><span class="si">%s</span><span class="s">:</span><span class="si">%d</span><span class="s">&quot;</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">&quot;&quot;&quot;</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">    &quot;&quot;&quot;</span>

    <span class="n">_argprefix</span> <span class="o">=</span> <span class="s">&quot;pytest_funcarg__&quot;</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">&quot;&quot;</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">&quot;usefixtures&quot;</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">&quot;funcmanage&quot;</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">&quot;nofuncargs&quot;</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">&quot;usefixtures&quot;</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&#39;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 &quot;plugin_registered&quot;, plugin</span>
        <span class="n">nodeid</span> <span class="o">=</span> <span class="s">&quot;&quot;</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">&quot;conftest.py&quot;</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">&quot;/&quot;</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">&quot;/&quot;</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">&quot;&quot;&quot; return a tuple of fixture names to be used. &quot;&quot;&quot;</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">&quot;:/&quot;</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 &quot;@pytest.fixture&quot; 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">&quot;&quot;&quot; A container for a factory definition. &quot;&quot;&quot;</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">&quot;function&quot;</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 &quot;finished&quot;, 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 &quot;self&quot; 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">&quot;cached_result&quot;</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">&quot;&lt;FixtureDef name=</span><span class="si">%r</span><span class="s"> scope=</span><span class="si">%r</span><span class="s">&gt;&quot;</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&#39;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">&quot;__wrapped__&quot;</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">&quot;patchings&quot;</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">&#39;func_defaults&#39;</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">&#39;__defaults__&#39;</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">&gt;=</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">&quot;&quot;&quot; return list of (arg,param) tuple, sorted by broader scope first. &quot;&quot;&quot;</span>
    <span class="k">assert</span> <span class="n">scopenum</span> <span class="o">&lt;</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">&quot;&quot;&quot; return fixturemarker or None if it doesn&#39;t exist or raised</span>
<span class="sd">    exceptions.&quot;&quot;&quot;</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">&quot;_pytestfixturefunction&quot;</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&#39;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>ナビゲーション</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../../py-modindex.html" title="Pythonモジュール索引"
             >モジュール</a></li>
        <li><a href="../../contents.html">pytest-2.2.4.0</a> &raquo;</li>
          <li><a href="../index.html" >モジュールコード</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2011, holger krekel et alii.
      このドキュメントは <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3 で生成しました。
    </div>
  </body>
</html>