Sophie

Sophie

distrib > Mandriva > 2010.2 > i586 > media > contrib-backports > by-pkgid > 85556a06d0b40546e6bb4676359ced2e > files > 86

python-pytest-2.2.4-1mdv2010.1.noarch.rpm



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>_pytest.main</title>
    <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../../',
        VERSION:     '2.2.4',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../../_static/jquery.js"></script>
    <script type="text/javascript" src="../../_static/underscore.js"></script>
    <script type="text/javascript" src="../../_static/doctools.js"></script>
    <link rel="top" title="None" href="../../index.html" />
    <link rel="up" title="Module code" href="../index.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../../py-modindex.html" title="Python Module Index"
             >modules</a></li>
        <li><a href="../../contents.html">pytest-2.2.4</a> &raquo;</li>
          <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
 
<g:plusone></g:plusone>

      </ul>
    </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
    <form class="search" action="../../search.html" method="get">
      <input type="text" name="q" size="18" />
      <input type="submit" value="Search" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>

<h3>quicklinks</h3>
<div style="text-align: left; font-size: 100%; vertical-align: middle;">
<table>
<tr>
<td>
        <a href="../../index.html">home</a>
</td><td>
        <a href="../../contents.html">TOC/contents</a>
</td></tr><tr><td>
        <a href="../../getting-started.html">install</a>
</td><td>
        <a href="../../changelog.html">changelog</a>
</td></tr><tr><td>
        <a href="../../example/index.html">examples</a>
</td><td>
        <a href="../../customize.html">customize</a>
</td></tr><tr><td>
        <a href="https://bitbucket.org/hpk42/pytest/issues?status=new&status=open">issues[bb]</a>
</td><td>
        <a href="../../contact.html">contact</a>
</td></tr></table>
</div>

        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <h1>Source code for _pytest.main</h1><div class="highlight"><pre>
<span class="sd">&quot;&quot;&quot; core implementation of testing process: init, session, runtest loop. &quot;&quot;&quot;</span>

<span class="kn">import</span> <span class="nn">py</span>
<span class="kn">import</span> <span class="nn">pytest</span><span class="o">,</span> <span class="nn">_pytest</span>
<span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">imp</span>
<span class="n">tracebackcutdir</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">local</span><span class="p">(</span><span class="n">_pytest</span><span class="o">.</span><span class="n">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">dirpath</span><span class="p">()</span>

<span class="c"># exitcodes for the command line</span>
<span class="n">EXIT_OK</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">EXIT_TESTSFAILED</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">EXIT_INTERRUPTED</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">EXIT_INTERNALERROR</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">EXIT_USAGEERROR</span> <span class="o">=</span> <span class="mi">4</span>

