<!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.0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../../_static/jquery.js"></script> <script type="text/javascript" src="../../_static/underscore.js"></script> <script type="text/javascript" src="../../_static/doctools.js"></script> <script type="text/javascript" src="../../_static/translations.js"></script> <link rel="top" title="None" href="../../index.html" /> <link rel="up" title="モジュールコード" href="../index.html" /> </head> <body> <div class="related"> <h3>ナビゲーション</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../py-modindex.html" title="Pythonモジュール索引" >モジュール</a></li> <li><a href="../../contents.html">pytest-2.2.4.0</a> »</li> <li><a href="../index.html" accesskey="U">モジュールコード</a> »</li> </ul> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <div id="searchbox" style="display: none"> <h3>クイック検索</h3> <form class="search" action="../../search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="検索" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> モジュール、クラス、または関数名を入力してください </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <h1>_pytest.main のソースコード</h1><div class="highlight"><pre> <span class="sd">""" core implementation of testing process: init, session, runtest loop. """</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">inspect</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="k">try</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">MutableMapping</span> <span class="k">as</span> <span class="n">MappingMixin</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">UserDict</span> <span class="kn">import</span> <span class="n">DictMixin</span> <span class="k">as</span> <span class="n">MappingMixin</span> <span class="kn">from</span> <span class="nn">_pytest.mark</span> <span class="kn">import</span> <span class="n">MarkInfo</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">"^[a-zA-Z_]\w*$"</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">"norecursedirs"</span><span class="p">,</span> <span class="s">"directory patterns to avoid for recursion"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">"args"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">(</span><span class="s">'.*'</span><span class="p">,</span> <span class="s">'CVS'</span><span class="p">,</span> <span class="s">'_darcs'</span><span class="p">,</span> <span class="s">'{arch}'</span><span class="p">))</span> <span class="c">#parser.addini("dirpatterns",</span> <span class="c"># "patterns specifying possible locations of test files",</span> <span class="c"># type="linelist", default=["**/test_*.txt",</span> <span class="c"># "**/test_*.py", "**/*_test.py"]</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">"general"</span><span class="p">,</span> <span class="s">"running and selection options"</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">'-x'</span><span class="p">,</span> <span class="s">'--exitfirst'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">"store_true"</span><span class="p">,</span> <span class="n">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">"exitfirst"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">"exit instantly on first error or failed test."</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">'--maxfail'</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">"num"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">"store"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s">"int"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">"maxfail"</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">"exit after first num failures or errors."</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">'--strict'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">"store_true"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">"run pytest in strict mode, warnings become errors."</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">"collect"</span><span class="p">,</span> <span class="s">"collection"</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">'--collectonly'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">"store_true"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">"collectonly"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">"only collect tests, don't execute them."</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">'--pyargs'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">"store_true"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">"try to interpret all arguments as python packages."</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">"--ignore"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">"append"</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s">"path"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">"ignore path during collection (multi-allowed)."</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">'--confcutdir'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">"confcutdir"</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">"dir"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">"only load conftest.py's relative to specified dir."</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">"debugconfig"</span><span class="p">,</span> <span class="s">"test session debugging and configuration"</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">'--basetemp'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">"basetemp"</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">"dir"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s">"base temporary directory for this test run."</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">"""Skeleton command line program"""</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">"ERROR: </span><span class="si">%s</span><span class="se">\n</span><span class="s">"</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">"mainloop: caught Spurious SystemExit!</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</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">finally</span><span class="p">:</span> <span class="k">if</span> <span class="n">initstate</span> <span class="o">>=</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="p">)</span> <span class="k">if</span> <span class="n">initstate</span> <span class="o">>=</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">""" default command line protocol for initialization, session,</span> <span class="sd"> running tests and reporting. """</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">def</span> <span class="nf">getnextitem</span><span class="p">(</span><span class="n">i</span><span class="p">):</span> <span class="c"># this is a function to avoid python2</span> <span class="c"># keeping sys.exc_info set when calling into a test</span> <span class="c"># python2 keeps sys.exc_info till the frame is left</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</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="k">return</span> <span class="bp">None</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="n">nextitem</span> <span class="o">=</span> <span class="n">getnextitem</span><span class="p">(</span><span class="n">i</span><span class="p">)</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">"collect_ignore"</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">"ignore"</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="c"># deprecated - use pytest.name</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="k">class</span> <span class="nc">NodeKeywords</span><span class="p">(</span><span class="n">MappingMixin</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">node</span><span class="p">):</span> <span class="n">parent</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">parent</span> <span class="n">bases</span> <span class="o">=</span> <span class="n">parent</span> <span class="ow">and</span> <span class="p">(</span><span class="n">parent</span><span class="o">.</span><span class="n">keywords</span><span class="o">.</span><span class="n">_markers</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">_markers</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="s">"dynmarker"</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="p">{</span><span class="n">node</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="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_markers</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_markers</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> <span class="nb">delattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_markers</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">dir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_markers</span><span class="p">)</span> <div class="viewcode-block" id="Node"><a class="viewcode-back" href="../../plugins.html#_pytest.main.Node">[ドキュメント]</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">""" base class for Collector and Item the test collection tree.</span> <span class="sd"> Collector subclasses have children, Items are terminal nodes."""</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 within the scope of the parent node</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 pytest 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 session 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 (can be None)</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">'fspath'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="c">#: keywords/markers collected from all scopes</span> <span class="bp">self</span><span class="o">.</span><span class="n">keywords</span> <span class="o">=</span> <span class="n">NodeKeywords</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="c">#self.extrainit()</span> <span class="nd">@property</span> <div class="viewcode-block" id="Node.ihook"><a class="viewcode-back" href="../../plugins.html#_pytest.main.Node.ihook">[ドキュメント]</a> <span class="k">def</span> <span class="nf">ihook</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" fspath sensitive hook proxy used to call pytest hooks"""</span> <span class="k">return</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="c">#def extrainit(self):</span> <span class="c"># """"extra initialization after Node is initialized. Implemented</span> <span class="c"># by some subclasses. """</span> </div> <span class="n">Module</span> <span class="o">=</span> <span class="n">compatproperty</span><span class="p">(</span><span class="s">"Module"</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">"Class"</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">"Instance"</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">"Function"</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">"File"</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">"Item"</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">"2.0"</span><span class="p">,</span> <span class="s">"use of node.</span><span class="si">%s</span><span class="s"> is deprecated, "</span> <span class="s">"use pytest_pycollect_makeitem(...) to create custom "</span> <span class="s">"collection nodes"</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">"<</span><span class="si">%s</span><span class="s"> </span><span class="si">%r</span><span class="s">>"</span> <span class="o">%</span><span class="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">'name'</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> <div class="viewcode-block" id="Node.nodeid"><a class="viewcode-back" href="../../plugins.html#_pytest.main.Node.nodeid">[ドキュメント]</a> <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="sd">""" a ::-separated string denoting its collection tree address. """</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> </div> <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">"::"</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="p">(</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="p">)</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">"_ex_"</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">[ドキュメント]</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">""" return list of all parent collectors up to self,</span> <span class="sd"> starting from root of collection tree. """</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="n">fm</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_fixturemanager</span> <span class="k">if</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">errisinstance</span><span class="p">(</span><span class="n">fm</span><span class="o">.</span><span class="n">FixtureLookupError</span><span class="p">):</span> <span class="k">return</span> <span class="n">excinfo</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">formatrepr</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">"long"</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">"short"</span><span class="p">:</span> <span class="n">style</span> <span class="o">=</span> <span class="s">"short"</span> <span class="k">else</span><span class="p">:</span> <span class="n">style</span> <span class="o">=</span> <span class="s">"long"</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">""" Collector instances create children through collect()</span> <span class="sd"> and thus iteratively build a tree.</span> <span class="sd"> """</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">""" an error during collection, contains a custom message. """</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">""" returns a list of children (items and collectors)</span> <span class="sd"> for this collection node.</span> <span class="sd"> """</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">"abstract"</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">""" represent a collection failure. """</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">"short"</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">""" internal helper method to cache results of calling collect(). """</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">'_collected'</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">'fspath'</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">"/"</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">"."</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">"/"</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">"/"</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">""" base class for collecting tests from a file. """</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">""" 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"> """</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">""</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">"_bestrelpathcache"</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">""" raised if matching cannot locate a matching names. """</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">""" signals an interrupted test run. """</span> <span class="n">__module__</span> <span class="o">=</span> <span class="s">'builtins'</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="n">FSCollector</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">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="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">"session"</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">"collection"</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">"norecursedirs"</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="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">report</span><span class="p">,</span> <span class="s">'wasxfail'</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">"maxfail"</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">>=</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">"stopping after </span><span class="si">%d</span><span class="s"> failures"</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">"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="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">"(no name </span><span class="si">%r</span><span class="s"> in any of </span><span class="si">%r</span><span class="s">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="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">"not found: </span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span><span class="p">(</span><span class="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">"::"</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">"processing argument"</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">"invalid arg </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span><span class="p">(</span><span class="n">arg</span><span class="p">,)</span> <span class="k">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">'.'</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">'.'</span><span class="p">):</span> <span class="c"># ignore anything that's not a proper name here</span> <span class="c"># else something like --pyargs will mess up '.'</span> <span class="c"># since imp.find_module will actually sometimes work for it</span> <span class="c"># but it'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">""" return (fspath, names) tuple after checking the file exists. """</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">"::"</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">"/"</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">"file or package not found: "</span> <span class="k">else</span><span class="p">:</span> <span class="n">msg</span> <span class="o">=</span> <span class="s">"file not found: "</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">"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="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">"matchnodes finished -> "</span><span class="p">,</span> <span class="n">num</span><span class="p">,</span> <span class="s">"nodes"</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't have "()" 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">"()"</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">"genitems"</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> <span class="k">def</span> <span class="nf">getfslineno</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="c"># xxx let decorators etc specify a sane ordering</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s">'place_as'</span><span class="p">):</span> <span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">place_as</span> <span class="n">fslineno</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">getfslineno</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fslineno</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nb">int</span><span class="p">),</span> <span class="n">obj</span> <span class="k">return</span> <span class="n">fslineno</span> </pre></div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>ナビゲーション</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../py-modindex.html" title="Pythonモジュール索引" >モジュール</a></li> <li><a href="../../contents.html">pytest-2.2.4.0</a> »</li> <li><a href="../index.html" >モジュールコード</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, holger krekel et alii. このドキュメントは <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3 で生成しました。 </div> </body> </html>