Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-release > by-pkgid > f1af5ac4c8d0f3f6ef0bca84cf516f3e > files > 659

python3-sqlobject-3.7.0-1.mga7.noarch.rpm



<!doctype html>

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>_pytest.python &#8212; SQLObject 3.7.0 documentation</title>
    <link rel="stylesheet" href="../../_static/bizstyle.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
    <script type="text/javascript" src="../../_static/documentation_options.js"></script>
    <script type="text/javascript" src="../../_static/jquery.js"></script>
    <script type="text/javascript" src="../../_static/underscore.js"></script>
    <script type="text/javascript" src="../../_static/doctools.js"></script>
    <script type="text/javascript" src="../../_static/bizstyle.js"></script>
    <link rel="index" title="Index" href="../../genindex.html" />
    <link rel="search" title="Search" href="../../search.html" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <!--[if lt IE 9]>
    <script type="text/javascript" src="_static/css3-mediaqueries.js"></script>
    <![endif]-->
  </head><body>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="../../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="nav-item nav-item-0"><a href="../../index.html">SQLObject 3.7.0 documentation</a> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li> 
      </ul>
    </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none" role="search">
  <h3>Quick search</h3>
    <div class="searchformwrapper">
    <form class="search" action="../../search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <h1>Source code for _pytest.python</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot; Python test discovery, setup and run of test functions. &quot;&quot;&quot;</span>

<span class="kn">import</span> <span class="nn">fnmatch</span>
<span class="kn">import</span> <span class="nn">inspect</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">collections</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">from</span> <span class="nn">itertools</span> <span class="k">import</span> <span class="n">count</span>

<span class="kn">import</span> <span class="nn">py</span>
<span class="kn">import</span> <span class="nn">pytest</span>
<span class="kn">from</span> <span class="nn">_pytest.mark</span> <span class="k">import</span> <span class="n">MarkerError</span>


<span class="kn">import</span> <span class="nn">_pytest</span>
<span class="kn">import</span> <span class="nn">_pytest._pluggy</span> <span class="k">as</span> <span class="nn">pluggy</span>
<span class="kn">from</span> <span class="nn">_pytest</span> <span class="k">import</span> <span class="n">fixtures</span>
<span class="kn">from</span> <span class="nn">_pytest.compat</span> <span class="k">import</span> <span class="p">(</span>
    <span class="n">isclass</span><span class="p">,</span> <span class="n">isfunction</span><span class="p">,</span> <span class="n">is_generator</span><span class="p">,</span> <span class="n">_escape_strings</span><span class="p">,</span>
    <span class="n">REGEX_TYPE</span><span class="p">,</span> <span class="n">STRING_TYPES</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">,</span> <span class="n">NOTSET</span><span class="p">,</span>
    <span class="n">get_real_func</span><span class="p">,</span> <span class="n">getfslineno</span><span class="p">,</span> <span class="n">safe_getattr</span><span class="p">,</span>
    <span class="n">getlocation</span><span class="p">,</span> <span class="n">enum</span><span class="p">,</span>
<span class="p">)</span>

<span class="n">cutdir1</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">pluggy</span><span class="o">.</span><span class="vm">__file__</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;oc&quot;</span><span class="p">))</span>
<span class="n">cutdir2</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">_pytest</span><span class="o">.</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">dirpath</span><span class="p">()</span>
<span class="n">cutdir3</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">py</span><span class="o">.</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">dirpath</span><span class="p">()</span>


<span class="k">def</span> <span class="nf">filter_traceback</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Return True if a TracebackEntry instance should be removed from tracebacks:</span>
<span class="sd">    * dynamically generated code (no code to show up for it);</span>
<span class="sd">    * internal traceback from pytest or its internal libraries, py and pluggy.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="c1"># entry.path might sometimes return a str object when the entry</span>
    <span class="c1"># points to dynamically generated code</span>
    <span class="c1"># see https://bitbucket.org/pytest-dev/py/issues/71</span>
    <span class="n">raw_filename</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">frame</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">raw</span><span class="o">.</span><span class="n">co_filename</span>
    <span class="n">is_generated</span> <span class="o">=</span> <span class="s1">&#39;&lt;&#39;</span> <span class="ow">in</span> <span class="n">raw_filename</span> <span class="ow">and</span> <span class="s1">&#39;&gt;&#39;</span> <span class="ow">in</span> <span class="n">raw_filename</span>
    <span class="k">if</span> <span class="n">is_generated</span><span class="p">:</span>
        <span class="k">return</span> <span class="kc">False</span>
    <span class="c1"># entry.path might point to an inexisting file, in which case it will</span>
    <span class="c1"># alsso return a str object. see #1133</span>
    <span class="n">p</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">p</span> <span class="o">!=</span> <span class="n">cutdir1</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">p</span><span class="o">.</span><span class="n">relto</span><span class="p">(</span><span class="n">cutdir2</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">p</span><span class="o">.</span><span class="n">relto</span><span class="p">(</span><span class="n">cutdir3</span><span class="p">)</span>



<span class="k">def</span> <span class="nf">pyobj_property</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">pytest</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
        <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">node</span><span class="o">.</span><span class="n">obj</span>
    <span class="n">doc</span> <span class="o">=</span> <span class="s2">&quot;python </span><span class="si">%s</span><span class="s2"> 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="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">doc</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">pytest_addoption</span><span class="p">(</span><span class="n">parser</span><span class="p">):</span>
    <span class="n">group</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">getgroup</span><span class="p">(</span><span class="s2">&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="s1">&#39;--fixtures&#39;</span><span class="p">,</span> <span class="s1">&#39;--funcargs&#39;</span><span class="p">,</span>
               <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;showfixtures&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
               <span class="n">help</span><span class="o">=</span><span class="s2">&quot;show available fixtures, sorted by plugin appearance&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="s1">&#39;--fixtures-per-test&#39;</span><span class="p">,</span>
        <span class="n">action</span><span class="o">=</span><span class="s2">&quot;store_true&quot;</span><span class="p">,</span>
        <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;show_fixtures_per_test&quot;</span><span class="p">,</span>
        <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;show fixtures per test&quot;</span><span class="p">,</span>
    <span class="p">)</span>
    <span class="n">parser</span><span class="o">.</span><span class="n">addini</span><span class="p">(</span><span class="s2">&quot;usefixtures&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">&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="s2">&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="s2">&quot;python_files&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;args&quot;</span><span class="p">,</span>
        <span class="n">default</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;test_*.py&#39;</span><span class="p">,</span> <span class="s1">&#39;*_test.py&#39;</span><span class="p">],</span>
        <span class="n">help</span><span class="o">=</span><span class="s2">&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="s2">&quot;python_classes&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;args&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;Test&quot;</span><span class="p">,],</span>
        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;prefixes or glob names 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="s2">&quot;python_functions&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;args&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;test&quot;</span><span class="p">,],</span>
        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;prefixes or glob names for Python test function and &quot;</span>
             <span class="s2">&quot;method discovery&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="s2">&quot;--import-mode&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;prepend&quot;</span><span class="p">,</span>
        <span class="n">choices</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;prepend&quot;</span><span class="p">,</span> <span class="s2">&quot;append&quot;</span><span class="p">],</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;importmode&quot;</span><span class="p">,</span>
        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;prepend/append to sys.path when importing test modules, &quot;</span>
             <span class="s2">&quot;default is to prepend.&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">if</span> <span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">show_fixtures_per_test</span><span class="p">:</span>
        <span class="n">show_fixtures_per_test</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
        <span class="k">return</span> <span class="mi">0</span>


