Sophie

Sophie

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

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.runner</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.runner</h1><div class="highlight"><pre>
<span class="sd">&quot;&quot;&quot; basic collect and runtest protocol implementations &quot;&quot;&quot;</span>

<span class="kn">import</span> <span class="nn">py</span><span class="o">,</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">py._code.code</span> <span class="kn">import</span> <span class="n">TerminalRepr</span>

<span class="k">def</span> <span class="nf">pytest_namespace</span><span class="p">():</span>
    <span class="k">return</span> <span class="p">{</span>
        <span class="s">&#39;fail&#39;</span>         <span class="p">:</span> <span class="n">fail</span><span class="p">,</span>
        <span class="s">&#39;skip&#39;</span>         <span class="p">:</span> <span class="n">skip</span><span class="p">,</span>
        <span class="s">&#39;importorskip&#39;</span> <span class="p">:</span> <span class="n">importorskip</span><span class="p">,</span>
        <span class="s">&#39;exit&#39;</span>         <span class="p">:</span> <span class="nb">exit</span><span class="p">,</span>
    <span class="p">}</span>

<span class="c">#</span>
<span class="c"># pytest plugin hooks</span>

<span class="k">def</span> <span class="nf">pytest_addoption</span><span class="p">(</span><span class="n">parser</span><span class="p">):</span>
    <span class="n">group</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">getgroup</span><span class="p">(</span><span class="s">&quot;terminal reporting&quot;</span><span class="p">,</span> <span class="s">&quot;reporting&quot;</span><span class="p">,</span> <span class="n">after</span><span class="o">=</span><span class="s">&quot;general&quot;</span><span class="p">)</span>
    <span class="n">group</span><span class="o">.</span><span class="n">addoption</span><span class="p">(</span><span class="s">&#39;--durations&#39;</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">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;N&quot;</span><span class="p">,</span>
         <span class="n">help</span><span class="o">=</span><span class="s">&quot;show N slowest setup/test durations (N=0 for all).&quot;</span><span class="p">),</span>

<span class="k">def</span> <span class="nf">pytest_terminal_summary</span><span class="p">(</span><span class="n">terminalreporter</span><span class="p">):</span>
    <span class="n">durations</span> <span class="o">=</span> <span class="n">terminalreporter</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">durations</span>
    <span class="k">if</span> <span class="n">durations</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span>
    <span class="n">tr</span> <span class="o">=</span> <span class="n">terminalreporter</span>
    <span class="n">dlist</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">replist</span> <span class="ow">in</span> <span class="n">tr</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
        <span class="k">for</span> <span class="n">rep</span> <span class="ow">in</span> <span class="n">replist</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">rep</span><span class="p">,</span> <span class="s">&#39;duration&#39;</span><span class="p">):</span>
                <span class="n">dlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rep</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">dlist</span><span class="p">:</span>
        <span class="k">return</span>
    <span class="n">dlist</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">duration</span><span class="p">)</span>
    <span class="n">dlist</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">durations</span><span class="p">:</span>
        <span class="n">tr</span><span class="o">.</span><span class="n">write_sep</span><span class="p">(</span><span class="s">&quot;=&quot;</span><span class="p">,</span> <span class="s">&quot;slowest test durations&quot;</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">tr</span><span class="o">.</span><span class="n">write_sep</span><span class="p">(</span><span class="s">&quot;=&quot;</span><span class="p">,</span> <span class="s">&quot;slowest </span><span class="si">%s</span><span class="s"> test durations&quot;</span> <span class="o">%</span> <span class="n">durations</span><span class="p">)</span>
        <span class="n">dlist</span> <span class="o">=</span> <span class="n">dlist</span><span class="p">[:</span><span class="n">durations</span><span class="p">]</span>

    <span class="k">for</span> <span class="n">rep</span> <span class="ow">in</span> <span class="n">dlist</span><span class="p">:</span>
        <span class="n">nodeid</span> <span class="o">=</span> <span class="n">rep</span><span class="o">.</span><span class="n">nodeid</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;::()::&quot;</span><span class="p">,</span> <span class="s">&quot;::&quot;</span><span class="p">)</span>
        <span class="n">tr</span><span class="o">.</span><span class="n">write_line</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%02.2f</span><span class="s">s </span><span class="si">%-8s</span><span class="s"> </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
            <span class="p">(</span><span class="n">rep</span><span class="o">.</span><span class="n">duration</span><span class="p">,</span> <span class="n">rep</span><span class="o">.</span><span class="n">when</span><span class="p">,</span> <span class="n">nodeid</span><span class="p">))</span>

