<!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.monkeypatch</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.monkeypatch のソースコード</h1><div class="highlight"><pre> <span class="sd">""" monkeypatching and mocking functionality. """</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">inspect</span> <span class="k">def</span> <span class="nf">pytest_funcarg__monkeypatch</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="sd">"""The returned ``monkeypatch`` funcarg provides these</span> <span class="sd"> helper methods to modify objects, dictionaries or os.environ::</span> <span class="sd"> monkeypatch.setattr(obj, name, value, raising=True)</span> <span class="sd"> monkeypatch.delattr(obj, name, raising=True)</span> <span class="sd"> monkeypatch.setitem(mapping, name, value)</span> <span class="sd"> monkeypatch.delitem(obj, name, raising=True)</span> <span class="sd"> monkeypatch.setenv(name, value, prepend=False)</span> <span class="sd"> monkeypatch.delenv(name, value, raising=True)</span> <span class="sd"> monkeypatch.syspath_prepend(path)</span> <span class="sd"> monkeypatch.chdir(path)</span> <span class="sd"> All modifications will be undone after the requesting</span> <span class="sd"> test function has finished. The ``raising``</span> <span class="sd"> parameter determines if a KeyError or AttributeError</span> <span class="sd"> will be raised if the set/deletion operation has no target.</span> <span class="sd"> """</span> <span class="n">mpatch</span> <span class="o">=</span> <span class="n">monkeypatch</span><span class="p">()</span> <span class="n">request</span><span class="o">.</span><span class="n">addfinalizer</span><span class="p">(</span><span class="n">mpatch</span><span class="o">.</span><span class="n">undo</span><span class="p">)</span> <span class="k">return</span> <span class="n">mpatch</span> <span class="n">notset</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span> <div class="viewcode-block" id="monkeypatch"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch">[ドキュメント]</a><span class="k">class</span> <span class="nc">monkeypatch</span><span class="p">:</span> <span class="sd">""" object keeping a record of setattr/item/env/syspath changes. """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setattr</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setitem</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cwd</span> <span class="o">=</span> <span class="bp">None</span> <div class="viewcode-block" id="monkeypatch.setattr"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.setattr">[ドキュメント]</a> <span class="k">def</span> <span class="nf">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">raising</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span> <span class="sd">""" set attribute ``name`` on ``obj`` to ``value``, by default</span> <span class="sd"> raise AttributeEror if the attribute did not exist. """</span> <span class="n">oldval</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">notset</span><span class="p">)</span> <span class="k">if</span> <span class="n">raising</span> <span class="ow">and</span> <span class="n">oldval</span> <span class="ow">is</span> <span class="n">notset</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s">"</span><span class="si">%r</span><span class="s"> has no attribute </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span> <span class="c"># avoid class descriptors like staticmethod/classmethod</span> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> <span class="n">oldval</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">notset</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setattr</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="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">oldval</span><span class="p">))</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> </div> <div class="viewcode-block" id="monkeypatch.delattr"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.delattr">[ドキュメント]</a> <span class="k">def</span> <span class="nf">delattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">raising</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span> <span class="sd">""" delete attribute ``name`` from ``obj``, by default raise</span> <span class="sd"> AttributeError it the attribute did not previously exist. """</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="k">if</span> <span class="n">raising</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setattr</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="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">notset</span><span class="p">)))</span> <span class="nb">delattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> </div> <div class="viewcode-block" id="monkeypatch.setitem"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.setitem">[ドキュメント]</a> <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">dic</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="sd">""" set dictionary entry ``name`` to value. """</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setitem</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="p">(</span><span class="n">dic</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">dic</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">notset</span><span class="p">)))</span> <span class="n">dic</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span> </div> <div class="viewcode-block" id="monkeypatch.delitem"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.delitem">[ドキュメント]</a> <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">dic</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">raising</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span> <span class="sd">""" delete ``name`` from dict, raise KeyError if it doesn't exist."""</span> <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">dic</span><span class="p">:</span> <span class="k">if</span> <span class="n">raising</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setitem</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="p">(</span><span class="n">dic</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">dic</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">notset</span><span class="p">)))</span> <span class="k">del</span> <span class="n">dic</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> </div> <div class="viewcode-block" id="monkeypatch.setenv"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.setenv">[ドキュメント]</a> <span class="k">def</span> <span class="nf">setenv</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">value</span><span class="p">,</span> <span class="n">prepend</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="sd">""" set environment variable ``name`` to ``value``. if ``prepend``</span> <span class="sd"> is a character, read the current environment variable value</span> <span class="sd"> and prepend the ``value`` adjoined with the ``prepend`` character."""</span> <span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">if</span> <span class="n">prepend</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span> <span class="n">value</span> <span class="o">=</span> <span class="n">value</span> <span class="o">+</span> <span class="n">prepend</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="bp">self</span><span class="o">.</span><span class="n">setitem</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> </div> <div class="viewcode-block" id="monkeypatch.delenv"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.delenv">[ドキュメント]</a> <span class="k">def</span> <span class="nf">delenv</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">raising</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span> <span class="sd">""" delete ``name`` from environment, raise KeyError it not exists."""</span> <span class="bp">self</span><span class="o">.</span><span class="n">delitem</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">raising</span><span class="o">=</span><span class="n">raising</span><span class="p">)</span> </div> <div class="viewcode-block" id="monkeypatch.syspath_prepend"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.syspath_prepend">[ドキュメント]</a> <span class="k">def</span> <span class="nf">syspath_prepend</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="sd">""" prepend ``path`` to ``sys.path`` list of import locations. """</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'_savesyspath'</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_savesyspath</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">[:]</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</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="nb">str</span><span class="p">(</span><span class="n">path</span><span class="p">))</span> </div> <div class="viewcode-block" id="monkeypatch.chdir"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.chdir">[ドキュメント]</a> <span class="k">def</span> <span class="nf">chdir</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="sd">""" change the current working directory to the specified path</span> <span class="sd"> path can be a string or a py.path.local object</span> <span class="sd"> """</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cwd</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cwd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"chdir"</span><span class="p">):</span> <span class="n">path</span><span class="o">.</span><span class="n">chdir</span><span class="p">()</span> <span class="k">else</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> </div> <div class="viewcode-block" id="monkeypatch.undo"><a class="viewcode-back" href="../../monkeypatch.html#_pytest.monkeypatch.monkeypatch.undo">[ドキュメント]</a> <span class="k">def</span> <span class="nf">undo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" undo previous changes. This call consumes the</span> <span class="sd"> undo stack. Calling it a second time has no effect unless</span> <span class="sd"> you do more monkeypatching after the undo call."""</span> <span class="k">for</span> <span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setattr</span><span class="p">:</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">notset</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="nb">delattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setattr</span><span class="p">[:]</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">dictionary</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setitem</span><span class="p">:</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="n">notset</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="k">del</span> <span class="n">dictionary</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">pass</span> <span class="c"># was already deleted, so we have the desired state</span> <span class="k">else</span><span class="p">:</span> <span class="n">dictionary</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setitem</span><span class="p">[:]</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'_savesyspath'</span><span class="p">):</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">[:]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_savesyspath</span> <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_savesyspath</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cwd</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_cwd</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cwd</span> <span class="o">=</span> <span class="bp">None</span></div></div> </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>