<span class="k">def</span> <span class="nf">pytest_generate_tests</span><span class="p">(</span><span class="n">metafunc</span><span class="p">):</span>
    <span class="c1"># those alternative spellings are common - raise a specific error to alert</span>
    <span class="c1"># the user</span>
    <span class="n">alt_spellings</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;parameterize&#39;</span><span class="p">,</span> <span class="s1">&#39;parametrise&#39;</span><span class="p">,</span> <span class="s1">&#39;parameterise&#39;</span><span class="p">]</span>
    <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">alt_spellings</span><span class="p">:</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">metafunc</span><span class="o">.</span><span class="n">function</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
            <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> has &#39;</span><span class="si">{1}</span><span class="s2">&#39;, spelling should be &#39;parametrize&#39;&quot;</span>
            <span class="k">raise</span> <span class="n">MarkerError</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">metafunc</span><span class="o">.</span><span class="n">function</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">markers</span> <span class="o">=</span> <span class="n">metafunc</span><span class="o">.</span><span class="n">function</span><span class="o">.</span><span class="n">parametrize</span>
    <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
        <span class="k">return</span>
    <span class="k">for</span> <span class="n">marker</span> <span class="ow">in</span> <span class="n">markers</span><span class="p">:</span>
        <span class="n">metafunc</span><span class="o">.</span><span class="n">parametrize</span><span class="p">(</span><span class="o">*</span><span class="n">marker</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">marker</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">pytest_configure</span><span class="p">(</span><span class="n">config</span><span class="p">):</span>
    <span class="n">config</span><span class="o">.</span><span class="n">addinivalue_line</span><span class="p">(</span><span class="s2">&quot;markers&quot;</span><span class="p">,</span>
        <span class="s2">&quot;parametrize(argnames, argvalues): call a test function multiple &quot;</span>
        <span class="s2">&quot;times passing in different arguments in turn. argvalues generally &quot;</span>
        <span class="s2">&quot;needs to be a list of values if argnames specifies only one name &quot;</span>
        <span class="s2">&quot;or a list of tuples of values if argnames specifies multiple names. &quot;</span>
        <span class="s2">&quot;Example: @parametrize(&#39;arg1&#39;, [1,2]) would lead to two calls of the &quot;</span>
        <span class="s2">&quot;decorated test function, one with arg1=1 and another with arg1=2.&quot;</span>
        <span class="s2">&quot;see http://pytest.org/latest/parametrize.html for more info and &quot;</span>
        <span class="s2">&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="s2">&quot;markers&quot;</span><span class="p">,</span>
        <span class="s2">&quot;usefixtures(fixturename1, fixturename2, ...): mark tests as needing &quot;</span>
        <span class="s2">&quot;all of the specified fixtures. see http://pytest.org/latest/fixture.html#usefixtures &quot;</span>
    <span class="p">)</span>

<span class="nd">@pytest</span><span class="o">.</span><span class="n">hookimpl</span><span class="p">(</span><span class="n">trylast</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">pytest_namespace</span><span class="p">():</span>
    <span class="n">raises</span><span class="o">.</span><span class="n">Exception</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="o">.</span><span class="n">Exception</span>
    <span class="k">return</span> <span class="p">{</span>
        <span class="s1">&#39;raises&#39;</span><span class="p">:</span> <span class="n">raises</span><span class="p">,</span>
        <span class="s1">&#39;approx&#39;</span><span class="p">:</span> <span class="n">approx</span><span class="p">,</span>
        <span class="s1">&#39;collect&#39;</span><span class="p">:</span> <span class="p">{</span>
            <span class="s1">&#39;Module&#39;</span><span class="p">:</span> <span class="n">Module</span><span class="p">,</span>
            <span class="s1">&#39;Class&#39;</span><span class="p">:</span> <span class="n">Class</span><span class="p">,</span>
            <span class="s1">&#39;Instance&#39;</span><span class="p">:</span> <span class="n">Instance</span><span class="p">,</span>
            <span class="s1">&#39;Function&#39;</span><span class="p">:</span> <span class="n">Function</span><span class="p">,</span>
            <span class="s1">&#39;Generator&#39;</span><span class="p">:</span> <span class="n">Generator</span><span class="p">,</span>
        <span class="p">}</span>
    <span class="p">}</span>


<span class="nd">@pytest</span><span class="o">.</span><span class="n">hookimpl</span><span class="p">(</span><span class="n">trylast</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">pytest_pyfunc_call</span><span class="p">(</span><span class="n">pyfuncitem</span><span class="p">):</span>
    <span class="n">testfunction</span> <span class="o">=</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">obj</span>
    <span class="k">if</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">_isyieldedfunction</span><span class="p">():</span>
        <span class="n">testfunction</span><span class="p">(</span><span class="o">*</span><span class="n">pyfuncitem</span><span class="o">.</span><span class="n">_args</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">funcargs</span> <span class="o">=</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">funcargs</span>
        <span class="n">testargs</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">pyfuncitem</span><span class="o">.</span><span class="n">_fixtureinfo</span><span class="o">.</span><span class="n">argnames</span><span class="p">:</span>
            <span class="n">testargs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">funcargs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span>
        <span class="n">testfunction</span><span class="p">(</span><span class="o">**</span><span class="n">testargs</span><span class="p">)</span>
    <span class="k">return</span> <span class="kc">True</span>

<span class="k">def</span> <span class="nf">pytest_collect_file</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
    <span class="n">ext</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">ext</span>
    <span class="k">if</span> <span class="n">ext</span> <span class="o">==</span> <span class="s2">&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="s1">&#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="nd">@pytest</span><span class="o">.</span><span class="n">hookimpl</span><span class="p">(</span><span class="n">hookwrapper</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">pytest_pycollect_makeitem</span><span class="p">(</span><span class="n">collector</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
    <span class="n">outcome</span> <span class="o">=</span> <span class="k">yield</span>
    <span class="n">res</span> <span class="o">=</span> <span class="n">outcome</span><span class="o">.</span><span class="n">get_result</span><span class="p">()</span>
    <span class="k">if</span> <span class="n">res</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
        <span class="k">return</span>
    <span class="c1"># nothing was collected elsewhere, let&#39;s do it here</span>
    <span class="k">if</span> <span class="n">isclass</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">collector</span><span class="o">.</span><span class="n">istestclass</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
            <span class="n">Class</span> <span class="o">=</span> <span class="n">collector</span><span class="o">.</span><span class="n">_getcustomclass</span><span class="p">(</span><span class="s2">&quot;Class&quot;</span><span class="p">)</span>
            <span class="n">outcome</span><span class="o">.</span><span class="n">force_result</span><span class="p">(</span><span class="n">Class</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">collector</span><span class="p">))</span>
    <span class="k">elif</span> <span class="n">collector</span><span class="o">.</span><span class="n">istestfunction</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="c1"># mock seems to store unbound methods (issue473), normalize it</span>
        <span class="n">obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;__func__&quot;</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
        <span class="c1"># We need to try and unwrap the function if it&#39;s a functools.partial</span>
        <span class="c1"># or a funtools.wrapped.</span>
        <span class="c1"># We musn&#39;t if it&#39;s been wrapped with mock.patch (python 2 only)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">isfunction</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">or</span> <span class="n">isfunction</span><span class="p">(</span><span class="n">get_real_func</span><span class="p">(</span><span class="n">obj</span><span class="p">))):</span>
            <span class="n">collector</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">code</span><span class="o">=</span><span class="s2">&quot;C2&quot;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span>
                <span class="s2">&quot;cannot collect </span><span class="si">%r</span><span class="s2"> because it is not a function.&quot;</span>
                <span class="o">%</span> <span class="n">name</span><span class="p">,</span> <span class="p">)</span>
        <span class="k">elif</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;__test__&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">is_generator</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
                <span class="n">res</span> <span class="o">=</span> <span class="n">Generator</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">collector</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">res</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">collector</span><span class="o">.</span><span class="n">_genfunctions</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span>
            <span class="n">outcome</span><span class="o">.</span><span class="n">force_result</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">pytest_make_parametrize_id</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
    <span class="k">return</span> <span class="kc">None</span>



<span class="k">class</span> <span class="nc">PyobjContext</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="n">module</span> <span class="o">=</span> <span class="n">pyobj_property</span><span class="p">(</span><span class="s2">&quot;Module&quot;</span><span class="p">)</span>
    <span class="bp">cls</span> <span class="o">=</span> <span class="n">pyobj_property</span><span class="p">(</span><span class="s2">&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="s2">&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="n">obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_obj&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">_obj</span> <span class="o">=</span> <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getobj</span><span class="p">()</span>
            <span class="k">return</span> <span class="n">obj</span>

        <span class="k">def</span> <span class="nf">fset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_obj</span> <span class="o">=</span> <span class="n">value</span>

        <span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">fget</span><span class="p">,</span> <span class="n">fset</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&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="kc">True</span><span class="p">,</span> <span class="n">includemodule</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
        <span class="sd">&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="s2">&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="s2">&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="s2">&quot;.[&quot;</span><span class="p">,</span> <span class="s2">&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="c1"># XXX caching?</span>
        <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span>
        <span class="n">compat_co_firstlineno</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#39;compat_co_firstlineno&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">compat_co_firstlineno</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
            <span class="c1"># nose compatibility</span>
            <span class="n">fspath</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="n">obj</span><span class="o">.</span><span class="vm">__module__</span><span class="p">]</span><span class="o">.</span><span class="vm">__file__</span>
            <span class="k">if</span> <span class="n">fspath</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&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">compat_co_firstlineno</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">fspath</span><span class="p">,</span> <span class="n">lineno</span> <span class="o">=</span> <span class="n">getfslineno</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
        <span class="n">modpath</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getmodpath</span><span class="p">()</span>
        <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">fspath</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">modpath</span>

<span class="k">class</span> <span class="nc">PyCollector</span><span class="p">(</span><span class="n">PyobjMixin</span><span class="p">,</span> <span class="n">pytest</span><span class="o">.</span><span class="n">Collector</span><span class="p">):</span>

    <span class="k">def</span> <span class="nf">funcnamefilter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_matches_prefix_or_glob_option</span><span class="p">(</span><span class="s1">&#39;python_functions&#39;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">isnosetest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Look for the __test__ attribute, which is applied by the</span>
<span class="sd">        @nose.tools.istest decorator</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="c1"># We explicitly check for &quot;is True&quot; here to not mistakenly treat</span>
        <span class="c1"># classes with a custom __getattr__ returning something truthy (like a</span>
        <span class="c1"># function) as test classes.</span>
        <span class="k">return</span> <span class="n">safe_getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#39;__test__&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span>

    <span class="k">def</span> <span class="nf">classnamefilter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_matches_prefix_or_glob_option</span><span class="p">(</span><span class="s1">&#39;python_classes&#39;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">istestfunction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">return</span> <span class="p">(</span>
            <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">funcnamefilter</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">isnosetest</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span> <span class="ow">and</span>
            <span class="n">safe_getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;__call__&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">getfixturemarker</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
        <span class="p">)</span>

    <span class="k">def</span> <span class="nf">istestclass</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">classnamefilter</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">isnosetest</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_matches_prefix_or_glob_option</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">option_name</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        checks if the given name matches the prefix or glob-pattern defined</span>
<span class="sd">        in ini configuration.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getini</span><span class="p">(</span><span class="n">option_name</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">option</span><span class="p">):</span>
                <span class="k">return</span> <span class="kc">True</span>
            <span class="c1"># check that name looks like a glob-string before calling fnmatch</span>
            <span class="c1"># because this is called for every name in each collected module,</span>
            <span class="c1"># and fnmatch is somewhat expensive to call</span>
            <span class="k">elif</span> <span class="p">(</span><span class="s1">&#39;*&#39;</span> <span class="ow">in</span> <span class="n">option</span> <span class="ow">or</span> <span class="s1">&#39;?&#39;</span> <span class="ow">in</span> <span class="n">option</span> <span class="ow">or</span> <span class="s1">&#39;[&#39;</span> <span class="ow">in</span> <span class="n">option</span><span class="p">)</span> <span class="ow">and</span> \
                    <span class="n">fnmatch</span><span class="o">.</span><span class="n">fnmatch</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">option</span><span class="p">):</span>
                <span class="k">return</span> <span class="kc">True</span>
        <span class="k">return</span> <span class="kc">False</span>

    <span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;__test__&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span>
            <span class="k">return</span> <span class="p">[]</span>

        <span class="c1"># NB. we avoid random getattrs and peek in the __dict__ instead</span>
        <span class="c1"># (XXX originally introduced from a PyPy need, still true?)</span>
        <span class="n">dicts</span> <span class="o">=</span> <span class="p">[</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#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="vm">__class__</span><span class="p">):</span>
            <span class="n">dicts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">basecls</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
        <span class="n">seen</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="n">l</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">dic</span> <span class="ow">in</span> <span class="n">dicts</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">dic</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
                <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">seen</span><span class="p">:</span>
                    <span class="k">continue</span>
                <span class="n">seen</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
                <span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">makeitem</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">res</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
                    <span class="k">continue</span>
                <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
                    <span class="n">res</span> <span class="o">=</span> <span class="p">[</span><span class="n">res</span><span class="p">]</span>
                <span class="n">l</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
        <span class="n">l</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">item</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">reportinfo</span><span class="p">()[:</span><span class="mi">2</span><span class="p">])</span>
        <span class="k">return</span> <span class="n">l</span>

    <span class="k">def</span> <span class="nf">makeitem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
        <span class="c1">#assert self.ihook.fspath == self.fspath, self</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_pycollect_makeitem</span><span class="p">(</span>
            <span class="n">collector</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="n">obj</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_genfunctions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">funcobj</span><span class="p">):</span>
        <span class="n">module</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="n">Module</span><span class="p">)</span><span class="o">.</span><span class="n">obj</span>
        <span class="n">clscol</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getparent</span><span class="p">(</span><span class="n">Class</span><span class="p">)</span>
        <span class="bp">cls</span> <span class="o">=</span> <span class="n">clscol</span> <span class="ow">and</span> <span class="n">clscol</span><span class="o">.</span><span class="n">obj</span> <span class="ow">or</span> <span class="kc">None</span>
        <span class="n">transfer_markers</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">module</span><span class="p">)</span>
        <span class="n">fm</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span>
        <span class="n">fixtureinfo</span> <span class="o">=</span> <span class="n">fm</span><span class="o">.</span><span class="n">getfixtureinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcobj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span>
        <span class="n">metafunc</span> <span class="o">=</span> <span class="n">Metafunc</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="n">fixtureinfo</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">,</span>
                            <span class="bp">cls</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">module</span><span class="p">)</span>
        <span class="n">methods</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="s2">&quot;pytest_generate_tests&quot;</span><span class="p">):</span>
            <span class="n">methods</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">module</span><span class="o">.</span><span class="n">pytest_generate_tests</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="s2">&quot;pytest_generate_tests&quot;</span><span class="p">):</span>
            <span class="n">methods</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">cls</span><span class="p">()</span><span class="o">.</span><span class="n">pytest_generate_tests</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">methods</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_generate_tests</span><span class="o">.</span><span class="n">call_extra</span><span class="p">(</span><span class="n">methods</span><span class="p">,</span>
                                                        <span class="nb">dict</span><span class="p">(</span><span class="n">metafunc</span><span class="o">=</span><span class="n">metafunc</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_generate_tests</span><span class="p">(</span><span class="n">metafunc</span><span class="o">=</span><span class="n">metafunc</span><span class="p">)</span>

        <span class="n">Function</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getcustomclass</span><span class="p">(</span><span class="s2">&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="n">fixtureinfo</span><span class="o">=</span><span class="n">fixtureinfo</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="c1"># add funcargs() as fixturedefs to fixtureinfo.arg2fixturedefs</span>
            <span class="n">fixtures</span><span class="o">.</span><span class="n">add_funcarg_pseudo_fixture_def</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metafunc</span><span class="p">,</span> <span class="n">fm</span><span class="p">)</span>

            <span class="k">for</span> <span class="n">callspec</span> <span class="ow">in</span> <span class="n">metafunc</span><span class="o">.</span><span class="n">_calls</span><span class="p">:</span>
                <span class="n">subname</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">[</span><span class="si">%s</span><span class="s2">]&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">fixtureinfo</span><span class="o">=</span><span class="n">fixtureinfo</span><span class="p">,</span>
                               <span class="n">keywords</span><span class="o">=</span><span class="p">{</span><span class="n">callspec</span><span class="o">.</span><span class="n">id</span><span class="p">:</span><span class="kc">True</span><span class="p">},</span>
                               <span class="n">originalname</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
                               <span class="p">)</span>


<span class="k">def</span> <span class="nf">_marked</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">mark</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Returns True if :func: is already marked with :mark:, False otherwise.</span>
<span class="sd">    This can happen if marker is applied to class and the test file is</span>
<span class="sd">    invoked more than once.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">func_mark</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">mark</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
    <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
        <span class="k">return</span> <span class="kc">False</span>
    <span class="k">return</span> <span class="n">mark</span><span class="o">.</span><span class="n">args</span> <span class="o">==</span> <span class="n">func_mark</span><span class="o">.</span><span class="n">args</span> <span class="ow">and</span> <span class="n">mark</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">==</span> <span class="n">func_mark</span><span class="o">.</span><span class="n">kwargs</span>


<span class="k">def</span> <span class="nf">transfer_markers</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
    <span class="c1"># XXX this should rather be code in the mark plugin or the mark</span>
    <span class="c1"># plugin should merge with the python plugin.</span>
    <span class="k">for</span> <span class="n">holder</span> <span class="ow">in</span> <span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">pytestmark</span> <span class="o">=</span> <span class="n">holder</span><span class="o">.</span><span class="n">pytestmark</span>
        <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
            <span class="k">continue</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pytestmark</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
            <span class="k">for</span> <span class="n">mark</span> <span class="ow">in</span> <span class="n">pytestmark</span><span class="p">:</span>
                <span class="k">if</span> <span class="ow">not</span> <span class="n">_marked</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="n">mark</span><span class="p">):</span>
                    <span class="n">mark</span><span class="p">(</span><span class="n">funcobj</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">_marked</span><span class="p">(</span><span class="n">funcobj</span><span class="p">,</span> <span class="n">pytestmark</span><span class="p">):</span>
                <span class="n">pytestmark</span><span class="p">(</span><span class="n">funcobj</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Module</span><span class="p">(</span><span class="n">pytest</span><span class="o">.</span><span class="n">File</span><span class="p">,</span> <span class="n">PyCollector</span><span class="p">):</span>
    <span class="sd">&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="s1">&#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="c1"># we assume we are only called once per module</span>
        <span class="n">importmode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getoption</span><span class="p">(</span><span class="s2">&quot;--import-mode&quot;</span><span class="p">)</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">mod</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="o">.</span><span class="n">pyimport</span><span class="p">(</span><span class="n">ensuresyspath</span><span class="o">=</span><span class="n">importmode</span><span class="p">)</span>
        <span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span>
            <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">(</span>
                <span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span><span class="o">.</span><span class="n">getrepr</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="s2">&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="s2">&quot;import file mismatch:</span><span class="se">\n</span><span class="s2">&quot;</span>
                <span class="s2">&quot;imported module </span><span class="si">%r</span><span class="s2"> has this __file__ attribute:</span><span class="se">\n</span><span class="s2">&quot;</span>
                <span class="s2">&quot;  </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span>
                <span class="s2">&quot;which is not the same as the test file we want to collect:</span><span class="se">\n</span><span class="s2">&quot;</span>
                <span class="s2">&quot;  </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span>
                <span class="s2">&quot;HINT: remove __pycache__ / .pyc files and/or use a &quot;</span>
                <span class="s2">&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="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
            <span class="kn">from</span> <span class="nn">_pytest._code.code</span> <span class="k">import</span> <span class="n">ExceptionInfo</span>
            <span class="n">exc_info</span> <span class="o">=</span> <span class="n">ExceptionInfo</span><span class="p">()</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getoption</span><span class="p">(</span><span class="s1">&#39;verbose&#39;</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
                <span class="n">exc_info</span><span class="o">.</span><span class="n">traceback</span> <span class="o">=</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">traceback</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">filter_traceback</span><span class="p">)</span>
            <span class="n">exc_repr</span> <span class="o">=</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">getrepr</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="s1">&#39;short&#39;</span><span class="p">)</span> <span class="k">if</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">traceback</span> <span class="k">else</span> <span class="n">exc_info</span><span class="o">.</span><span class="n">exconly</span><span class="p">()</span>
            <span class="n">formatted_tb</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">_builtin</span><span class="o">.</span><span class="n">_totext</span><span class="p">(</span><span class="n">exc_repr</span><span class="p">)</span>
            <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">(</span>
                <span class="s2">&quot;ImportError while importing test module &#39;</span><span class="si">{fspath}</span><span class="s2">&#39;.</span><span class="se">\n</span><span class="s2">&quot;</span>
                <span class="s2">&quot;Hint: make sure your test modules/packages have valid Python names.</span><span class="se">\n</span><span class="s2">&quot;</span>
                <span class="s2">&quot;Traceback:</span><span class="se">\n</span><span class="s2">&quot;</span>
                <span class="s2">&quot;</span><span class="si">{traceback}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">fspath</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="p">,</span> <span class="n">traceback</span><span class="o">=</span><span class="n">formatted_tb</span><span class="p">)</span>
            <span class="p">)</span>
        <span class="k">except</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">runner</span><span class="o">.</span><span class="n">Skipped</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">allow_module_level</span><span class="p">:</span>
                <span class="k">raise</span>
            <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">(</span>
                <span class="s2">&quot;Using pytest.skip outside of a test is not allowed. If you are &quot;</span>
                <span class="s2">&quot;trying to decorate a test function, use the @pytest.mark.skip &quot;</span>
                <span class="s2">&quot;or @pytest.mark.skipif decorators instead.&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">pluginmanager</span><span class="o">.</span><span class="n">consider_module</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">mod</span>

    <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">setup_module</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;setUpModule&quot;</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">setup_module</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">setup_module</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&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="kc">None</span><span class="p">:</span>
            <span class="n">setup_module</span><span class="p">()</span>

        <span class="n">teardown_module</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#39;tearDownModule&#39;</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">teardown_module</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">teardown_module</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#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="kc">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">addfinalizer</span><span class="p">(</span><span class="n">teardown_module</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">_get_xunit_setup_teardown</span><span class="p">(</span><span class="n">holder</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">,</span> <span class="n">param_obj</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Return a callable to perform xunit-style setup or teardown if</span>
<span class="sd">    the function exists in the ``holder`` object.</span>
<span class="sd">    The ``param_obj`` parameter is the parameter which will be passed to the function</span>
<span class="sd">    when the callable is called without arguments, defaults to the ``holder`` object.</span>
<span class="sd">    Return ``None`` if a suitable callable is not found.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">param_obj</span> <span class="o">=</span> <span class="n">param_obj</span> <span class="k">if</span> <span class="n">param_obj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">holder</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">_get_xunit_func</span><span class="p">(</span><span class="n">holder</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
        <span class="n">arg_count</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="vm">__code__</span><span class="o">.</span><span class="n">co_argcount</span>
        <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">ismethod</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
            <span class="n">arg_count</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="n">arg_count</span><span class="p">:</span>
            <span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">result</span><span class="p">(</span><span class="n">param_obj</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">result</span>


<span class="k">def</span> <span class="nf">_get_xunit_func</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Return the attribute from the given object to be used as a setup/teardown</span>
<span class="sd">    xunit-style function, but only if not marked as a fixture to</span>
<span class="sd">    avoid calling it twice.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">meth</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">getfixturemarker</span><span class="p">(</span><span class="n">meth</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">meth</span>


<span class="k">class</span> <span class="nc">Class</span><span class="p">(</span><span class="n">PyCollector</span><span class="p">):</span>
    <span class="sd">&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="bp">self</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;C1&quot;</span><span class="p">,</span> <span class="s2">&quot;cannot collect test class </span><span class="si">%r</span><span class="s2"> because it has a &quot;</span>
                <span class="s2">&quot;__init__ constructor&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
            <span class="k">return</span> <span class="p">[]</span>
        <span class="k">elif</span> <span class="n">hasnew</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">):</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;C1&quot;</span><span class="p">,</span> <span class="s2">&quot;cannot collect test class </span><span class="si">%r</span><span class="s2"> because it has a &quot;</span>
                            <span class="s2">&quot;__new__ constructor&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
            <span class="k">return</span> <span class="p">[]</span>
        <span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_getcustomclass</span><span class="p">(</span><span class="s2">&quot;Instance&quot;</span><span class="p">)(</span><span class="n">name</span><span class="o">=</span><span class="s2">&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">_get_xunit_func</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#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="kc">None</span><span class="p">:</span>
            <span class="n">setup_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">setup_class</span><span class="p">,</span> <span class="s1">&#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="s1">&#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="n">fin_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#39;teardown_class&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">fin_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">fin_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">fin_class</span><span class="p">,</span> <span class="s1">&#39;im_func&#39;</span><span class="p">,</span> <span class="n">fin_class</span><span class="p">)</span>
            <span class="n">fin_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">fin_class</span><span class="p">,</span> <span class="s1">&#39;__func__&#39;</span><span class="p">,</span> <span class="n">fin_class</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">addfinalizer</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">fin_class</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">))</span>

<span class="k">class</span> <span class="nc">Instance</span><span class="p">(</span><span class="n">PyCollector</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">_getobj</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">obj</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">parsefactories</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">Instance</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">newinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getobj</span><span class="p">()</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span>

<span class="k">class</span> <span class="nc">FunctionMixin</span><span class="p">(</span><span class="n">PyobjMixin</span><span class="p">):</span>
    <span class="sd">&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="s1">&#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">setup_name</span> <span class="o">=</span> <span class="s1">&#39;setup_method&#39;</span>
            <span class="n">teardown_name</span> <span class="o">=</span> <span class="s1">&#39;teardown_method&#39;</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">setup_name</span> <span class="o">=</span> <span class="s1">&#39;setup_function&#39;</span>
            <span class="n">teardown_name</span> <span class="o">=</span> <span class="s1">&#39;teardown_function&#39;</span>
        <span class="n">setup_func_or_method</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">setup_name</span><span class="p">,</span> <span class="n">param_obj</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">setup_func_or_method</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">setup_func_or_method</span><span class="p">()</span>
        <span class="n">teardown_func_or_method</span> <span class="o">=</span> <span class="n">_get_xunit_setup_teardown</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">teardown_name</span><span class="p">,</span> <span class="n">param_obj</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">teardown_func_or_method</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">addfinalizer</span><span class="p">(</span><span class="n">teardown_func_or_method</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_prunetraceback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">excinfo</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#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">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">Code</span><span class="p">(</span><span class="n">get_real_func</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">))</span>
            <span class="n">path</span><span class="p">,</span> <span class="n">firstlineno</span> <span class="o">=</span> <span class="n">code</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="n">code</span><span class="o">.</span><span class="n">firstlineno</span>
            <span class="n">traceback</span> <span class="o">=</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span>
            <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">cut</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">,</span> <span class="n">firstlineno</span><span class="o">=</span><span class="n">firstlineno</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">ntraceback</span> <span class="o">==</span> <span class="n">traceback</span><span class="p">:</span>
                <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">ntraceback</span><span class="o">.</span><span class="n">cut</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">ntraceback</span> <span class="o">==</span> <span class="n">traceback</span><span class="p">:</span>
                    <span class="c1">#ntraceback = ntraceback.cut(excludepath=cutdir2)</span>
                    <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">ntraceback</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">filter_traceback</span><span class="p">)</span>
                    <span class="k">if</span> <span class="ow">not</span> <span class="n">ntraceback</span><span class="p">:</span>
                        <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">traceback</span>

            <span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span> <span class="o">=</span> <span class="n">ntraceback</span><span class="o">.</span><span class="n">filter</span><span class="p">()</span>
            <span class="c1"># issue364: mark all but first and last frames to</span>
            <span class="c1"># only show a single-line message for each frame</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">tbstyle</span> <span class="o">==</span> <span class="s2">&quot;auto&quot;</span><span class="p">:</span>
                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
                    <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
                        <span class="n">entry</span><span class="o">.</span><span class="n">set_repr_style</span><span class="p">(</span><span class="s1">&#39;short&#39;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_repr_failure_py</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">excinfo</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s2">&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="n">py</span><span class="o">.</span><span class="n">_builtin</span><span class="o">.</span><span class="n">_totext</span><span class="p">(</span><span class="n">excinfo</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
        <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">FunctionMixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">_repr_failure_py</span><span class="p">(</span><span class="n">excinfo</span><span class="p">,</span>
            <span class="n">style</span><span class="o">=</span><span class="n">style</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">repr_failure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">excinfo</span><span class="p">,</span> <span class="n">outerr</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="k">assert</span> <span class="n">outerr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;XXX outerr usage is deprecated&quot;</span>
        <span class="n">style</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">tbstyle</span>
        <span class="k">if</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">&quot;auto&quot;</span><span class="p">:</span>
            <span class="n">style</span> <span class="o">=</span> <span class="s2">&quot;long&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="n">style</span><span class="p">)</span>


<span class="k">class</span> <span class="nc">Generator</span><span class="p">(</span><span class="n">FunctionMixin</span><span class="p">,</span> <span class="n">PyCollector</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="c1"># test generators are seen as collectors but they also</span>
        <span class="c1"># invoke setup/teardown on popular request</span>
        <span class="c1"># (induced by the common &quot;test_*&quot; naming shared with normal tests)</span>
        <span class="kn">from</span> <span class="nn">_pytest</span> <span class="k">import</span> <span class="n">deprecated</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_setupstate</span><span class="o">.</span><span class="n">prepare</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="c1"># see FunctionMixin.setup and test_setupstate_is_preserved_134</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_preservedparent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">obj</span>
        <span class="n">l</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">seen</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">()):</span>
            <span class="n">name</span><span class="p">,</span> <span class="n">call</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getcallargs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">callable</span><span class="p">(</span><span class="n">call</span><span class="p">):</span>
                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%r</span><span class="s2"> yielded non callable test </span><span class="si">%r</span><span class="s2">&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="kc">None</span><span class="p">:</span>
                <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;[</span><span class="si">%d</span><span class="s2">]&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="s2">&quot;[&#39;</span><span class="si">%s</span><span class="s2">&#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="s2">&quot;</span><span class="si">%r</span><span class="s2"> generated tests with non-unique name </span><span class="si">%r</span><span class="s2">&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="kc">True</span>
            <span class="n">l</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Function</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">callobj</span><span class="o">=</span><span class="n">call</span><span class="p">))</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s1">&#39;C1&#39;</span><span class="p">,</span> <span class="n">deprecated</span><span class="o">.</span><span class="n">YIELD_TESTS</span><span class="p">,</span> <span class="n">fslocation</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">l</span>

    <span class="k">def</span> <span class="nf">getcallargs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
            <span class="n">obj</span> <span class="o">=</span> <span class="p">(</span><span class="n">obj</span><span class="p">,)</span>
        <span class="c1"># explicit naming</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">_basestring</span><span class="p">):</span>
            <span class="n">name</span> <span class="o">=</span> <span class="n">obj</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
            <span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">name</span> <span class="o">=</span> <span class="kc">None</span>
        <span class="n">call</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="n">obj</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">obj</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
        <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">call</span><span class="p">,</span> <span class="n">args</span>


<span class="k">def</span> <span class="nf">hasinit</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
    <span class="n">init</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#39;__init__&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">init</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">init</span> <span class="o">!=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__init__</span>


<span class="k">def</span> <span class="nf">hasnew</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
    <span class="n">new</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#39;__new__&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">new</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">new</span> <span class="o">!=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__new__</span>


<span class="k">class</span> <span class="nc">CallSpec2</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metafunc</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">metafunc</span> <span class="o">=</span> <span class="n">metafunc</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_globalid</span> <span class="o">=</span> <span class="n">NOTSET</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_globalid_args</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="o">=</span> <span class="n">NOTSET</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_arg2scopenum</span> <span class="o">=</span> <span class="p">{}</span>  <span class="c1"># used for sorting parametrized resources</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">indices</span> <span class="o">=</span> <span class="p">{}</span>

    <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metafunc</span><span class="p">):</span>
        <span class="n">cs</span> <span class="o">=</span> <span class="n">CallSpec2</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">metafunc</span><span class="p">)</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">funcargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span><span class="p">)</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="p">)</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">indices</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">indices</span><span class="p">)</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">)</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">_idlist</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span><span class="p">)</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">_globalid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalid</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">_globalid_args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalid_args</span>
        <span class="n">cs</span><span class="o">.</span><span class="n">_globalparam</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span>
        <span class="k">return</span> <span class="n">cs</span>

    <span class="k">def</span> <span class="nf">_checkargnotcontained</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="ow">or</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;duplicate </span><span class="si">%r</span><span class="s2">&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">NOTSET</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&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="kc">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span><span class="p">)))</span>

    <span class="k">def</span> <span class="nf">setmulti</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">valtypes</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">keywords</span><span class="p">,</span> <span class="n">scopenum</span><span class="p">,</span>
                 <span class="n">param_index</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">arg</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">valset</span><span class="p">):</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_checkargnotcontained</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
            <span class="n">valtype_for_arg</span> <span class="o">=</span> <span class="n">valtypes</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span>
            <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">valtype_for_arg</span><span class="p">)[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">indices</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">param_index</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">scopenum</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">keywords</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">setall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcargs</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">param</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">funcargs</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_checkargnotcontained</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">funcargs</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">id</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOTSET</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_idlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">param</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOTSET</span><span class="p">:</span>
            <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="ow">is</span> <span class="n">NOTSET</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_globalparam</span> <span class="o">=</span> <span class="n">param</span>
        <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">funcargs</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_arg2scopenum</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">scopenum_function</span>


<span class="k">class</span> <span class="nc">Metafunc</span><span class="p">(</span><span class="n">fixtures</span><span class="o">.</span><span class="n">FuncargnamesCompatAttr</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Metafunc objects are passed to the ``pytest_generate_tests`` hook.</span>
<span class="sd">    They help to inspect a test function and to generate tests according to</span>
<span class="sd">    test configuration or values specified in the class or module where a</span>
<span class="sd">    test function is defined.</span>
<span class="sd">    &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">function</span><span class="p">,</span> <span class="n">fixtureinfo</span><span class="p">,</span> <span class="n">config</span><span class="p">,</span> <span class="bp">cls</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="c1">#: access to the :class:`_pytest.config.Config` object for the test session</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">config</span>

        <span class="c1">#: the module object where the test function is defined in.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">module</span> <span class="o">=</span> <span class="n">module</span>

        <span class="c1">#: underlying python test function</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">function</span> <span class="o">=</span> <span class="n">function</span>

        <span class="c1">#: set of fixture names required by the test function</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span> <span class="o">=</span> <span class="n">fixtureinfo</span><span class="o">.</span><span class="n">names_closure</span>

        <span class="c1">#: class object where the test function is defined in or ``None``.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">cls</span> <span class="o">=</span> <span class="bp">cls</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">_calls</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_ids</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">set</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span> <span class="o">=</span> <span class="n">fixtureinfo</span><span class="o">.</span><span class="n">name2fixturedefs</span>

    <span class="k">def</span> <span class="nf">parametrize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">argvalues</span><span class="p">,</span> <span class="n">indirect</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ids</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
        <span class="n">scope</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="sd">&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 to do it rather at test setup time.</span>

<span class="sd">        :arg argnames: a comma-separated string denoting one or more argument</span>
<span class="sd">                       names, or a list/tuple of argument strings.</span>

<span class="sd">        :arg argvalues: The list of argvalues determines how often a</span>
<span class="sd">            test is invoked with different argument values.  If only one</span>
<span class="sd">            argname was specified argvalues is a list of values.  If N</span>
<span class="sd">            argnames were specified, argvalues must be a list of N-tuples,</span>
<span class="sd">            where each tuple-element specifies a value for its respective</span>
<span class="sd">            argname.</span>

<span class="sd">        :arg indirect: The list of argnames or boolean. A list of arguments&#39;</span>
<span class="sd">            names (subset of argnames). If True the list contains all names from</span>
<span class="sd">            the argnames. Each argvalue corresponding to an argname in this list will</span>
<span class="sd">            be passed as request.param to its respective argname fixture</span>
<span class="sd">            function so that it can perform more expensive setups during the</span>
<span class="sd">            setup phase of a test rather than at collection time.</span>

<span class="sd">        :arg ids: list of string ids, or a callable.</span>
<span class="sd">            If strings, each is corresponding to the argvalues so that they are</span>
<span class="sd">            part of the test id. If None is given as id of specific test, the</span>
<span class="sd">            automatically generated id for that argument will be used.</span>
<span class="sd">            If callable, it should take one argument (a single argvalue) and return</span>
<span class="sd">            a string or return None. If None, the automatically generated id for that</span>
<span class="sd">            argument will be used.</span>
<span class="sd">            If no ids are provided they will be generated automatically from</span>
<span class="sd">            the argvalues.</span>

<span class="sd">        :arg scope: if specified it denotes the scope of the parameters.</span>
<span class="sd">            The scope is used for grouping tests by parameter instances.</span>
<span class="sd">            It will also override any fixture-function defined scope, allowing</span>
<span class="sd">            to set a dynamic scope using test context or configuration.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="kn">from</span> <span class="nn">_pytest.fixtures</span> <span class="k">import</span> <span class="n">scope2index</span>
        <span class="kn">from</span> <span class="nn">_pytest.mark</span> <span class="k">import</span> <span class="n">extract_argvalue</span>
        <span class="kn">from</span> <span class="nn">py.io</span> <span class="k">import</span> <span class="n">saferepr</span>

        <span class="n">unwrapped_argvalues</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">newkeywords</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">maybe_marked_args</span> <span class="ow">in</span> <span class="n">argvalues</span><span class="p">:</span>
            <span class="n">argval</span><span class="p">,</span> <span class="n">newmarks</span> <span class="o">=</span> <span class="n">extract_argvalue</span><span class="p">(</span><span class="n">maybe_marked_args</span><span class="p">)</span>
            <span class="n">unwrapped_argvalues</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">argval</span><span class="p">)</span>
            <span class="n">newkeywords</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">newmarks</span><span class="p">)</span>
        <span class="n">argvalues</span> <span class="o">=</span> <span class="n">unwrapped_argvalues</span>

        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
            <span class="n">argnames</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">argnames</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()]</span>
            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">argnames</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
                <span class="n">argvalues</span> <span class="o">=</span> <span class="p">[(</span><span class="n">val</span><span class="p">,)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">argvalues</span><span class="p">]</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">argvalues</span><span class="p">:</span>
            <span class="n">argvalues</span> <span class="o">=</span> <span class="p">[(</span><span class="n">NOTSET</span><span class="p">,)</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">argnames</span><span class="p">)]</span>
            <span class="c1"># we passed a empty list to parameterize, skip that test</span>
            <span class="c1">#</span>
            <span class="n">fs</span><span class="p">,</span> <span class="n">lineno</span> <span class="o">=</span> <span class="n">getfslineno</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="p">)</span>
            <span class="n">newmark</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">mark</span><span class="o">.</span><span class="n">skip</span><span class="p">(</span>
                <span class="n">reason</span><span class="o">=</span><span class="s2">&quot;got empty parameter set </span><span class="si">%r</span><span class="s2">, function </span><span class="si">%s</span><span class="s2"> at </span><span class="si">%s</span><span class="s2">:</span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span>
                    <span class="n">argnames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">fs</span><span class="p">,</span> <span class="n">lineno</span><span class="p">))</span>
            <span class="n">newkeywords</span> <span class="o">=</span> <span class="p">[{</span><span class="n">newmark</span><span class="o">.</span><span class="n">markname</span><span class="p">:</span> <span class="n">newmark</span><span class="p">}]</span>

        <span class="k">if</span> <span class="n">scope</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">scope</span> <span class="o">=</span> <span class="n">_find_parametrized_scope</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="p">,</span> <span class="n">indirect</span><span class="p">)</span>

        <span class="n">scopenum</span> <span class="o">=</span> <span class="n">scope2index</span><span class="p">(</span>
            <span class="n">scope</span><span class="p">,</span> <span class="n">descr</span><span class="o">=</span><span class="s1">&#39;call to </span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parametrize</span><span class="p">))</span>
        <span class="n">valtypes</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">argnames</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span><span class="p">:</span>
                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">indirect</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
                    <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;fixture&#39;</span> <span class="k">if</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">indirect</span> <span class="k">else</span> <span class="s1">&#39;argument&#39;</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;fixture&#39;</span> <span class="k">if</span> <span class="n">indirect</span> <span class="k">else</span> <span class="s1">&#39;argument&#39;</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
                    <span class="s2">&quot;</span><span class="si">%r</span><span class="s2"> uses no </span><span class="si">%s</span><span class="s2"> </span><span class="si">%r</span><span class="s2">&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">name</span><span class="p">,</span> <span class="n">arg</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">indirect</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
            <span class="n">valtypes</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="s2">&quot;params&quot;</span><span class="p">)</span>
        <span class="k">elif</span> <span class="n">indirect</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
            <span class="n">valtypes</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="s2">&quot;funcargs&quot;</span><span class="p">)</span>
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">indirect</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
            <span class="n">valtypes</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="s2">&quot;funcargs&quot;</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">indirect</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">argnames</span><span class="p">:</span>
                    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;indirect given to </span><span class="si">%r</span><span class="s2">: fixture </span><span class="si">%r</span><span class="s2"> doesn&#39;t exist&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">valtypes</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;params&quot;</span>
        <span class="n">idfn</span> <span class="o">=</span> <span class="kc">None</span>
        <span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">ids</span><span class="p">):</span>
            <span class="n">idfn</span> <span class="o">=</span> <span class="n">ids</span>
            <span class="n">ids</span> <span class="o">=</span> <span class="kc">None</span>
        <span class="k">if</span> <span class="n">ids</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">argvalues</span><span class="p">):</span>
                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%d</span><span class="s1"> tests specified with </span><span class="si">%d</span><span class="s1"> ids&#39;</span> <span class="o">%</span><span class="p">(</span>
                                 <span class="nb">len</span><span class="p">(</span><span class="n">argvalues</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">)))</span>
            <span class="k">for</span> <span class="n">id_value</span> <span class="ow">in</span> <span class="n">ids</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">id_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">id_value</span><span class="p">,</span> <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">_basestring</span><span class="p">):</span>
                    <span class="n">msg</span> <span class="o">=</span> <span class="s1">&#39;ids must be list of strings, found: </span><span class="si">%s</span><span class="s1"> (type: </span><span class="si">%s</span><span class="s1">)&#39;</span>
                    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="p">(</span><span class="n">saferepr</span><span class="p">(</span><span class="n">id_value</span><span class="p">),</span> <span class="nb">type</span><span class="p">(</span><span class="n">id_value</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span>
        <span class="n">ids</span> <span class="o">=</span> <span class="n">idmaker</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">argvalues</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">ids</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">)</span>
        <span class="n">newcalls</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">callspec</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calls</span> <span class="ow">or</span> <span class="p">[</span><span class="n">CallSpec2</span><span class="p">(</span><span class="bp">self</span><span class="p">)]:</span>
            <span class="n">elements</span> <span class="o">=</span> <span class="nb">zip</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">argvalues</span><span class="p">,</span> <span class="n">newkeywords</span><span class="p">,</span> <span class="n">count</span><span class="p">())</span>
            <span class="k">for</span> <span class="n">a_id</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="n">keywords</span><span class="p">,</span> <span class="n">param_index</span> <span class="ow">in</span> <span class="n">elements</span><span class="p">:</span>
                <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">valset</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">argnames</span><span class="p">)</span>
                <span class="n">newcallspec</span> <span class="o">=</span> <span class="n">callspec</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
                <span class="n">newcallspec</span><span class="o">.</span><span class="n">setmulti</span><span class="p">(</span><span class="n">valtypes</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="n">a_id</span><span class="p">,</span>
                                     <span class="n">keywords</span><span class="p">,</span> <span class="n">scopenum</span><span class="p">,</span> <span class="n">param_index</span><span class="p">)</span>
                <span class="n">newcalls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">newcallspec</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_calls</span> <span class="o">=</span> <span class="n">newcalls</span>

    <span class="k">def</span> <span class="nf">addcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcargs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">NOTSET</span><span class="p">,</span> <span class="n">param</span><span class="o">=</span><span class="n">NOTSET</span><span class="p">):</span>
        <span class="sd">&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="kc">None</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">funcargs</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">funcargs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">funcargs</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span><span class="p">:</span>
                    <span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="s2">&quot;funcarg </span><span class="si">%r</span><span class="s2"> 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="kc">None</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&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">NOTSET</span><span class="p">:</span>
            <span class="nb">id</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_calls</span><span class="p">)</span>
        <span class="nb">id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">id</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ids</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;duplicate id </span><span class="si">%r</span><span class="s2">&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>


<span class="k">def</span> <span class="nf">_find_parametrized_scope</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">arg2fixturedefs</span><span class="p">,</span> <span class="n">indirect</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Find the most appropriate scope for a parametrized call based on its arguments.</span>

<span class="sd">    When there&#39;s at least one direct argument, always use &quot;function&quot; scope.</span>

<span class="sd">    When a test function is parametrized and all its arguments are indirect</span>
<span class="sd">    (e.g. fixtures), return the most narrow scope based on the fixtures used.</span>

<span class="sd">    Related to issue #1832, based on code posted by @Kingdread.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="kn">from</span> <span class="nn">_pytest.fixtures</span> <span class="k">import</span> <span class="n">scopes</span>
    <span class="n">indirect_as_list</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">indirect</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">))</span>
    <span class="n">all_arguments_are_fixtures</span> <span class="o">=</span> <span class="n">indirect</span> <span class="ow">is</span> <span class="kc">True</span> <span class="ow">or</span> \
                                 <span class="n">indirect_as_list</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">indirect</span><span class="p">)</span> <span class="o">==</span> <span class="n">argnames</span>
    <span class="k">if</span> <span class="n">all_arguments_are_fixtures</span><span class="p">:</span>
        <span class="n">fixturedefs</span> <span class="o">=</span> <span class="n">arg2fixturedefs</span> <span class="ow">or</span> <span class="p">{}</span>
        <span class="n">used_scopes</span> <span class="o">=</span> <span class="p">[</span><span class="n">fixturedef</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">scope</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">fixturedef</span> <span class="ow">in</span> <span class="n">fixturedefs</span><span class="o">.</span><span class="n">items</span><span class="p">()]</span>
        <span class="k">if</span> <span class="n">used_scopes</span><span class="p">:</span>
            <span class="c1"># Takes the most narrow scope from used fixtures</span>
            <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">scopes</span><span class="p">):</span>
                <span class="k">if</span> <span class="n">scope</span> <span class="ow">in</span> <span class="n">used_scopes</span><span class="p">:</span>
                    <span class="k">return</span> <span class="n">scope</span>

    <span class="k">return</span> <span class="s1">&#39;function&#39;</span>


<span class="k">def</span> <span class="nf">_idval</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">idfn</span><span class="p">:</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">s</span> <span class="o">=</span> <span class="n">idfn</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">s</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">_escape_strings</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
        <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
            <span class="k">pass</span>

    <span class="k">if</span> <span class="n">config</span><span class="p">:</span>
        <span class="n">hook_id</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">hook</span><span class="o">.</span><span class="n">pytest_make_parametrize_id</span><span class="p">(</span><span class="n">config</span><span class="o">=</span><span class="n">config</span><span class="p">,</span> <span class="n">val</span><span class="o">=</span><span class="n">val</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">hook_id</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">hook_id</span>

    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">STRING_TYPES</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">_escape_strings</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
    <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="p">(</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">)):</span>
        <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
    <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">REGEX_TYPE</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">_escape_strings</span><span class="p">(</span><span class="n">val</span><span class="o">.</span><span class="n">pattern</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">enum</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">enum</span><span class="o">.</span><span class="n">Enum</span><span class="p">):</span>
        <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">isclass</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="s1">&#39;__name__&#39;</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">val</span><span class="o">.</span><span class="vm">__name__</span>
    <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">argname</span><span class="p">)</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_idvalset</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">ids</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">ids</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="p">(</span><span class="n">idx</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">)</span> <span class="ow">or</span> <span class="n">ids</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
        <span class="n">this_id</span> <span class="o">=</span> <span class="p">[</span><span class="n">_idval</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>
                   <span class="k">for</span> <span class="n">val</span><span class="p">,</span> <span class="n">argname</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">valset</span><span class="p">,</span> <span class="n">argnames</span><span class="p">)]</span>
        <span class="k">return</span> <span class="s2">&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">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">_escape_strings</span><span class="p">(</span><span class="n">ids</span><span class="p">[</span><span class="n">idx</span><span class="p">])</span>

<span class="k">def</span> <span class="nf">idmaker</span><span class="p">(</span><span class="n">argnames</span><span class="p">,</span> <span class="n">argvalues</span><span class="p">,</span> <span class="n">idfn</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ids</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="n">ids</span> <span class="o">=</span> <span class="p">[</span><span class="n">_idvalset</span><span class="p">(</span><span class="n">valindex</span><span class="p">,</span> <span class="n">valset</span><span class="p">,</span> <span class="n">argnames</span><span class="p">,</span> <span class="n">idfn</span><span class="p">,</span> <span class="n">ids</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>
           <span class="k">for</span> <span class="n">valindex</span><span class="p">,</span> <span class="n">valset</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">argvalues</span><span class="p">)]</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">ids</span><span class="p">))</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">):</span>
        <span class="c1"># The ids are not unique</span>
        <span class="n">duplicates</span> <span class="o">=</span> <span class="p">[</span><span class="n">testid</span> <span class="k">for</span> <span class="n">testid</span> <span class="ow">in</span> <span class="n">ids</span> <span class="k">if</span> <span class="n">ids</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">testid</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">]</span>
        <span class="n">counters</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="mi">0</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">testid</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">ids</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">testid</span> <span class="ow">in</span> <span class="n">duplicates</span><span class="p">:</span>
                <span class="n">ids</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">testid</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">counters</span><span class="p">[</span><span class="n">testid</span><span class="p">])</span>
                <span class="n">counters</span><span class="p">[</span><span class="n">testid</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
    <span class="k">return</span> <span class="n">ids</span>


<span class="k">def</span> <span class="nf">show_fixtures_per_test</span><span class="p">(</span><span class="n">config</span><span class="p">):</span>
    <span class="kn">from</span> <span class="nn">_pytest.main</span> <span class="k">import</span> <span class="n">wrap_session</span>
    <span class="k">return</span> <span class="n">wrap_session</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">_show_fixtures_per_test</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">_show_fixtures_per_test</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
    <span class="kn">import</span> <span class="nn">_pytest.config</span>
    <span class="n">session</span><span class="o">.</span><span class="n">perform_collect</span><span class="p">()</span>
    <span class="n">curdir</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">()</span>
    <span class="n">tw</span> <span class="o">=</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">create_terminal_writer</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
    <span class="n">verbose</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">getvalue</span><span class="p">(</span><span class="s2">&quot;verbose&quot;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">get_best_rel</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
        <span class="n">loc</span> <span class="o">=</span> <span class="n">getlocation</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">curdir</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">curdir</span><span class="o">.</span><span class="n">bestrelpath</span><span class="p">(</span><span class="n">loc</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">write_fixture</span><span class="p">(</span><span class="n">fixture_def</span><span class="p">):</span>
        <span class="n">argname</span> <span class="o">=</span> <span class="n">fixture_def</span><span class="o">.</span><span class="n">argname</span>

        <span class="k">if</span> <span class="n">verbose</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">argname</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">):</span>
            <span class="k">return</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">bestrel</span> <span class="o">=</span> <span class="n">get_best_rel</span><span class="p">(</span><span class="n">fixture_def</span><span class="o">.</span><span class="n">func</span><span class="p">)</span>
            <span class="n">funcargspec</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{0}</span><span class="s2"> -- </span><span class="si">{1}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">argname</span><span class="p">,</span> <span class="n">bestrel</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">funcargspec</span> <span class="o">=</span> <span class="n">argname</span>
        <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">funcargspec</span><span class="p">,</span> <span class="n">green</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>

        <span class="n">INDENT</span> <span class="o">=</span> <span class="s1">&#39;    </span><span class="si">{0}</span><span class="s1">&#39;</span>
        <span class="n">fixture_doc</span> <span class="o">=</span> <span class="n">fixture_def</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__doc__</span>

        <span class="k">if</span> <span class="n">fixture_doc</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">fixture_doc</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">):</span>
                <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">INDENT</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">INDENT</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">&#39;no docstring available&#39;</span><span class="p">),</span> <span class="n">red</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">write_item</span><span class="p">(</span><span class="n">item</span><span class="p">):</span>
        <span class="n">name2fixturedefs</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">_fixtureinfo</span><span class="o">.</span><span class="n">name2fixturedefs</span>

        <span class="k">if</span> <span class="ow">not</span> <span class="n">name2fixturedefs</span><span class="p">:</span>
            <span class="c1"># The given test item does not use any fixtures</span>
            <span class="k">return</span>
        <span class="n">bestrel</span> <span class="o">=</span> <span class="n">get_best_rel</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">function</span><span class="p">)</span>

        <span class="n">tw</span><span class="o">.</span><span class="n">line</span><span class="p">()</span>
        <span class="n">tw</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;fixtures used by </span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
        <span class="n">tw</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;(</span><span class="si">{0}</span><span class="s1">)&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">bestrel</span><span class="p">))</span>
        <span class="k">for</span> <span class="n">argname</span><span class="p">,</span> <span class="n">fixture_defs</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">name2fixturedefs</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
            <span class="k">assert</span> <span class="n">fixture_defs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">fixture_defs</span><span class="p">:</span>
                <span class="k">continue</span>
            <span class="c1"># The last fixture def item in the list is expected</span>
            <span class="c1"># to be the one used by the test item</span>
            <span class="n">write_fixture</span><span class="p">(</span><span class="n">fixture_defs</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>

    <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">session</span><span class="o">.</span><span class="n">items</span><span class="p">:</span>
        <span class="n">write_item</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">showfixtures</span><span class="p">(</span><span class="n">config</span><span class="p">):</span>
    <span class="kn">from</span> <span class="nn">_pytest.main</span> <span class="k">import</span> <span class="n">wrap_session</span>
    <span class="k">return</span> <span class="n">wrap_session</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">_showfixtures_main</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_showfixtures_main</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
    <span class="kn">import</span> <span class="nn">_pytest.config</span>
    <span class="n">session</span><span class="o">.</span><span class="n">perform_collect</span><span class="p">()</span>
    <span class="n">curdir</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">()</span>
    <span class="n">tw</span> <span class="o">=</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">create_terminal_writer</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
    <span class="n">verbose</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">getvalue</span><span class="p">(</span><span class="s2">&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="n">seen</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>

    <span class="k">for</span> <span class="n">argname</span><span class="p">,</span> <span class="n">fixturedefs</span> <span class="ow">in</span> <span class="n">fm</span><span class="o">.</span><span class="n">_arg2fixturedefs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
        <span class="k">assert</span> <span class="n">fixturedefs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">fixturedefs</span><span class="p">:</span>
            <span class="k">continue</span>
        <span class="k">for</span> <span class="n">fixturedef</span> <span class="ow">in</span> <span class="n">fixturedefs</span><span class="p">:</span>
            <span class="n">loc</span> <span class="o">=</span> <span class="n">getlocation</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">func</span><span class="p">,</span> <span class="n">curdir</span><span class="p">)</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">argname</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span> <span class="ow">in</span> <span class="n">seen</span><span class="p">:</span>
                <span class="k">continue</span>
            <span class="n">seen</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">argname</span><span class="p">,</span> <span class="n">loc</span><span class="p">))</span>
            <span class="n">available</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">baseid</span><span class="p">),</span>
                              <span class="n">fixturedef</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span>
                              <span class="n">curdir</span><span class="o">.</span><span class="n">bestrelpath</span><span class="p">(</span><span class="n">loc</span><span class="p">),</span>
                              <span class="n">fixturedef</span><span class="o">.</span><span class="n">argname</span><span class="p">,</span> <span class="n">fixturedef</span><span class="p">))</span>

    <span class="n">available</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
    <span class="n">currentmodule</span> <span class="o">=</span> <span class="kc">None</span>
    <span class="k">for</span> <span class="n">baseid</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="n">bestrel</span><span class="p">,</span> <span class="n">argname</span><span class="p">,</span> <span class="n">fixturedef</span> <span class="ow">in</span> <span class="n">available</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">currentmodule</span> <span class="o">!=</span> <span class="n">module</span><span class="p">:</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">module</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&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="s2">&quot;-&quot;</span><span class="p">,</span> <span class="s2">&quot;fixtures defined from </span><span class="si">%s</span><span class="s2">&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="s2">&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="s2">&quot;</span><span class="si">%s</span><span class="s2"> -- </span><span class="si">%s</span><span class="s2">&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="kc">True</span><span class="p">)</span>
        <span class="n">loc</span> <span class="o">=</span> <span class="n">getlocation</span><span class="p">(</span><span class="n">fixturedef</span><span class="o">.</span><span class="n">func</span><span class="p">,</span> <span class="n">curdir</span><span class="p">)</span>
        <span class="n">doc</span> <span class="o">=</span> <span class="n">fixturedef</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__doc__</span> <span class="ow">or</span> <span class="s2">&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">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&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="s2">&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="s2">&quot;    </span><span class="si">%s</span><span class="s2">: 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="kc">True</span><span class="p">)</span>


<span class="c1"># builtin pytest.raises helper</span>

<div class="viewcode-block" id="raises"><a class="viewcode-back" href="../../api/sqlobject.tests.dbtest.html#sqlobject.tests.dbtest.raises">[docs]</a><span class="k">def</span> <span class="nf">raises</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Assert that a code block/function call raises ``expected_exception``</span>
<span class="sd">    and raise a failure exception otherwise.</span>

<span class="sd">    This helper produces a ``ExceptionInfo()`` object (see below).</span>

<span class="sd">    If using Python 2.5 or above, you may use this function as a</span>
<span class="sd">    context manager::</span>

<span class="sd">        &gt;&gt;&gt; with raises(ZeroDivisionError):</span>
<span class="sd">        ...    1/0</span>

<span class="sd">    .. versionchanged:: 2.10</span>

<span class="sd">    In the context manager form you may use the keyword argument</span>
<span class="sd">    ``message`` to specify a custom failure message::</span>

<span class="sd">        &gt;&gt;&gt; with raises(ZeroDivisionError, message=&quot;Expecting ZeroDivisionError&quot;):</span>
<span class="sd">        ...    pass</span>
<span class="sd">        Traceback (most recent call last):</span>
<span class="sd">          ...</span>
<span class="sd">        Failed: Expecting ZeroDivisionError</span>


<span class="sd">    .. note::</span>

<span class="sd">       When using ``pytest.raises`` as a context manager, it&#39;s worthwhile to</span>
<span class="sd">       note that normal context manager rules apply and that the exception</span>
<span class="sd">       raised *must* be the final line in the scope of the context manager.</span>
<span class="sd">       Lines of code after that, within the scope of the context manager will</span>
<span class="sd">       not be executed. For example::</span>

<span class="sd">           &gt;&gt;&gt; value = 15</span>
<span class="sd">           &gt;&gt;&gt; with raises(ValueError) as exc_info:</span>
<span class="sd">           ...     if value &gt; 10:</span>
<span class="sd">           ...         raise ValueError(&quot;value must be &lt;= 10&quot;)</span>
<span class="sd">           ...     assert str(exc_info.value) == &quot;value must be &lt;= 10&quot;  # this will not execute</span>

<span class="sd">       Instead, the following approach must be taken (note the difference in</span>
<span class="sd">       scope)::</span>

<span class="sd">           &gt;&gt;&gt; with raises(ValueError) as exc_info:</span>
<span class="sd">           ...     if value &gt; 10:</span>
<span class="sd">           ...         raise ValueError(&quot;value must be &lt;= 10&quot;)</span>
<span class="sd">           ...</span>
<span class="sd">           &gt;&gt;&gt; assert str(exc_info.value) == &quot;value must be &lt;= 10&quot;</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">    .. autoclass:: _pytest._code.ExceptionInfo</span>
<span class="sd">        :members:</span>

<span class="sd">    .. note::</span>
<span class="sd">        Similar to caught exception objects in Python, explicitly clearing</span>
<span class="sd">        local references to returned ``ExceptionInfo`` objects can</span>
<span class="sd">        help the Python interpreter speed up its garbage collection.</span>

<span class="sd">        Clearing those references breaks a reference cycle</span>
<span class="sd">        (``ExceptionInfo`` --&gt; caught exception --&gt; frame stack raising</span>
<span class="sd">        the exception --&gt; current frame stack --&gt; local variables --&gt;</span>
<span class="sd">        ``ExceptionInfo``) which makes Python keep all objects referenced</span>
<span class="sd">        from that cycle (including all local variables in the current</span>
<span class="sd">        frame) alive until the next cyclic garbage collection run. See the</span>
<span class="sd">        official Python ``try`` statement documentation for more detailed</span>
<span class="sd">        information.</span>

<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="kc">True</span>
    <span class="k">if</span> <span class="n">expected_exception</span> <span class="ow">is</span> <span class="ne">AssertionError</span><span class="p">:</span>
        <span class="c1"># we want to catch a AssertionError</span>
        <span class="c1"># replace our subclass with the builtin one</span>
        <span class="c1"># see https://github.com/pytest-dev/pytest/issues/176</span>
        <span class="kn">from</span> <span class="nn">_pytest.assertion.util</span> <span class="k">import</span> <span class="n">BuiltinAssertionError</span> \
            <span class="k">as</span> <span class="n">expected_exception</span>
    <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;exceptions must be old-style classes or&quot;</span>
           <span class="s2">&quot; derived from BaseException, not </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">exc</span> <span class="ow">in</span> <span class="n">expected_exception</span><span class="p">:</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">isclass</span><span class="p">(</span><span class="n">exc</span><span class="p">):</span>
                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="n">exc</span><span class="p">))</span>
    <span class="k">elif</span> <span class="ow">not</span> <span class="n">isclass</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">):</span>
        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">))</span>

    <span class="n">message</span> <span class="o">=</span> <span class="s2">&quot;DID NOT RAISE </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">)</span>

    <span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
        <span class="k">if</span> <span class="s2">&quot;message&quot;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
            <span class="n">message</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;message&quot;</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">RaisesContext</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
    <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">str</span><span class="p">):</span>
        <span class="n">code</span><span class="p">,</span> <span class="o">=</span> <span class="n">args</span>
        <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
        <span class="n">frame</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">_getframe</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
        <span class="n">loc</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_locals</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
        <span class="n">loc</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
        <span class="c1">#print &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">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">Source</span><span class="p">(</span><span class="n">code</span><span class="p">)</span><span class="o">.</span><span class="n">compile</span><span class="p">()</span>
            <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">exec_</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span>
            <span class="c1"># XXX didn&#39;T mean f_globals == f_locals something special?</span>
            <span class="c1">#     this is destroyed here ...</span>
        <span class="k">except</span> <span class="n">expected_exception</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">func</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
        <span class="k">except</span> <span class="n">expected_exception</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span>
    <span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</div>