<span class="k">def</span> <span class="nf">pytest_sessionstart</span><span class="p">(</span><span class="n">session</span><span class="p">):</span>
    <span class="n">session</span><span class="o">.</span><span class="n">_setupstate</span> <span class="o">=</span> <span class="n">SetupState</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">pytest_sessionfinish</span><span class="p">(</span><span class="n">session</span><span class="p">):</span>
    <span class="n">session</span><span class="o">.</span><span class="n">_setupstate</span><span class="o">.</span><span class="n">teardown_all</span><span class="p">()</span>

<span class="k">class</span> <span class="nc">NodeInfo</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">location</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">def</span> <span class="nf">pytest_runtest_protocol</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">nextitem</span><span class="p">):</span>
    <span class="n">item</span><span class="o">.</span><span class="n">ihook</span><span class="o">.</span><span class="n">pytest_runtest_logstart</span><span class="p">(</span>
        <span class="n">nodeid</span><span class="o">=</span><span class="n">item</span><span class="o">.</span><span class="n">nodeid</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="n">item</span><span class="o">.</span><span class="n">location</span><span class="p">,</span>
    <span class="p">)</span>
    <span class="n">runtestprotocol</span><span class="p">(</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">return</span> <span class="bp">True</span>

<span class="k">def</span> <span class="nf">runtestprotocol</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">log</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">nextitem</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="n">rep</span> <span class="o">=</span> <span class="n">call_and_report</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s">&quot;setup&quot;</span><span class="p">,</span> <span class="n">log</span><span class="p">)</span>
    <span class="n">reports</span> <span class="o">=</span> <span class="p">[</span><span class="n">rep</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">reports</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">call_and_report</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s">&quot;call&quot;</span><span class="p">,</span> <span class="n">log</span><span class="p">))</span>
    <span class="n">reports</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">call_and_report</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="s">&quot;teardown&quot;</span><span class="p">,</span> <span class="n">log</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">return</span> <span class="n">reports</span>

<span class="k">def</span> <span class="nf">pytest_runtest_setup</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">session</span><span class="o">.</span><span class="n">_setupstate</span><span class="o">.</span><span class="n">prepare</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">pytest_runtest_call</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">runtest</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">pytest_runtest_teardown</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">nextitem</span><span class="p">):</span>
    <span class="n">item</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_setupstate</span><span class="o">.</span><span class="n">teardown_exact</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">nextitem</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">pytest_report_teststatus</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">when</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&quot;setup&quot;</span><span class="p">,</span> <span class="s">&quot;teardown&quot;</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="p">:</span>
            <span class="c">#      category, shortletter, verbose-word</span>
            <span class="k">return</span> <span class="s">&quot;error&quot;</span><span class="p">,</span> <span class="s">&quot;E&quot;</span><span class="p">,</span> <span class="s">&quot;ERROR&quot;</span>
        <span class="k">elif</span> <span class="n">report</span><span class="o">.</span><span class="n">skipped</span><span class="p">:</span>
            <span class="k">return</span> <span class="s">&quot;skipped&quot;</span><span class="p">,</span> <span class="s">&quot;s&quot;</span><span class="p">,</span> <span class="s">&quot;SKIPPED&quot;</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="s">&quot;&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span>


<span class="c">#</span>
<span class="c"># Implementation</span>

<span class="k">def</span> <span class="nf">call_and_report</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">when</span><span class="p">,</span> <span class="n">log</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span>
    <span class="n">call</span> <span class="o">=</span> <span class="n">call_runtest_hook</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">when</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">)</span>
    <span class="n">hook</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">ihook</span>
    <span class="n">report</span> <span class="o">=</span> <span class="n">hook</span><span class="o">.</span><span class="n">pytest_runtest_makereport</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">call</span><span class="o">=</span><span class="n">call</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">log</span><span class="p">:</span>
        <span class="n">hook</span><span class="o">.</span><span class="n">pytest_runtest_logreport</span><span class="p">(</span><span class="n">report</span><span class="o">=</span><span class="n">report</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">report</span>

<span class="k">def</span> <span class="nf">call_runtest_hook</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">when</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span>
    <span class="n">hookname</span> <span class="o">=</span> <span class="s">&quot;pytest_runtest_&quot;</span> <span class="o">+</span> <span class="n">when</span>
    <span class="n">ihook</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">ihook</span><span class="p">,</span> <span class="n">hookname</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">CallInfo</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">ihook</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="o">**</span><span class="n">kwds</span><span class="p">),</span> <span class="n">when</span><span class="o">=</span><span class="n">when</span><span class="p">)</span>

<div class="viewcode-block" id="CallInfo"><a class="viewcode-back" href="../../plugins.html#_pytest.runner.CallInfo">[docs]</a><span class="k">class</span> <span class="nc">CallInfo</span><span class="p">:</span>
    <span class="sd">&quot;&quot;&quot; Result/Exception info a function invocation. &quot;&quot;&quot;</span>
    <span class="c">#: None or ExceptionInfo object.</span>
    <span class="n">excinfo</span> <span class="o">=</span> <span class="bp">None</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">when</span><span class="p">):</span>
        <span class="c">#: context of invocation: one of &quot;setup&quot;, &quot;call&quot;,</span>
        <span class="c">#: &quot;teardown&quot;, &quot;memocollect&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">when</span> <span class="o">=</span> <span class="n">when</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">()</span>
            <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
                <span class="k">raise</span>
            <span class="k">except</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span> <span class="o">=</span> <span class="n">py</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">()</span>
        <span class="k">finally</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">stop</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span><span class="p">:</span>
            <span class="n">status</span> <span class="o">=</span> <span class="s">&quot;exception: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">excinfo</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">status</span> <span class="o">=</span> <span class="s">&quot;result: </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="p">,)</span>
        <span class="k">return</span> <span class="s">&quot;&lt;CallInfo when=</span><span class="si">%r</span><span class="s"> </span><span class="si">%s</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">when</span><span class="p">,</span> <span class="n">status</span><span class="p">)</span>
</div>
<span class="k">def</span> <span class="nf">getslaveinfoline</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">node</span><span class="o">.</span><span class="n">_slaveinfocache</span>
    <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
        <span class="n">d</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">slaveinfo</span>
        <span class="n">ver</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;version_info&#39;</span><span class="p">][:</span><span class="mi">3</span><span class="p">]</span>
        <span class="n">node</span><span class="o">.</span><span class="n">_slaveinfocache</span> <span class="o">=</span> <span class="n">s</span> <span class="o">=</span> <span class="s">&quot;[</span><span class="si">%s</span><span class="s">] </span><span class="si">%s</span><span class="s"> -- Python </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span>
            <span class="n">d</span><span class="p">[</span><span class="s">&#39;id&#39;</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;sysplatform&#39;</span><span class="p">],</span> <span class="n">ver</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;executable&#39;</span><span class="p">])</span>
        <span class="k">return</span> <span class="n">s</span>

<span class="k">class</span> <span class="nc">BaseReport</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">toterminal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">out</span><span class="p">):</span>
        <span class="n">longrepr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">longrepr</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;node&#39;</span><span class="p">):</span>
            <span class="n">out</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">getslaveinfoline</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="p">))</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">longrepr</span><span class="p">,</span> <span class="s">&#39;toterminal&#39;</span><span class="p">):</span>
            <span class="n">longrepr</span><span class="o">.</span><span class="n">toterminal</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">out</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">longrepr</span><span class="p">))</span>

    <span class="n">passed</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">outcome</span> <span class="o">==</span> <span class="s">&quot;passed&quot;</span><span class="p">)</span>
    <span class="n">failed</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">outcome</span> <span class="o">==</span> <span class="s">&quot;failed&quot;</span><span class="p">)</span>
    <span class="n">skipped</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">outcome</span> <span class="o">==</span> <span class="s">&quot;skipped&quot;</span><span class="p">)</span>

    <span class="nd">@property</span>
    <span class="k">def</span> <span class="nf">fspath</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodeid</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="mi">0</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">pytest_runtest_makereport</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">call</span><span class="p">):</span>
    <span class="n">when</span> <span class="o">=</span> <span class="n">call</span><span class="o">.</span><span class="n">when</span>
    <span class="n">duration</span> <span class="o">=</span> <span class="n">call</span><span class="o">.</span><span class="n">stop</span><span class="o">-</span><span class="n">call</span><span class="o">.</span><span class="n">start</span>
    <span class="n">keywords</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">([(</span><span class="n">x</span><span class="p">,</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="n">item</span><span class="o">.</span><span class="n">keywords</span><span class="p">])</span>
    <span class="n">excinfo</span> <span class="o">=</span> <span class="n">call</span><span class="o">.</span><span class="n">excinfo</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">call</span><span class="o">.</span><span class="n">excinfo</span><span class="p">:</span>
        <span class="n">outcome</span> <span class="o">=</span> <span class="s">&quot;passed&quot;</span>
        <span class="n">longrepr</span> <span class="o">=</span> <span class="bp">None</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">excinfo</span> <span class="o">=</span> <span class="n">call</span><span class="o">.</span><span class="n">excinfo</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">excinfo</span><span class="p">,</span> <span class="n">py</span><span class="o">.</span><span class="n">code</span><span class="o">.</span><span class="n">ExceptionInfo</span><span class="p">):</span>
            <span class="n">outcome</span> <span class="o">=</span> <span class="s">&quot;failed&quot;</span>
            <span class="n">longrepr</span> <span class="o">=</span> <span class="n">excinfo</span>
        <span class="k">elif</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">errisinstance</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">skip</span><span class="o">.</span><span class="n">Exception</span><span class="p">):</span>
            <span class="n">outcome</span> <span class="o">=</span> <span class="s">&quot;skipped&quot;</span>
            <span class="n">r</span> <span class="o">=</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">_getreprcrash</span><span class="p">()</span>
            <span class="n">longrepr</span> <span class="o">=</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">path</span><span class="p">),</span> <span class="n">r</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">outcome</span> <span class="o">=</span> <span class="s">&quot;failed&quot;</span>
            <span class="k">if</span> <span class="n">call</span><span class="o">.</span><span class="n">when</span> <span class="o">==</span> <span class="s">&quot;call&quot;</span><span class="p">:</span>
                <span class="n">longrepr</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">repr_failure</span><span class="p">(</span><span class="n">excinfo</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span> <span class="c"># exception in setup or teardown</span>
                <span class="n">longrepr</span> <span class="o">=</span> <span class="n">item</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="k">return</span> <span class="n">TestReport</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">nodeid</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">location</span><span class="p">,</span>
                      <span class="n">keywords</span><span class="p">,</span> <span class="n">outcome</span><span class="p">,</span> <span class="n">longrepr</span><span class="p">,</span> <span class="n">when</span><span class="p">,</span>
                      <span class="n">duration</span><span class="o">=</span><span class="n">duration</span><span class="p">)</span>