<span class="n">name_re</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">std</span><span class="o">.</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&quot;^[a-zA-Z_]\w*$&quot;</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">parser</span><span class="o">.</span><span class="n">addini</span><span class="p">(</span><span class="s">&quot;norecursedirs&quot;</span><span class="p">,</span> <span class="s">&quot;directory patterns to avoid for recursion&quot;</span><span class="p">,</span>
        <span class="nb">type</span><span class="o">=</span><span class="s">&quot;args&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;.*&#39;</span><span class="p">,</span> <span class="s">&#39;CVS&#39;</span><span class="p">,</span> <span class="s">&#39;_darcs&#39;</span><span class="p">,</span> <span class="s">&#39;{arch}&#39;</span><span class="p">))</span>
    <span class="c">#parser.addini(&quot;dirpatterns&quot;,</span>
    <span class="c">#    &quot;patterns specifying possible locations of test files&quot;,</span>
    <span class="c">#    type=&quot;linelist&quot;, default=[&quot;**/test_*.txt&quot;,</span>
    <span class="c">#            &quot;**/test_*.py&quot;, &quot;**/*_test.py&quot;]</span>
    <span class="c">#)</span>
    <span class="n">group</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">getgroup</span><span class="p">(</span><span class="s">&quot;general&quot;</span><span class="p">,</span> <span class="s">&quot;running and selection options&quot;</span><span class="p">)</span>
    <span class="n">group</span><span class="o">.</span><span class="n">_addoption</span><span class="p">(</span><span class="s">&#39;-x&#39;</span><span class="p">,</span> <span class="s">&#39;--exitfirst&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
               <span class="n">dest</span><span class="o">=</span><span class="s">&quot;exitfirst&quot;</span><span class="p">,</span>
               <span class="n">help</span><span class="o">=</span><span class="s">&quot;exit instantly on first error or failed test.&quot;</span><span class="p">),</span>
    <span class="n">group</span><span class="o">.</span><span class="n">_addoption</span><span class="p">(</span><span class="s">&#39;--maxfail&#39;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;num&quot;</span><span class="p">,</span>
               <span class="n">action</span><span class="o">=</span><span class="s">&quot;store&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">&quot;int&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;maxfail&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
               <span class="n">help</span><span class="o">=</span><span class="s">&quot;exit after first num failures or errors.&quot;</span><span class="p">)</span>

    <span class="n">group</span><span class="o">.</span><span class="n">_addoption</span><span class="p">(</span><span class="s">&#39;--strict&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span>
               <span class="n">help</span><span class="o">=</span><span class="s">&quot;run pytest in strict mode, warnings become errors.&quot;</span><span class="p">)</span>

    <span class="n">group</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">getgroup</span><span class="p">(</span><span class="s">&quot;collect&quot;</span><span class="p">,</span> <span class="s">&quot;collection&quot;</span><span class="p">)</span>
    <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span><span class="s">&#39;--collectonly&#39;</span><span class="p">,</span>
        <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;collectonly&quot;</span><span class="p">,</span>
        <span class="n">help</span><span class="o">=</span><span class="s">&quot;only collect tests, don&#39;t execute them.&quot;</span><span class="p">),</span>
    <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span><span class="s">&#39;--pyargs&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;store_true&quot;</span><span class="p">,</span>
        <span class="n">help</span><span class="o">=</span><span class="s">&quot;try to interpret all arguments as python packages.&quot;</span><span class="p">)</span>
    <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span><span class="s">&quot;--ignore&quot;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;append&quot;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;path&quot;</span><span class="p">,</span>
        <span class="n">help</span><span class="o">=</span><span class="s">&quot;ignore path during collection (multi-allowed).&quot;</span><span class="p">)</span>
    <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span><span class="s">&#39;--confcutdir&#39;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;confcutdir&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
        <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;dir&quot;</span><span class="p">,</span>
        <span class="n">help</span><span class="o">=</span><span class="s">&quot;only load conftest.py&#39;s relative to specified dir.&quot;</span><span class="p">)</span>

    <span class="n">group</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">getgroup</span><span class="p">(</span><span class="s">&quot;debugconfig&quot;</span><span class="p">,</span>
        <span class="s">&quot;test session debugging and configuration&quot;</span><span class="p">)</span>
    <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span><span class="s">&#39;--basetemp&#39;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">&quot;basetemp&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">&quot;dir&quot;</span><span class="p">,</span>
               <span class="n">help</span><span class="o">=</span><span class="s">&quot;base temporary directory for this test run.&quot;</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">pytest_namespace</span><span class="p">():</span>
    <span class="n">collect</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">Item</span><span class="o">=</span><span class="n">Item</span><span class="p">,</span> <span class="n">Collector</span><span class="o">=</span><span class="n">Collector</span><span class="p">,</span> <span class="n">File</span><span class="o">=</span><span class="n">File</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="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="n">collect</span><span class="o">=</span><span class="n">collect</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">py</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">config</span> <span class="c"># compatibiltiy</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">exitfirst</span><span class="p">:</span>
        <span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="o">.</span><span class="n">maxfail</span> <span class="o">=</span> <span class="mi">1</span>

<span class="k">def</span> <span class="nf">wrap_session</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">doit</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Skeleton command line program&quot;&quot;&quot;</span>
    <span class="n">session</span> <span class="o">=</span> <span class="n">Session</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
    <span class="n">session</span><span class="o">.</span><span class="n">exitstatus</span> <span class="o">=</span> <span class="n">EXIT_OK</span>
    <span class="n">initstate</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">config</span><span class="o">.</span><span class="n">pluginmanager</span><span class="o">.</span><span class="n">do_configure</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
            <span class="n">initstate</span> <span class="o">=</span> <span class="mi">1</span>
            <span class="n">config</span><span class="o">.</span><span class="n">hook</span><span class="o">.</span><span class="n">pytest_sessionstart</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="n">initstate</span> <span class="o">=</span> <span class="mi">2</span>
            <span class="n">doit</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="k">except</span> <span class="n">pytest</span><span class="o">.</span><span class="n">UsageError</span><span class="p">:</span>
            <span class="n">msg</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="o">.</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
            <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;ERROR: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&quot;</span> <span class="o">%</span><span class="p">(</span><span class="n">msg</span><span class="p">,))</span>
            <span class="n">session</span><span class="o">.</span><span class="n">exitstatus</span> <span class="o">=</span> <span class="n">EXIT_USAGEERROR</span>
        <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
            <span class="n">excinfo</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span>
            <span class="n">config</span><span class="o">.</span><span class="n">hook</span><span class="o">.</span><span class="n">pytest_keyboard_interrupt</span><span class="p">(</span><span class="n">excinfo</span><span class="o">=</span><span class="n">excinfo</span><span class="p">)</span>
            <span class="n">session</span><span class="o">.</span><span class="n">exitstatus</span> <span class="o">=</span> <span class="n">EXIT_INTERRUPTED</span>
        <span class="k">except</span><span class="p">:</span>
            <span class="n">excinfo</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span>
            <span class="n">config</span><span class="o">.</span><span class="n">pluginmanager</span><span class="o">.</span><span class="n">notify_exception</span><span class="p">(</span><span class="n">excinfo</span><span class="p">,</span> <span class="n">config</span><span class="o">.</span><span class="n">option</span><span class="p">)</span>
            <span class="n">session</span><span class="o">.</span><span class="n">exitstatus</span> <span class="o">=</span> <span class="n">EXIT_INTERNALERROR</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="ne">SystemExit</span><span class="p">):</span>
                <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;mainloop: caught Spurious SystemExit!</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
    <span class="k">finally</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">initstate</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">:</span>
            <span class="n">config</span><span class="o">.</span><span class="n">hook</span><span class="o">.</span><span class="n">pytest_sessionfinish</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="n">exitstatus</span><span class="o">=</span><span class="n">session</span><span class="o">.</span><span class="n">exitstatus</span> <span class="ow">or</span> <span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">_testsfailed</span> <span class="ow">and</span> <span class="mi">1</span><span class="p">))</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">session</span><span class="o">.</span><span class="n">exitstatus</span> <span class="ow">and</span> <span class="n">session</span><span class="o">.</span><span class="n">_testsfailed</span><span class="p">:</span>
            <span class="n">session</span><span class="o">.</span><span class="n">exitstatus</span> <span class="o">=</span> <span class="n">EXIT_TESTSFAILED</span>
        <span class="k">if</span> <span class="n">initstate</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">config</span><span class="o">.</span><span class="n">pluginmanager</span><span class="o">.</span><span class="n">do_unconfigure</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">session</span><span class="o">.</span><span class="n">exitstatus</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">return</span> <span class="n">wrap_session</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">_main</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">_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="sd">&quot;&quot;&quot; default command line protocol for initialization, session,</span>