<span class="k">class</span> <span class="nc">RaisesContext</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_exception</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expected_exception</span> <span class="o">=</span> <span class="n">expected_exception</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span> <span class="o">=</span> <span class="kc">None</span>

    <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="n">_pytest</span><span class="o">.</span><span class="n">_code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span>

    <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">tp</span><span class="p">):</span>
        <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="kc">True</span>
        <span class="k">if</span> <span class="n">tp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">pytest</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">):</span>
            <span class="c1"># py26: on __exit__() exc_value often does not contain the</span>
            <span class="c1"># exception value.</span>
            <span class="c1"># http://bugs.python.org/issue7853</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tp</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="ne">BaseException</span><span class="p">):</span>
                <span class="n">exc_type</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">traceback</span> <span class="o">=</span> <span class="n">tp</span>
                <span class="n">tp</span> <span class="o">=</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">traceback</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">tp</span><span class="p">)</span>
        <span class="n">suppress_exception</span> <span class="o">=</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_exception</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">suppress_exception</span><span class="p">:</span>
            <span class="n">sys</span><span class="o">.</span><span class="n">exc_clear</span><span class="p">()</span>
        <span class="k">return</span> <span class="n">suppress_exception</span>


<span class="c1"># builtin pytest.approx helper</span>

<span class="k">class</span> <span class="nc">approx</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Assert that two numbers (or two sets of numbers) are equal to each other</span>
<span class="sd">    within some tolerance.</span>