<div class="viewcode-block" id="TestReport"><a class="viewcode-back" href="../../plugins.html#_pytest.runner.TestReport">[docs]</a><span class="k">class</span> <span class="nc">TestReport</span><span class="p">(</span><span class="n">BaseReport</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Basic test report object (also used for setup and teardown calls if</span>
<span class="sd">    they fail).</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nodeid</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span>
            <span class="n">keywords</span><span class="p">,</span> <span class="n">outcome</span><span class="p">,</span> <span class="n">longrepr</span><span class="p">,</span> <span class="n">when</span><span class="p">,</span> <span class="n">sections</span><span class="o">=</span><span class="p">(),</span> <span class="n">duration</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span>
        <span class="c">#: normalized collection node id</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">nodeid</span> <span class="o">=</span> <span class="n">nodeid</span>

        <span class="c">#: a (filesystempath, lineno, domaininfo) tuple indicating the</span>
        <span class="c">#: actual location of a test item - it might be different from the</span>
        <span class="c">#: collected one e.g. if a method is inherited from a different module.</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="c">#: a name -&gt; value dictionary containing all keywords and</span>
        <span class="c">#: markers associated with a test invocation.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="n">keywords</span>

        <span class="c">#: test outcome, always one of &quot;passed&quot;, &quot;failed&quot;, &quot;skipped&quot;.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">outcome</span> <span class="o">=</span> <span class="n">outcome</span>

        <span class="c">#: None or a failure representation.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">longrepr</span> <span class="o">=</span> <span class="n">longrepr</span>

        <span class="c">#: one of &#39;setup&#39;, &#39;call&#39;, &#39;teardown&#39; to indicate runtest phase.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">when</span> <span class="o">=</span> <span class="n">when</span>

        <span class="c">#: list of (secname, data) extra information which needs to</span>
        <span class="c">#: marshallable</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">sections</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">sections</span><span class="p">)</span>

        <span class="c">#: time it took to run just the test</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">duration</span> <span class="o">=</span> <span class="n">duration</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s">&quot;&lt;TestReport </span><span class="si">%r</span><span class="s"> when=</span><span class="si">%r</span><span class="s"> outcome=</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">nodeid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">when</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">outcome</span><span class="p">)</span>
</div>
<span class="k">class</span> <span class="nc">TeardownErrorReport</span><span class="p">(</span><span class="n">BaseReport</span><span class="p">):</span>
    <span class="n">outcome</span> <span class="o">=</span> <span class="s">&quot;failed&quot;</span>
    <span class="n">when</span> <span class="o">=</span> <span class="s">&quot;teardown&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">longrepr</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">longrepr</span> <span class="o">=</span> <span class="n">longrepr</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">sections</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">pytest_make_collect_report</span><span class="p">(</span><span class="n">collector</span><span class="p">):</span>
    <span class="n">call</span> <span class="o">=</span> <span class="n">CallInfo</span><span class="p">(</span><span class="n">collector</span><span class="o">.</span><span class="n">_memocollect</span><span class="p">,</span> <span class="s">&quot;memocollect&quot;</span><span class="p">)</span>
    <span class="n">longrepr</span> <span class="o">=</span> <span class="bp">None</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">call</span><span class="o">.</span><span class="n">excinfo</span><span class="p">:</span>
        <span class="n">outcome</span> <span class="o">=</span> <span class="s">&quot;passed&quot;</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">call</span><span class="o">.</span><span class="n">excinfo</span><span class="o">.</span><span class="n">errisinstance</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">skip</span><span class="o">.</span><span class="n">Exception</span><span class="p">):</span>
            <span class="n">outcome</span> <span class="o">=</span> <span class="s">&quot;skipped&quot;</span>
            <span class="n">r</span> <span class="o">=</span> <span class="n">collector</span><span class="o">.</span><span class="n">_repr_failure_py</span><span class="p">(</span><span class="n">call</span><span class="o">.</span><span class="n">excinfo</span><span class="p">,</span> <span class="s">&quot;line&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">reprcrash</span>
            <span class="n">longrepr</span> <span class="o">=</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">path</span><span class="p">),</span> <span class="n">r</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">outcome</span> <span class="o">=</span> <span class="s">&quot;failed&quot;</span>
            <span class="n">errorinfo</span> <span class="o">=</span> <span class="n">collector</span><span class="o">.</span><span class="n">repr_failure</span><span class="p">(</span><span class="n">call</span><span class="o">.</span><span class="n">excinfo</span><span class="p">)</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">errorinfo</span><span class="p">,</span> <span class="s">&quot;toterminal&quot;</span><span class="p">):</span>
                <span class="n">errorinfo</span> <span class="o">=</span> <span class="n">CollectErrorRepr</span><span class="p">(</span><span class="n">errorinfo</span><span class="p">)</span>
            <span class="n">longrepr</span> <span class="o">=</span> <span class="n">errorinfo</span>
    <span class="k">return</span> <span class="n">CollectReport</span><span class="p">(</span><span class="n">collector</span><span class="o">.</span><span class="n">nodeid</span><span class="p">,</span> <span class="n">outcome</span><span class="p">,</span> <span class="n">longrepr</span><span class="p">,</span>
        <span class="nb">getattr</span><span class="p">(</span><span class="n">call</span><span class="p">,</span> <span class="s">&#39;result&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span>

<span class="k">class</span> <span class="nc">CollectReport</span><span class="p">(</span><span class="n">BaseReport</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">nodeid</span><span class="p">,</span> <span class="n">outcome</span><span class="p">,</span> <span class="n">longrepr</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">sections</span><span class="o">=</span><span class="p">(),</span> <span class="o">**</span><span class="n">extra</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">nodeid</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">outcome</span> <span class="o">=</span> <span class="n">outcome</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">longrepr</span> <span class="o">=</span> <span class="n">longrepr</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">result</span> <span class="o">=</span> <span class="n">result</span> <span class="ow">or</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">sections</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">sections</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra</span><span class="p">)</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">return</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">None</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">__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;CollectReport </span><span class="si">%r</span><span class="s"> lenresult=</span><span class="si">%s</span><span class="s"> outcome=</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">nodeid</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">outcome</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">CollectErrorRepr</span><span class="p">(</span><span class="n">TerminalRepr</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">longrepr</span> <span class="o">=</span> <span class="n">msg</span>
    <span class="k">def</span> <span class="nf">toterminal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">out</span><span class="p">):</span>
        <span class="n">out</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">longrepr</span><span class="p">),</span> <span class="n">red</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">SetupState</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; shared state for setting up/tearing down test items or collectors. &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="bp">self</span><span class="o">.</span><span class="n">stack</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_finalizers</span> <span class="o">=</span> <span class="p">{}</span>

    <span class="k">def</span> <span class="nf">addfinalizer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">finalizer</span><span class="p">,</span> <span class="n">colitem</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; attach a finalizer to the given colitem.</span>
<span class="sd">        if colitem is None, this will add a finalizer that</span>
<span class="sd">        is called at the end of teardown_all().</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">finalizer</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">)</span>
        <span class="c">#assert colitem in self.stack</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_finalizers</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">colitem</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">finalizer</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_pop_and_teardown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">colitem</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_teardown_with_finalization</span><span class="p">(</span><span class="n">colitem</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_callfinalizers</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">colitem</span><span class="p">):</span>
        <span class="n">finalizers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_finalizers</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">colitem</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
        <span class="k">while</span> <span class="n">finalizers</span><span class="p">:</span>
            <span class="n">fin</span> <span class="o">=</span> <span class="n">finalizers</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
            <span class="n">fin</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">_teardown_with_finalization</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">colitem</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_callfinalizers</span><span class="p">(</span><span class="n">colitem</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">colitem</span><span class="p">:</span>
            <span class="n">colitem</span><span class="o">.</span><span class="n">teardown</span><span class="p">()</span>
        <span class="k">for</span> <span class="n">colitem</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_finalizers</span><span class="p">:</span>
            <span class="k">assert</span> <span class="n">colitem</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">colitem</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span>

    <span class="k">def</span> <span class="nf">teardown_all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_pop_and_teardown</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_teardown_with_finalization</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
        <span class="k">assert</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_finalizers</span>

    <span class="k">def</span> <span class="nf">teardown_exact</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">nextitem</span><span class="p">):</span>
        <span class="n">needed_collectors</span> <span class="o">=</span> <span class="n">nextitem</span> <span class="ow">and</span> <span class="n">nextitem</span><span class="o">.</span><span class="n">listchain</span><span class="p">()</span> <span class="ow">or</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_teardown_towards</span><span class="p">(</span><span class="n">needed_collectors</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_teardown_towards</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">needed_collectors</span><span class="p">):</span>
        <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">:</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span> <span class="o">==</span> <span class="n">needed_collectors</span><span class="p">[:</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)]:</span>
                <span class="k">break</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_pop_and_teardown</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">prepare</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">colitem</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; setup objects along the collector chain to the test-method</span>
<span class="sd">            and teardown previously setup objects.&quot;&quot;&quot;</span>
        <span class="n">needed_collectors</span> <span class="o">=</span> <span class="n">colitem</span><span class="o">.</span><span class="n">listchain</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_teardown_towards</span><span class="p">(</span><span class="n">needed_collectors</span><span class="p">)</span>

        <span class="c"># check if the last collection node has raised an error</span>
        <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="s">&#39;_prepare_exc&#39;</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="o">*</span><span class="n">col</span><span class="o">.</span><span class="n">_prepare_exc</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">needed_collectors</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">):]:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">col</span><span class="p">)</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">col</span><span class="o">.</span><span class="n">setup</span><span class="p">()</span>
            <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
                <span class="n">col</span><span class="o">.</span><span class="n">_prepare_exc</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="k">raise</span>

<span class="c"># =============================================================</span>
<span class="c"># Test OutcomeExceptions and helpers for creating them.</span>


<span class="k">class</span> <span class="nc">OutcomeException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; OutcomeException and its subclass instances indicate and</span>
<span class="sd">        contain info about test and collection outcomes.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">pytrace</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">msg</span> <span class="o">=</span> <span class="n">msg</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">pytrace</span> <span class="o">=</span> <span class="n">pytrace</span>

    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">:</span>
            <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">)</span>
        <span class="k">return</span> <span class="s">&quot;&lt;</span><span class="si">%s</span><span class="s"> instance&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="n">__str__</span> <span class="o">=</span> <span class="n">__repr__</span>

<span class="k">class</span> <span class="nc">Skipped</span><span class="p">(</span><span class="n">OutcomeException</span><span class="p">):</span>
    <span class="c"># XXX hackish: on 3k we fake to live in the builtins</span>
    <span class="c"># in order to have Skipped exception printing shorter/nicer</span>
    <span class="n">__module__</span> <span class="o">=</span> <span class="s">&#39;builtins&#39;</span>

<span class="k">class</span> <span class="nc">Failed</span><span class="p">(</span><span class="n">OutcomeException</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; raised from an explicit call to py.test.fail() &quot;&quot;&quot;</span>
    <span class="n">__module__</span> <span class="o">=</span> <span class="s">&#39;builtins&#39;</span>

<span class="k">class</span> <span class="nc">Exit</span><span class="p">(</span><span class="ne">KeyboardInterrupt</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; raised for immediate program exits (no tracebacks/summaries)&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">msg</span><span class="o">=</span><span class="s">&quot;unknown reason&quot;</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span>
        <span class="ne">KeyboardInterrupt</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>

<span class="c"># exposed helper methods</span>

<span class="k">def</span> <span class="nf">exit</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; exit testing process as if KeyboardInterrupt was triggered. &quot;&quot;&quot;</span>
    <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="k">raise</span> <span class="n">Exit</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>

<span class="nb">exit</span><span class="o">.</span><span class="n">Exception</span> <span class="o">=</span> <span class="n">Exit</span>

<span class="k">def</span> <span class="nf">skip</span><span class="p">(</span><span class="n">msg</span><span class="o">=</span><span class="s">&quot;&quot;</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; skip an executing test with the given message.  Note: it&#39;s usually</span>
<span class="sd">    better to use the py.test.mark.skipif marker to declare a test to be</span>
<span class="sd">    skipped under certain conditions like mismatching platforms or</span>
<span class="sd">    dependencies.  See the pytest_skipping plugin for details.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="k">raise</span> <span class="n">Skipped</span><span class="p">(</span><span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">)</span>
<span class="n">skip</span><span class="o">.</span><span class="n">Exception</span> <span class="o">=</span> <span class="n">Skipped</span>

<span class="k">def</span> <span class="nf">fail</span><span class="p">(</span><span class="n">msg</span><span class="o">=</span><span class="s">&quot;&quot;</span><span class="p">,</span> <span class="n">pytrace</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; explicitely fail an currently-executing test with the given Message.</span>
<span class="sd">    if @pytrace is not True the msg represents the full failure information.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="k">raise</span> <span class="n">Failed</span><span class="p">(</span><span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">,</span> <span class="n">pytrace</span><span class="o">=</span><span class="n">pytrace</span><span class="p">)</span>
<span class="n">fail</span><span class="o">.</span><span class="n">Exception</span> <span class="o">=</span> <span class="n">Failed</span>


<span class="k">def</span> <span class="nf">importorskip</span><span class="p">(</span><span class="n">modname</span><span class="p">,</span> <span class="n">minversion</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; return imported module if it has a higher __version__ than the</span>
<span class="sd">    optionally specified &#39;minversion&#39; - otherwise call py.test.skip()</span>
<span class="sd">    with a message detailing the mismatch.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">__tracebackhide__</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="nb">compile</span><span class="p">(</span><span class="n">modname</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="s">&#39;eval&#39;</span><span class="p">)</span> <span class="c"># to catch syntaxerrors</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="nb">__import__</span><span class="p">(</span><span class="n">modname</span><span class="p">)</span>
    <span class="k">except</span> <span class="ne">ImportError</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">skip</span><span class="p">(</span><span class="s">&quot;could not import </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span><span class="p">(</span><span class="n">modname</span><span class="p">,))</span>
    <span class="n">mod</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="n">modname</span><span class="p">]</span>
    <span class="k">if</span> <span class="n">minversion</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">mod</span>
    <span class="n">verattr</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="s">&#39;__version__&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">minversion</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
        <span class="n">minver</span> <span class="o">=</span> <span class="n">minversion</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="k">else</span><span class="p">:</span>
        <span class="n">minver</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">minversion</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">verattr</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">verattr</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="o">&lt;</span> <span class="n">minver</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">skip</span><span class="p">(</span><span class="s">&quot;module </span><span class="si">%r</span><span class="s"> has __version__ </span><span class="si">%r</span><span class="s">, required is: </span><span class="si">%r</span><span class="s">&quot;</span> <span class="o">%</span><span class="p">(</span>
                     <span class="n">modname</span><span class="p">,</span> <span class="n">verattr</span><span class="p">,</span> <span class="n">minversion</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">mod</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>