<span class="sd">    running tests and reporting. &quot;&quot;&quot;</span>
    <span class="n">config</span><span class="o">.</span><span class="n">hook</span><span class="o">.</span><span class="n">pytest_collection</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="n">config</span><span class="o">.</span><span class="n">hook</span><span class="o">.</span><span class="n">pytest_runtestloop</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="k">def</span> <span class="nf">pytest_collection</span><span class="p">(</span><span class="n">session</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">session</span><span class="o">.</span><span class="n">perform_collect</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">pytest_runtestloop</span><span class="p">(</span><span class="n">session</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">session</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">collectonly</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">True</span>
    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">items</span><span class="p">):</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">nextitem</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">items</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
        <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
            <span class="n">nextitem</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">item</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_runtest_protocol</span><span class="p">(</span><span class="n">item</span><span class="o">=</span><span class="n">item</span><span class="p">,</span> <span class="n">nextitem</span><span class="o">=</span><span class="n">nextitem</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">shouldstop</span><span class="p">:</span>
            <span class="k">raise</span> <span class="n">session</span><span class="o">.</span><span class="n">Interrupted</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">shouldstop</span><span class="p">)</span>
    <span class="k">return</span> <span class="bp">True</span>

<span class="k">def</span> <span class="nf">pytest_ignore_collect</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
    <span class="n">p</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">dirpath</span><span class="p">()</span>
    <span class="n">ignore_paths</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">_getconftest_pathlist</span><span class="p">(</span><span class="s">&quot;collect_ignore&quot;</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">p</span><span class="p">)</span>
    <span class="n">ignore_paths</span> <span class="o">=</span> <span class="n">ignore_paths</span> <span class="ow">or</span> <span class="p">[]</span>
    <span class="n">excludeopt</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">getvalue</span><span class="p">(</span><span class="s">&quot;ignore&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">excludeopt</span><span class="p">:</span>
        <span class="n">ignore_paths</span><span class="o">.</span><span class="n">extend</span><span class="p">([</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">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">excludeopt</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">ignore_paths</span>

<span class="k">class</span> <span class="nc">HookProxy</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">fspath</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">fspath</span> <span class="o">=</span> <span class="n">fspath</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="k">def</span> <span class="nf">__getattr__</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">hookmethod</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">config</span><span class="o">.</span><span class="n">hook</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
        <span class="k">def</span> <span class="nf">call_matching_hooks</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
            <span class="n">plugins</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">_getmatchingplugins</span><span class="p">(</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">hookmethod</span><span class="o">.</span><span class="n">pcall</span><span class="p">(</span><span class="n">plugins</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">call_matching_hooks</span>

<span class="k">def</span> <span class="nf">compatproperty</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">fget</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</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">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">fget</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span>
        <span class="s">&quot;deprecated attribute </span><span class="si">%r</span><span class="s">, use pytest.</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span><span class="n">name</span><span class="p">))</span>

<div class="viewcode-block" id="Node"><a class="viewcode-back" href="../../plugins.html#_pytest.main.Node">[docs]</a><span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; base class for all Nodes in the collection tree.</span>
<span class="sd">    Collector subclasses have children, Items are terminal nodes.&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">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="c">#: a unique name with the scope of the parent</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>

        <span class="c">#: the parent collector node.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>

        <span class="c">#: the test config object</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="ow">or</span> <span class="n">parent</span><span class="o">.</span><span class="n">config</span>

        <span class="c">#: the collection this node is part of</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span> <span class="ow">or</span> <span class="n">parent</span><span class="o">.</span><span class="n">session</span>

        <span class="c">#: filesystem path where this node was collected from</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">fspath</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="s">&#39;fspath&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ihook</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">gethookproxy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fspath</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="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="bp">True</span><span class="p">}</span>

    <span class="n">Module</span> <span class="o">=</span> <span class="n">compatproperty</span><span class="p">(</span><span class="s">&quot;Module&quot;</span><span class="p">)</span>
    <span class="n">Class</span> <span class="o">=</span> <span class="n">compatproperty</span><span class="p">(</span><span class="s">&quot;Class&quot;</span><span class="p">)</span>
    <span class="n">Instance</span> <span class="o">=</span> <span class="n">compatproperty</span><span class="p">(</span><span class="s">&quot;Instance&quot;</span><span class="p">)</span>
    <span class="n">Function</span> <span class="o">=</span> <span class="n">compatproperty</span><span class="p">(</span><span class="s">&quot;Function&quot;</span><span class="p">)</span>
    <span class="n">File</span> <span class="o">=</span> <span class="n">compatproperty</span><span class="p">(</span><span class="s">&quot;File&quot;</span><span class="p">)</span>
    <span class="n">Item</span> <span class="o">=</span> <span class="n">compatproperty</span><span class="p">(</span><span class="s">&quot;Item&quot;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_getcustomclass</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">cls</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="n">name</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">cls</span> <span class="o">!=</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="n">py</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">_apiwarn</span><span class="p">(</span><span class="s">&quot;2.0&quot;</span><span class="p">,</span> <span class="s">&quot;use of node.</span><span class="si">%s</span><span class="s"> is deprecated, &quot;</span>
                <span class="s">&quot;use pytest_pycollect_makeitem(...) to create custom &quot;</span>
                <span class="s">&quot;collection nodes&quot;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">cls</span>

    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s">&quot;&lt;</span><span class="si">%s</span><span class="s"> </span><span class="si">%r</span><span class="s">&gt;&quot;</span> <span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</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="s">&#39;name&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span>

    <span class="c"># methods for ordering nodes</span>
    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">nodeid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodeid</span>
        <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_nodeid</span> <span class="o">=</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_makeid</span><span class="p">()</span>
            <span class="k">return</span> <span class="n">x</span>

    <span class="k">def</span> <span class="nf">_makeid</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">nodeid</span> <span class="o">+</span> <span class="s">&quot;::&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>

    <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="bp">False</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">__class__</span> <span class="ow">and</span> \
               <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">parent</span>

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

    <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="nb">hash</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">name</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="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">pass</span>

    <span class="k">def</span> <span class="nf">teardown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">pass</span>

    <span class="k">def</span> <span class="nf">_memoizedcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attrname</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
        <span class="n">exattrname</span> <span class="o">=</span> <span class="s">&quot;_ex_&quot;</span> <span class="o">+</span> <span class="n">attrname</span>
        <span class="n">failure</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="n">exattrname</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">failure</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</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">_reraise</span><span class="p">(</span><span class="n">failure</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">failure</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">failure</span><span class="p">[</span><span class="mi">2</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="n">attrname</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="n">attrname</span><span class="p">)</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">res</span> <span class="o">=</span> <span class="n">function</span><span class="p">()</span>
        <span class="k">except</span> <span class="n">py</span><span class="o">.</span><span class="n">builtin</span><span class="o">.</span><span class="n">_sysex</span><span class="p">:</span>
            <span class="k">raise</span>
        <span class="k">except</span><span class="p">:</span>
            <span class="n">failure</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">std</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="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exattrname</span><span class="p">,</span> <span class="n">failure</span><span class="p">)</span>
            <span class="k">raise</span>
        <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attrname</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">res</span>

<div class="viewcode-block" id="Node.listchain"><a class="viewcode-back" href="../../plugins.html#_pytest.main.Node.listchain">[docs]</a>    <span class="k">def</span> <span class="nf">listchain</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; return list of all parent collectors up to self,</span>
<span class="sd">            starting from root of collection tree. &quot;&quot;&quot;</span>
        <span class="n">chain</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">item</span> <span class="o">=</span> <span class="bp">self</span>
        <span class="k">while</span> <span class="n">item</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">chain</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
            <span class="n">item</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">parent</span>
        <span class="n">chain</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
        <span class="k">return</span> <span class="n">chain</span>
</div>
    <span class="k">def</span> <span class="nf">listnames</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">name</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">listchain</span><span class="p">()]</span>

    <span class="k">def</span> <span class="nf">getplugins</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">config</span><span class="o">.</span><span class="n">_getmatchingplugins</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">getparent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span>
        <span class="n">current</span> <span class="o">=</span> <span class="bp">self</span>
        <span class="k">while</span> <span class="n">current</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span>
            <span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="o">.</span><span class="n">parent</span>
        <span class="k">return</span> <span class="n">current</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">pass</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="bp">None</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">option</span><span class="o">.</span><span class="n">fulltrace</span><span class="p">:</span>
            <span class="n">style</span><span class="o">=</span><span class="s">&quot;long&quot;</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_prunetraceback</span><span class="p">(</span><span class="n">excinfo</span><span class="p">)</span>
        <span class="c"># XXX should excinfo.getrepr record all data and toterminal()</span>
        <span class="c"># process it?</span>
        <span class="k">if</span> <span class="n">style</span> <span class="ow">is</span> <span class="bp">None</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">option</span><span class="o">.</span><span class="n">tbstyle</span> <span class="o">==</span> <span class="s">&quot;short&quot;</span><span class="p">:</span>
                <span class="n">style</span> <span class="o">=</span> <span class="s">&quot;short&quot;</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">style</span> <span class="o">=</span> <span class="s">&quot;long&quot;</span>
        <span class="k">return</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">getrepr</span><span class="p">(</span><span class="n">funcargs</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                               <span class="n">showlocals</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">showlocals</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="n">repr_failure</span> <span class="o">=</span> <span class="n">_repr_failure_py</span>
</div>
<span class="k">class</span> <span class="nc">Collector</span><span class="p">(</span><span class="n">Node</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Collector instances create children through collect()</span>
<span class="sd">        and thus iteratively build a tree.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">class</span> <span class="nc">CollectError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; an error during collection, contains a custom message. &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="sd">&quot;&quot;&quot; returns a list of children (items and collectors)</span>
<span class="sd">            for this collection node.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">&quot;abstract&quot;</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="sd">&quot;&quot;&quot; represent a collection failure. &quot;&quot;&quot;</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="bp">self</span><span class="o">.</span><span class="n">CollectError</span><span class="p">):</span>
            <span class="n">exc</span> <span class="o">=</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">value</span>
            <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">exc</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">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="s">&quot;short&quot;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_memocollect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; internal helper method to cache results of calling collect(). &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_memoizedcall</span><span class="p">(</span><span class="s">&#39;_collected&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">collect</span><span class="p">()))</span>

    <span class="k">def</span> <span class="nf">_prunetraceback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">excinfo</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;fspath&#39;</span><span class="p">):</span>
            <span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fspath</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="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">ntraceback</span> <span class="o">==</span> <span class="n">traceback</span><span class="p">:</span>
                <span class="n">ntraceback</span> <span class="o">=</span> <span class="n">ntraceback</span><span class="o">.</span><span class="n">cut</span><span class="p">(</span><span class="n">excludepath</span><span class="o">=</span><span class="n">tracebackcutdir</span><span class="p">)</span>
            <span class="n">excinfo</span><span class="o">.</span><span class="n">traceback</span> <span class="o">=</span> <span class="n">ntraceback</span><span class="o">.</span><span class="n">filter</span><span class="p">()</span>

<span class="k">class</span> <span class="nc">FSCollector</span><span class="p">(</span><span class="n">Collector</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">fspath</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="n">fspath</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">fspath</span><span class="p">)</span> <span class="c"># xxx only for test_resultlog.py?</span>
        <span class="n">name</span> <span class="o">=</span> <span class="n">fspath</span><span class="o">.</span><span class="n">basename</span>
        <span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">rel</span> <span class="o">=</span> <span class="n">fspath</span><span class="o">.</span><span class="n">relto</span><span class="p">(</span><span class="n">parent</span><span class="o">.</span><span class="n">fspath</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">rel</span><span class="p">:</span>
                <span class="n">name</span> <span class="o">=</span> <span class="n">rel</span>
            <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">sep</span><span class="p">,</span> <span class="s">&quot;/&quot;</span><span class="p">)</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">FSCollector</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">config</span><span class="p">,</span> <span class="n">session</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">fspath</span> <span class="o">=</span> <span class="n">fspath</span>

    <span class="k">def</span> <span class="nf">_makeid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span>
            <span class="k">return</span> <span class="s">&quot;.&quot;</span>
        <span class="n">relpath</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">fspath</span><span class="o">.</span><span class="n">bestrelpath</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">sep</span> <span class="o">!=</span> <span class="s">&quot;/&quot;</span><span class="p">:</span>
            <span class="n">relpath</span> <span class="o">=</span> <span class="n">relpath</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">sep</span><span class="p">,</span> <span class="s">&quot;/&quot;</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">relpath</span>

<span class="k">class</span> <span class="nc">File</span><span class="p">(</span><span class="n">FSCollector</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; base class for collecting tests from a file. &quot;&quot;&quot;</span>

<span class="k">class</span> <span class="nc">Item</span><span class="p">(</span><span class="n">Node</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; a basic test invocation item. Note that for a single function</span>
<span class="sd">    there might be multiple test invocation items.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">nextitem</span> <span class="o">=</span> <span class="bp">None</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fspath</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="s">&quot;&quot;</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">location</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_location</span>
        <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
            <span class="n">location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reportinfo</span><span class="p">()</span>
            <span class="c"># bestrelpath is a quite slow function</span>
            <span class="n">cache</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s">&quot;_bestrelpathcache&quot;</span><span class="p">,</span> <span class="p">{})</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">fspath</span> <span class="o">=</span> <span class="n">cache</span><span class="p">[</span><span class="n">location</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
            <span class="k">except</span> <span class="ne">KeyError</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">session</span><span class="o">.</span><span class="n">fspath</span><span class="o">.</span><span class="n">bestrelpath</span><span class="p">(</span><span class="n">location</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
                <span class="n">cache</span><span class="p">[</span><span class="n">location</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">fspath</span>
            <span class="n">location</span> <span class="o">=</span> <span class="p">(</span><span class="n">fspath</span><span class="p">,</span> <span class="n">location</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nb">str</span><span class="p">(</span><span class="n">location</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_location</span> <span class="o">=</span> <span class="n">location</span>
            <span class="k">return</span> <span class="n">location</span>

<span class="k">class</span> <span class="nc">NoMatch</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; raised if matching cannot locate a matching names. &quot;&quot;&quot;</span>

<span class="k">class</span> <span class="nc">Session</span><span class="p">(</span><span class="n">FSCollector</span><span class="p">):</span>
    <span class="k">class</span> <span class="nc">Interrupted</span><span class="p">(</span><span class="ne">KeyboardInterrupt</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; signals an interrupted test run. &quot;&quot;&quot;</span>
        <span class="n">__module__</span> <span class="o">=</span> <span class="s">&#39;builtins&#39;</span> <span class="c"># for py3</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">config</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Session</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">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">parent</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
            <span class="n">config</span><span class="o">=</span><span class="n">config</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
        <span class="k">assert</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">register</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="s">&quot;session&quot;</span><span class="p">,</span> <span class="n">prepend</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_testsfailed</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">shouldstop</span> <span class="o">=</span> <span class="bp">False</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">trace</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;collection&quot;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_norecursepatterns</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">getini</span><span class="p">(</span><span class="s">&quot;norecursedirs&quot;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">pytest_collectstart</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">shouldstop</span><span class="p">:</span>
            <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">Interrupted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">shouldstop</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">pytest_runtest_logreport</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">report</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">report</span><span class="o">.</span><span class="n">failed</span> <span class="ow">and</span> <span class="s">&#39;xfail&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">report</span><span class="p">,</span> <span class="s">&#39;keywords&#39;</span><span class="p">,</span> <span class="p">[]):</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_testsfailed</span> <span class="o">+=</span> <span class="mi">1</span>
            <span class="n">maxfail</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">getvalue</span><span class="p">(</span><span class="s">&quot;maxfail&quot;</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">maxfail</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_testsfailed</span> <span class="o">&gt;=</span> <span class="n">maxfail</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">shouldstop</span> <span class="o">=</span> <span class="s">&quot;stopping after </span><span class="si">%d</span><span class="s"> failures&quot;</span> <span class="o">%</span> <span class="p">(</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">_testsfailed</span><span class="p">)</span>
    <span class="n">pytest_collectreport</span> <span class="o">=</span> <span class="n">pytest_runtest_logreport</span>

    <span class="k">def</span> <span class="nf">isinitpath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_initialpaths</span>

    <span class="k">def</span> <span class="nf">gethookproxy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fspath</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">HookProxy</span><span class="p">(</span><span class="n">fspath</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="k">def</span> <span class="nf">perform_collect</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="bp">None</span><span class="p">,</span> <span class="n">genitems</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
        <span class="n">hook</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">hook</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">items</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_perform_collect</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">genitems</span><span class="p">)</span>
            <span class="n">hook</span><span class="o">.</span><span class="n">pytest_collection_modifyitems</span><span class="p">(</span><span class="n">session</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
                <span class="n">config</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">,</span> <span class="n">items</span><span class="o">=</span><span class="n">items</span><span class="p">)</span>
        <span class="k">finally</span><span class="p">:</span>
            <span class="n">hook</span><span class="o">.</span><span class="n">pytest_collection_finish</span><span class="p">(</span><span class="n">session</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">items</span>

    <span class="k">def</span> <span class="nf">_perform_collect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">genitems</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">args</span> <span class="ow">is</span> <span class="bp">None</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">config</span><span class="o">.</span><span class="n">args</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="p">(</span><span class="s">&quot;perform_collect&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">indent</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_notfound</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_initialpaths</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">_initialparts</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">items</span> <span class="o">=</span> <span class="n">items</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">args</span><span class="p">:</span>
            <span class="n">parts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parsearg</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_initialparts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_initialpaths</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">parts</span><span class="p">[</span><span class="mi">0</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_collectstart</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">rep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_make_collect_report</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="bp">self</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_collectreport</span><span class="p">(</span><span class="n">report</span><span class="o">=</span><span class="n">rep</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">indent</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_notfound</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">arg</span><span class="p">,</span> <span class="n">exc</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_notfound</span><span class="p">:</span>
                <span class="n">line</span> <span class="o">=</span> <span class="s">&quot;(no name </span><span class="si">%r</span><span class="s"> in any of </span><span class="si">%r</span><span class="s">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">exc</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">raise</span> <span class="n">pytest</span><span class="o">.</span><span class="n">UsageError</span><span class="p">(</span><span class="s">&quot;not found: </span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">line</span><span class="p">))</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">genitems</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">rep</span><span class="o">.</span><span class="n">result</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">rep</span><span class="o">.</span><span class="n">passed</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">rep</span><span class="o">.</span><span class="n">result</span><span class="p">:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">genitems</span><span class="p">(</span><span class="n">node</span><span class="p">))</span>
            <span class="k">return</span> <span class="n">items</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">for</span> <span class="n">parts</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_initialparts</span><span class="p">:</span>
            <span class="n">arg</span> <span class="o">=</span> <span class="s">&quot;::&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">parts</span><span class="p">))</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="p">(</span><span class="s">&quot;processing argument&quot;</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">indent</span> <span class="o">+=</span> <span class="mi">1</span>
            <span class="k">try</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">_collect</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
                    <span class="k">yield</span> <span class="n">x</span>
            <span class="k">except</span> <span class="n">NoMatch</span><span class="p">:</span>
                <span class="c"># we are inside a make_report hook so</span>
                <span class="c"># we cannot directly pass through the exception</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">_notfound</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">arg</span><span class="p">,</span> <span class="n">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="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">indent</span> <span class="o">-=</span> <span class="mi">1</span>
                <span class="k">break</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">indent</span> <span class="o">-=</span> <span class="mi">1</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="n">arg</span><span class="p">):</span>
        <span class="n">names</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parsearg</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
        <span class="n">path</span> <span class="o">=</span> <span class="n">names</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="nb">dir</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
            <span class="k">assert</span> <span class="ow">not</span> <span class="n">names</span><span class="p">,</span> <span class="s">&quot;invalid arg </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span><span class="p">(</span><span class="n">arg</span><span class="p">,)</span>
            <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">path</span><span class="o">.</span><span class="n">visit</span><span class="p">(</span><span class="n">fil</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="nb">file</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span>
                <span class="n">rec</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_recurse</span><span class="p">,</span> <span class="n">bf</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">sort</span><span class="o">=</span><span class="bp">True</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">_collectfile</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
                    <span class="k">yield</span> <span class="n">x</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">assert</span> <span class="n">path</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="nb">file</span><span class="o">=</span><span class="mi">1</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">matchnodes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_collectfile</span><span class="p">(</span><span class="n">path</span><span class="p">),</span> <span class="n">names</span><span class="p">):</span>
                <span class="k">yield</span> <span class="n">x</span>

    <span class="k">def</span> <span class="nf">_collectfile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
        <span class="n">ihook</span> <span class="o">=</span> <span class="bp">self</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">if</span> <span class="ow">not</span> <span class="bp">self</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">if</span> <span class="n">ihook</span><span class="o">.</span><span class="n">pytest_ignore_collect</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">config</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">):</span>
               <span class="k">return</span> <span class="p">()</span>
        <span class="k">return</span> <span class="n">ihook</span><span class="o">.</span><span class="n">pytest_collect_file</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="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_recurse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
        <span class="n">ihook</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">gethookproxy</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">dirpath</span><span class="p">())</span>
        <span class="k">if</span> <span class="n">ihook</span><span class="o">.</span><span class="n">pytest_ignore_collect</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">config</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">):</span>
           <span class="k">return</span>
        <span class="k">for</span> <span class="n">pat</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_norecursepatterns</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="n">fnmatch</span><span class="o">=</span><span class="n">pat</span><span class="p">):</span>
                <span class="k">return</span> <span class="bp">False</span>
        <span class="n">ihook</span> <span class="o">=</span> <span class="bp">self</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="n">ihook</span><span class="o">.</span><span class="n">pytest_collect_directory</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="bp">self</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">True</span>

    <span class="k">def</span> <span class="nf">_tryconvertpyarg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="n">mod</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">path</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">)]</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span>
        <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">):</span>
            <span class="c"># ignore anything that&#39;s not a proper name here</span>
            <span class="c"># else something like --pyargs will mess up &#39;.&#39;</span>
            <span class="c"># since imp.find_module will actually sometimes work for it</span>
            <span class="c"># but it&#39;s supposed to be considered a filesystem path</span>
            <span class="c"># not a package</span>
            <span class="k">if</span> <span class="n">name_re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">x</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">fd</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">type_</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="n">find_module</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
            <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">x</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">fd</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
                    <span class="n">fd</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

            <span class="k">if</span> <span class="n">type_</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">!=</span> <span class="n">imp</span><span class="o">.</span><span class="n">PKG_DIRECTORY</span><span class="p">:</span>
                <span class="n">path</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">mod</span><span class="p">)]</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">path</span> <span class="o">=</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">_parsearg</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="sd">&quot;&quot;&quot; return (fspath, names) tuple after checking the file exists. &quot;&quot;&quot;</span>
        <span class="n">arg</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">arg</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">option</span><span class="o">.</span><span class="n">pyargs</span><span class="p">:</span>
            <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tryconvertpyarg</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
        <span class="n">parts</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;::&quot;</span><span class="p">)</span>
        <span class="n">relpath</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;/&quot;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">sep</span><span class="p">)</span>
        <span class="n">path</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">join</span><span class="p">(</span><span class="n">relpath</span><span class="p">,</span> <span class="nb">abs</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">check</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">option</span><span class="o">.</span><span class="n">pyargs</span><span class="p">:</span>
                <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;file or package not found: &quot;</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;file not found: &quot;</span>
            <span class="k">raise</span> <span class="n">pytest</span><span class="o">.</span><span class="n">UsageError</span><span class="p">(</span><span class="n">msg</span> <span class="o">+</span> <span class="n">arg</span><span class="p">)</span>
        <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">path</span>
        <span class="k">return</span> <span class="n">parts</span>

    <span class="k">def</span> <span class="nf">matchnodes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">matching</span><span class="p">,</span> <span class="n">names</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="p">(</span><span class="s">&quot;matchnodes&quot;</span><span class="p">,</span> <span class="n">matching</span><span class="p">,</span> <span class="n">names</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">indent</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="n">nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_matchnodes</span><span class="p">(</span><span class="n">matching</span><span class="p">,</span> <span class="n">names</span><span class="p">)</span>
        <span class="n">num</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="p">(</span><span class="s">&quot;matchnodes finished -&gt; &quot;</span><span class="p">,</span> <span class="n">num</span><span class="p">,</span> <span class="s">&quot;nodes&quot;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">indent</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">raise</span> <span class="n">NoMatch</span><span class="p">(</span><span class="n">matching</span><span class="p">,</span> <span class="n">names</span><span class="p">[:</span><span class="mi">1</span><span class="p">])</span>
        <span class="k">return</span> <span class="n">nodes</span>

    <span class="k">def</span> <span class="nf">_matchnodes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">matching</span><span class="p">,</span> <span class="n">names</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">matching</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">names</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">matching</span>
        <span class="n">name</span> <span class="o">=</span> <span class="n">names</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
        <span class="k">assert</span> <span class="n">name</span>
        <span class="n">nextnames</span> <span class="o">=</span> <span class="n">names</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
        <span class="n">resultnodes</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">matching</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">pytest</span><span class="o">.</span><span class="n">Item</span><span class="p">):</span>
                <span class="k">if</span> <span class="ow">not</span> <span class="n">names</span><span class="p">:</span>
                    <span class="n">resultnodes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
                <span class="k">continue</span>
            <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</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="n">node</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_collectstart</span><span class="p">(</span><span class="n">collector</span><span class="o">=</span><span class="n">node</span><span class="p">)</span>
            <span class="n">rep</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_make_collect_report</span><span class="p">(</span><span class="n">collector</span><span class="o">=</span><span class="n">node</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">rep</span><span class="o">.</span><span class="n">passed</span><span class="p">:</span>
                <span class="n">has_matched</span> <span class="o">=</span> <span class="bp">False</span>
                <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">rep</span><span class="o">.</span><span class="n">result</span><span class="p">:</span>
                    <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">name</span><span class="p">:</span>
                        <span class="n">resultnodes</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">matchnodes</span><span class="p">([</span><span class="n">x</span><span class="p">],</span> <span class="n">nextnames</span><span class="p">))</span>
                        <span class="n">has_matched</span> <span class="o">=</span> <span class="bp">True</span>
                <span class="c"># XXX accept IDs that don&#39;t have &quot;()&quot; for class instances</span>
                <span class="k">if</span> <span class="ow">not</span> <span class="n">has_matched</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">rep</span><span class="o">.</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&quot;()&quot;</span><span class="p">:</span>
                    <span class="n">nextnames</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
                    <span class="n">resultnodes</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">matchnodes</span><span class="p">([</span><span class="n">x</span><span class="p">],</span> <span class="n">nextnames</span><span class="p">))</span>
            <span class="n">node</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_collectreport</span><span class="p">(</span><span class="n">report</span><span class="o">=</span><span class="n">rep</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">resultnodes</span>

    <span class="k">def</span> <span class="nf">genitems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">trace</span><span class="p">(</span><span class="s">&quot;genitems&quot;</span><span class="p">,</span> <span class="n">node</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">pytest</span><span class="o">.</span><span class="n">Item</span><span class="p">):</span>
            <span class="n">node</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_itemcollected</span><span class="p">(</span><span class="n">item</span><span class="o">=</span><span class="n">node</span><span class="p">)</span>
            <span class="k">yield</span> <span class="n">node</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</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="n">node</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_collectstart</span><span class="p">(</span><span class="n">collector</span><span class="o">=</span><span class="n">node</span><span class="p">)</span>
            <span class="n">rep</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_make_collect_report</span><span class="p">(</span><span class="n">collector</span><span class="o">=</span><span class="n">node</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">rep</span><span class="o">.</span><span class="n">passed</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">subnode</span> <span class="ow">in</span> <span class="n">rep</span><span class="o">.</span><span class="n">result</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">genitems</span><span class="p">(</span><span class="n">subnode</span><span class="p">):</span>
                        <span class="k">yield</span> <span class="n">x</span>
            <span class="n">node</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_collectreport</span><span class="p">(</span><span class="n">report</span><span class="o">=</span><span class="n">rep</span><span class="p">)</span>
</pre></div>

          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../../py-modindex.html" title="Python Module Index"
             >modules</a></li>
        <li><a href="../../contents.html">pytest-2.2.4</a> &raquo;</li>
          <li><a href="../index.html" >Module code</a> &raquo;</li>
 
<g:plusone></g:plusone>

      </ul>
    </div>

    <div class="footer">
        &copy; Copyright 2011, holger krekel et alii.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
    </div>
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-7597274-13']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>

  </body>
</html>