<span class="sd">    Due to the `intricacies of floating-point arithmetic`__, numbers that we</span>
<span class="sd">    would intuitively expect to be equal are not always so::</span>

<span class="sd">        &gt;&gt;&gt; 0.1 + 0.2 == 0.3</span>
<span class="sd">        False</span>

<span class="sd">    __ https://docs.python.org/3/tutorial/floatingpoint.html</span>

<span class="sd">    This problem is commonly encountered when writing tests, e.g. when making</span>
<span class="sd">    sure that floating-point values are what you expect them to be.  One way to</span>
<span class="sd">    deal with this problem is to assert that two floating-point numbers are</span>
<span class="sd">    equal to within some appropriate tolerance::</span>

<span class="sd">        &gt;&gt;&gt; abs((0.1 + 0.2) - 0.3) &lt; 1e-6</span>
<span class="sd">        True</span>

<span class="sd">    However, comparisons like this are tedious to write and difficult to</span>
<span class="sd">    understand.  Furthermore, absolute comparisons like the one above are</span>
<span class="sd">    usually discouraged because there&#39;s no tolerance that works well for all</span>
<span class="sd">    situations.  ``1e-6`` is good for numbers around ``1``, but too small for</span>
<span class="sd">    very big numbers and too big for very small ones.  It&#39;s better to express</span>
<span class="sd">    the tolerance as a fraction of the expected value, but relative comparisons</span>
<span class="sd">    like that are even more difficult to write correctly and concisely.</span>

<span class="sd">    The ``approx`` class performs floating-point comparisons using a syntax</span>
<span class="sd">    that&#39;s as intuitive as possible::</span>

<span class="sd">        &gt;&gt;&gt; from pytest import approx</span>
<span class="sd">        &gt;&gt;&gt; 0.1 + 0.2 == approx(0.3)</span>
<span class="sd">        True</span>

<span class="sd">    The same syntax also works on sequences of numbers::</span>

<span class="sd">        &gt;&gt;&gt; (0.1 + 0.2, 0.2 + 0.4) == approx((0.3, 0.6))</span>
<span class="sd">        True</span>

<span class="sd">    By default, ``approx`` considers numbers within a relative tolerance of</span>
<span class="sd">    ``1e-6`` (i.e. one part in a million) of its expected value to be equal.</span>
<span class="sd">    This treatment would lead to surprising results if the expected value was</span>
<span class="sd">    ``0.0``, because nothing but ``0.0`` itself is relatively close to ``0.0``.</span>
<span class="sd">    To handle this case less surprisingly, ``approx`` also considers numbers</span>
<span class="sd">    within an absolute tolerance of ``1e-12`` of its expected value to be</span>
<span class="sd">    equal.  Infinite numbers are another special case.  They are only</span>
<span class="sd">    considered equal to themselves, regardless of the relative tolerance.  Both</span>
<span class="sd">    the relative and absolute tolerances can be changed by passing arguments to</span>
<span class="sd">    the ``approx`` constructor::</span>

<span class="sd">        &gt;&gt;&gt; 1.0001 == approx(1)</span>
<span class="sd">        False</span>
<span class="sd">        &gt;&gt;&gt; 1.0001 == approx(1, rel=1e-3)</span>
<span class="sd">        True</span>
<span class="sd">        &gt;&gt;&gt; 1.0001 == approx(1, abs=1e-3)</span>
<span class="sd">        True</span>

<span class="sd">    If you specify ``abs`` but not ``rel``, the comparison will not consider</span>
<span class="sd">    the relative tolerance at all.  In other words, two numbers that are within</span>
<span class="sd">    the default relative tolerance of ``1e-6`` will still be considered unequal</span>
<span class="sd">    if they exceed the specified absolute tolerance.  If you specify both</span>
<span class="sd">    ``abs`` and ``rel``, the numbers will be considered equal if either</span>
<span class="sd">    tolerance is met::</span>

<span class="sd">        &gt;&gt;&gt; 1 + 1e-8 == approx(1)</span>
<span class="sd">        True</span>
<span class="sd">        &gt;&gt;&gt; 1 + 1e-8 == approx(1, abs=1e-12)</span>
<span class="sd">        False</span>
<span class="sd">        &gt;&gt;&gt; 1 + 1e-8 == approx(1, rel=1e-6, abs=1e-12)</span>
<span class="sd">        True</span>

<span class="sd">    If you&#39;re thinking about using ``approx``, then you might want to know how</span>
<span class="sd">    it compares to other good ways of comparing floating-point numbers.  All of</span>
<span class="sd">    these algorithms are based on relative and absolute tolerances and should</span>
<span class="sd">    agree for the most part, but they do have meaningful differences:</span>

<span class="sd">    - ``math.isclose(a, b, rel_tol=1e-9, abs_tol=0.0)``:  True if the relative</span>
<span class="sd">      tolerance is met w.r.t. either ``a`` or ``b`` or if the absolute</span>
<span class="sd">      tolerance is met.  Because the relative tolerance is calculated w.r.t.</span>
<span class="sd">      both ``a`` and ``b``, this test is symmetric (i.e.  neither ``a`` nor</span>
<span class="sd">      ``b`` is a &quot;reference value&quot;).  You have to specify an absolute tolerance</span>
<span class="sd">      if you want to compare to ``0.0`` because there is no tolerance by</span>
<span class="sd">      default.  Only available in python&gt;=3.5.  `More information...`__</span>

<span class="sd">      __ https://docs.python.org/3/library/math.html#math.isclose</span>

<span class="sd">    - ``numpy.isclose(a, b, rtol=1e-5, atol=1e-8)``: True if the difference</span>
<span class="sd">      between ``a`` and ``b`` is less that the sum of the relative tolerance</span>
<span class="sd">      w.r.t. ``b`` and the absolute tolerance.  Because the relative tolerance</span>
<span class="sd">      is only calculated w.r.t. ``b``, this test is asymmetric and you can</span>
<span class="sd">      think of ``b`` as the reference value.  Support for comparing sequences</span>
<span class="sd">      is provided by ``numpy.allclose``.  `More information...`__</span>

<span class="sd">      __ http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.isclose.html</span>

<span class="sd">    - ``unittest.TestCase.assertAlmostEqual(a, b)``: True if ``a`` and ``b``</span>
<span class="sd">      are within an absolute tolerance of ``1e-7``.  No relative tolerance is</span>
<span class="sd">      considered and the absolute tolerance cannot be changed, so this function</span>
<span class="sd">      is not appropriate for very large or very small numbers.  Also, it&#39;s only</span>
<span class="sd">      available in subclasses of ``unittest.TestCase`` and it&#39;s ugly because it</span>
<span class="sd">      doesn&#39;t follow PEP8.  `More information...`__</span>

<span class="sd">      __ https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertAlmostEqual</span>

<span class="sd">    - ``a == pytest.approx(b, rel=1e-6, abs=1e-12)``: True if the relative</span>
<span class="sd">      tolerance is met w.r.t. ``b`` or if the absolute tolerance is met.</span>
<span class="sd">      Because the relative tolerance is only calculated w.r.t. ``b``, this test</span>
<span class="sd">      is asymmetric and you can think of ``b`` as the reference value.  In the</span>
<span class="sd">      special case that you explicitly specify an absolute tolerance but not a</span>
<span class="sd">      relative tolerance, only the absolute tolerance is considered.</span>
<span class="sd">    &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">expected</span><span class="p">,</span> <span class="n">rel</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">abs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expected</span> <span class="o">=</span> <span class="n">expected</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">abs</span> <span class="o">=</span> <span class="nb">abs</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="o">=</span> <span class="n">rel</span>

    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actual</span><span class="p">):</span>
        <span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">Iterable</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">actual</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">):</span>
            <span class="n">actual</span> <span class="o">=</span> <span class="p">[</span><span class="n">actual</span><span class="p">]</span>
        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">actual</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">):</span>
            <span class="k">return</span> <span class="kc">False</span>
        <span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="n">x</span> <span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">actual</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">))</span>

    <span class="fm">__hash__</span> <span class="o">=</span> <span class="kc">None</span>

    <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actual</span><span class="p">):</span>
        <span class="k">return</span> <span class="ow">not</span> <span class="p">(</span><span class="n">actual</span> <span class="o">==</span> <span class="bp">self</span><span class="p">)</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">expected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="c1"># Regardless of whether the user-specified expected value is a number</span>
        <span class="c1"># or a sequence of numbers, return a list of ApproxNotIterable objects</span>
        <span class="c1"># that can be compared against.</span>
        <span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">Iterable</span>
        <span class="n">approx_non_iter</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">ApproxNonIterable</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">abs</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_expected</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">):</span>
            <span class="k">return</span> <span class="p">[</span><span class="n">approx_non_iter</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_expected</span><span class="p">]</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">[</span><span class="n">approx_non_iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_expected</span><span class="p">)]</span>

    <span class="nd">@expected</span><span class="o">.</span><span class="n">setter</span>
    <span class="k">def</span> <span class="nf">expected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_expected</span> <span class="o">=</span> <span class="n">expected</span>


<span class="k">class</span> <span class="nc">ApproxNonIterable</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Perform approximate comparisons for single numbers only.</span>

<span class="sd">    In other words, the ``expected`` attribute for objects of this class must</span>
<span class="sd">    be some sort of number.  This is in contrast to the ``approx`` class, where</span>
<span class="sd">    the ``expected`` attribute can either be a number of a sequence of numbers.</span>
<span class="sd">    This class is responsible for making comparisons, while ``approx`` is</span>
<span class="sd">    responsible for abstracting the difference between numbers and sequences of</span>
<span class="sd">    numbers.  Although this class can stand on its own, it&#39;s only meant to be</span>
<span class="sd">    used within ``approx``.</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">expected</span><span class="p">,</span> <span class="n">rel</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">abs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expected</span> <span class="o">=</span> <span class="n">expected</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">abs</span> <span class="o">=</span> <span class="nb">abs</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="o">=</span> <span class="n">rel</span>

    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">,</span> <span class="nb">complex</span><span class="p">):</span>
            <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span>

        <span class="c1"># Infinities aren&#39;t compared using tolerances, so don&#39;t show a</span>
        <span class="c1"># tolerance.</span>
        <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">isinf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">):</span>
            <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span>

        <span class="c1"># If a sensible tolerance can&#39;t be calculated, self.tolerance will</span>
        <span class="c1"># raise a ValueError.  In this case, display &#39;???&#39;.</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">vetted_tolerance</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{:.1e}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tolerance</span><span class="p">)</span>
        <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
            <span class="n">vetted_tolerance</span> <span class="o">=</span> <span class="s1">&#39;???&#39;</span>

        <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
            <span class="k">return</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1"> +- </span><span class="si">{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">,</span> <span class="n">vetted_tolerance</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="sa">u</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1"> </span><span class="se">\u00b1</span><span class="s1"> </span><span class="si">{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">,</span> <span class="n">vetted_tolerance</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actual</span><span class="p">):</span>
        <span class="c1"># Short-circuit exact equality.</span>
        <span class="k">if</span> <span class="n">actual</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">:</span>
            <span class="k">return</span> <span class="kc">True</span>

        <span class="c1"># Infinity shouldn&#39;t be approximately equal to anything but itself, but</span>
        <span class="c1"># if there&#39;s a relative tolerance, it will be infinite and infinity</span>
        <span class="c1"># will seem approximately equal to everything.  The equal-to-itself</span>
        <span class="c1"># case would have been short circuited above, so here we can just</span>
        <span class="c1"># return false if the expected value is infinite.  The abs() call is</span>
        <span class="c1"># for compatibility with complex numbers.</span>
        <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">isinf</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)):</span>
            <span class="k">return</span> <span class="kc">False</span>

        <span class="c1"># Return true if the two numbers are within the tolerance.</span>
        <span class="k">return</span> <span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span> <span class="o">-</span> <span class="n">actual</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tolerance</span>

    <span class="fm">__hash__</span> <span class="o">=</span> <span class="kc">None</span>

    <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actual</span><span class="p">):</span>
        <span class="k">return</span> <span class="ow">not</span> <span class="p">(</span><span class="n">actual</span> <span class="o">==</span> <span class="bp">self</span><span class="p">)</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">tolerance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">set_default</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">default</span><span class="p">:</span> <span class="n">x</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">default</span>

        <span class="c1"># Figure out what the absolute tolerance should be.  ``self.abs`` is</span>
        <span class="c1"># either None or a value specified by the user.</span>
        <span class="n">absolute_tolerance</span> <span class="o">=</span> <span class="n">set_default</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">abs</span><span class="p">,</span> <span class="mf">1e-12</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">absolute_tolerance</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;absolute tolerance can&#39;t be negative: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">absolute_tolerance</span><span class="p">))</span>
        <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">absolute_tolerance</span><span class="p">):</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;absolute tolerance can&#39;t be NaN.&quot;</span><span class="p">)</span>

        <span class="c1"># If the user specified an absolute tolerance but not a relative one,</span>
        <span class="c1"># just return the absolute tolerance.</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">abs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">absolute_tolerance</span>

        <span class="c1"># Figure out what the relative tolerance should be.  ``self.rel`` is</span>
        <span class="c1"># either None or a value specified by the user.  This is done after</span>
        <span class="c1"># we&#39;ve made sure the user didn&#39;t ask for an absolute tolerance only,</span>
        <span class="c1"># because we don&#39;t want to raise errors about the relative tolerance if</span>
        <span class="c1"># we aren&#39;t even going to use it.</span>
        <span class="n">relative_tolerance</span> <span class="o">=</span> <span class="n">set_default</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="mf">1e-6</span><span class="p">)</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">relative_tolerance</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;relative tolerance can&#39;t be negative: </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">absolute_tolerance</span><span class="p">))</span>
        <span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">relative_tolerance</span><span class="p">):</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;relative tolerance can&#39;t be NaN.&quot;</span><span class="p">)</span>

        <span class="c1"># Return the larger of the relative and absolute tolerances.</span>
        <span class="k">return</span> <span class="nb">max</span><span class="p">(</span><span class="n">relative_tolerance</span><span class="p">,</span> <span class="n">absolute_tolerance</span><span class="p">)</span>


<span class="c1">#</span>
<span class="c1">#  the basic pytest Function item</span>
<span class="c1">#</span>

<span class="k">class</span> <span class="nc">Function</span><span class="p">(</span><span class="n">FunctionMixin</span><span class="p">,</span> <span class="n">pytest</span><span class="o">.</span><span class="n">Item</span><span class="p">,</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">FuncargnamesCompatAttr</span><span class="p">):</span>
    <span class="sd">&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="kc">None</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
                 <span class="n">callspec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">callobj</span><span class="o">=</span><span class="n">NOTSET</span><span class="p">,</span> <span class="n">keywords</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
                 <span class="n">fixtureinfo</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">originalname</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Function</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="n">config</span><span class="p">,</span>
                                       <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_args</span> <span class="o">=</span> <span class="n">args</span>
        <span class="k">if</span> <span class="n">callobj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOTSET</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">callobj</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">callspec</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">callspec</span> <span class="o">=</span> <span class="n">callspec</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">callspec</span><span class="o">.</span><span class="n">keywords</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">keywords</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">keywords</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">fixtureinfo</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="n">fixtureinfo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span><span class="o">.</span><span class="n">getfixtureinfo</span><span class="p">(</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cls</span><span class="p">,</span>
                <span class="n">funcargs</span><span class="o">=</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_isyieldedfunction</span><span class="p">())</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_fixtureinfo</span> <span class="o">=</span> <span class="n">fixtureinfo</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">fixturenames</span> <span class="o">=</span> <span class="n">fixtureinfo</span><span class="o">.</span><span class="n">names_closure</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_initrequest</span><span class="p">()</span>

        <span class="c1">#: original function name, without any decorations (for example</span>
        <span class="c1">#: parametrization adds a ``&quot;[...]&quot;`` suffix to function names).</span>
        <span class="c1">#:</span>
        <span class="c1">#: .. versionadded:: 3.0</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">originalname</span> <span class="o">=</span> <span class="n">originalname</span>

    <span class="k">def</span> <span class="nf">_initrequest</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">funcargs</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_isyieldedfunction</span><span class="p">():</span>
            <span class="k">assert</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;callspec&quot;</span><span class="p">),</span> <span class="p">(</span>
                <span class="s2">&quot;yielded functions (deprecated) cannot have funcargs&quot;</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&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="k">assert</span> <span class="ow">not</span> <span class="n">callspec</span><span class="o">.</span><span class="n">funcargs</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">_genid</span> <span class="o">=</span> <span class="n">callspec</span><span class="o">.</span><span class="n">id</span>
                <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">callspec</span><span class="p">,</span> <span class="s2">&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="bp">self</span><span class="o">.</span><span class="n">_request</span> <span class="o">=</span> <span class="n">fixtures</span><span class="o">.</span><span class="n">FixtureRequest</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">function</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="s2">&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="s1">&#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="s2">&quot;[&quot;</span><span class="p">)</span> <span class="c1"># parametrization</span>
        <span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
            <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span>
        <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">_pyfuncitem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="s2">&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="s2">&quot;_args&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>

    <span class="k">def</span> <span class="nf">runtest</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&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="nb">super</span><span class="p">(</span><span class="n">Function</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">setup</span><span class="p">()</span>
        <span class="n">fixtures</span><span class="o">.</span><span class="n">fillfixtures</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</pre></div>

          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="../../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="nav-item nav-item-0"><a href="../../index.html">SQLObject 3.7.0 documentation</a> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &#187;</li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
        &#169; Copyright 2004-2018, Ian Bicking and contributors.
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.7.4.
    </div>
  </body>
</html>