mirror of
https://github.com/evennia/evennia.git
synced 2026-03-20 14:56:30 +01:00
3299 lines
No EOL
422 KiB
HTML
3299 lines
No EOL
422 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>mock.mock — Evennia latest documentation</title>
|
|
<link rel="stylesheet" href="../../_static/nature.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d75fae25" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/nature.css?v=245aff17" />
|
|
<script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
|
|
<script src="../../_static/documentation_options.js?v=c6e86fd7"></script>
|
|
<script src="../../_static/doctools.js?v=9bcbadda"></script>
|
|
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
|
<link rel="index" title="Index" href="../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../search.html" />
|
|
</head><body>
|
|
|
|
|
|
|
|
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../index.html">Evennia latest</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">mock.mock</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
|
|
<div class="documentwrapper">
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<search id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</search>
|
|
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
|
|
<ul>
|
|
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
|
|
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
|
|
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
|
|
<li><a href="http://games.evennia.com">Game Index</a> </li>
|
|
<li>
|
|
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
|
|
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
|
|
<a href="https://evennia.blogspot.com/">Blog</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for mock.mock</h1><div class="highlight"><pre>
|
|
<span></span><span class="c1"># mock.py</span>
|
|
<span class="c1"># Test tools for mocking and patching.</span>
|
|
<span class="c1"># Maintained by Michael Foord</span>
|
|
<span class="c1"># Backport for other versions of Python available from</span>
|
|
<span class="c1"># https://pypi.org/project/mock</span>
|
|
|
|
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="s1">'Mock'</span><span class="p">,</span>
|
|
<span class="s1">'MagicMock'</span><span class="p">,</span>
|
|
<span class="s1">'patch'</span><span class="p">,</span>
|
|
<span class="s1">'sentinel'</span><span class="p">,</span>
|
|
<span class="s1">'DEFAULT'</span><span class="p">,</span>
|
|
<span class="s1">'ANY'</span><span class="p">,</span>
|
|
<span class="s1">'call'</span><span class="p">,</span>
|
|
<span class="s1">'create_autospec'</span><span class="p">,</span>
|
|
<span class="s1">'AsyncMock'</span><span class="p">,</span>
|
|
<span class="s1">'ThreadingMock'</span><span class="p">,</span>
|
|
<span class="s1">'FILTER_DIR'</span><span class="p">,</span>
|
|
<span class="s1">'NonCallableMock'</span><span class="p">,</span>
|
|
<span class="s1">'NonCallableMagicMock'</span><span class="p">,</span>
|
|
<span class="s1">'mock_open'</span><span class="p">,</span>
|
|
<span class="s1">'PropertyMock'</span><span class="p">,</span>
|
|
<span class="s1">'seal'</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">asyncio</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">contextlib</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">io</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">inspect</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">pprint</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">threading</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">builtins</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">types</span><span class="w"> </span><span class="kn">import</span> <span class="n">CodeType</span><span class="p">,</span> <span class="n">ModuleType</span><span class="p">,</span> <span class="n">MethodType</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">unittest.util</span><span class="w"> </span><span class="kn">import</span> <span class="n">safe_repr</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">functools</span><span class="w"> </span><span class="kn">import</span> <span class="n">wraps</span><span class="p">,</span> <span class="n">partial</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">threading</span><span class="w"> </span><span class="kn">import</span> <span class="n">RLock</span>
|
|
|
|
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">mock</span><span class="w"> </span><span class="kn">import</span> <span class="n">IS_PYPY</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">.backports</span><span class="w"> </span><span class="kn">import</span> <span class="n">iscoroutinefunction</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">InvalidSpecError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Indicates that an invalid value was used as a mock spec."""</span>
|
|
|
|
|
|
<span class="n">_builtins</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">builtins</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'_'</span><span class="p">)}</span>
|
|
|
|
<span class="n">FILTER_DIR</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="c1"># Workaround for issue #12370</span>
|
|
<span class="c1"># Without this, the __class__ properties wouldn't be set correctly</span>
|
|
<span class="n">_safe_super</span> <span class="o">=</span> <span class="nb">super</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_is_async_obj</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">AsyncMock</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</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="s1">'__func__'</span><span class="p">):</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'__func__'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">or</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isawaitable</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_is_async_func</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="s1">'__code__'</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_is_instance_mock</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="c1"># can't use isinstance on Mock objects because they override __class__</span>
|
|
<span class="c1"># The base class for all mocks is NonCallableMock</span>
|
|
<span class="k">return</span> <span class="nb">issubclass</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span> <span class="n">NonCallableMock</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_is_exception</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">(</span>
|
|
<span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="ne">BaseException</span><span class="p">)</span> <span class="ow">or</span>
|
|
<span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="ne">BaseException</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_extract_mock</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="c1"># Autospecced functions will return a FunctionType with "mock" attribute</span>
|
|
<span class="c1"># which is the actual mock object that needs to be used.</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">FunctionTypes</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'mock'</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">obj</span><span class="o">.</span><span class="n">mock</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">obj</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_signature_object</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">as_instance</span><span class="p">,</span> <span class="n">eat_self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Given an arbitrary, possibly callable object, try to create a suitable</span>
|
|
<span class="sd"> signature object.</span>
|
|
<span class="sd"> Return a (reduced func, signature) tuple, or None.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">as_instance</span><span class="p">:</span>
|
|
<span class="c1"># If it's a type and should be modelled as a type, use __init__.</span>
|
|
<span class="n">func</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="fm">__init__</span>
|
|
<span class="c1"># Skip the `self` argument in __init__</span>
|
|
<span class="n">eat_self</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="p">(</span><span class="nb">classmethod</span><span class="p">,</span> <span class="nb">staticmethod</span><span class="p">)):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="nb">classmethod</span><span class="p">):</span>
|
|
<span class="c1"># Skip the `cls` argument of a class method</span>
|
|
<span class="n">eat_self</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="c1"># Use the original decorated method to extract the correct function signature</span>
|
|
<span class="n">func</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="vm">__func__</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">FunctionTypes</span><span class="p">):</span>
|
|
<span class="c1"># If we really want to model an instance of the passed type,</span>
|
|
<span class="c1"># __call__ should be looked up, not __init__.</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">func</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="fm">__call__</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">eat_self</span><span class="p">:</span>
|
|
<span class="n">sig_func</span> <span class="o">=</span> <span class="n">partial</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">sig_func</span> <span class="o">=</span> <span class="n">func</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">func</span><span class="p">,</span> <span class="n">inspect</span><span class="o">.</span><span class="n">signature</span><span class="p">(</span><span class="n">sig_func</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
|
<span class="c1"># Certain callable types are not supported by inspect.signature()</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_check_signature</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">mock</span><span class="p">,</span> <span class="n">skipfirst</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="n">sig</span> <span class="o">=</span> <span class="n">_get_signature_object</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">skipfirst</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">sig</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="n">func</span><span class="p">,</span> <span class="n">sig</span> <span class="o">=</span> <span class="n">sig</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">checksig</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="n">sig</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">_copy_func_details</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">checksig</span><span class="p">)</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span><span class="o">.</span><span class="n">_mock_check_sig</span> <span class="o">=</span> <span class="n">checksig</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span><span class="o">.</span><span class="n">__signature__</span> <span class="o">=</span> <span class="n">sig</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_copy_func_details</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">funcopy</span><span class="p">):</span>
|
|
<span class="c1"># we explicitly don't copy func.__dict__ into this copy as it would</span>
|
|
<span class="c1"># expose original attributes that should be mocked</span>
|
|
<span class="k">for</span> <span class="n">attribute</span> <span class="ow">in</span> <span class="p">(</span>
|
|
<span class="s1">'__name__'</span><span class="p">,</span> <span class="s1">'__doc__'</span><span class="p">,</span> <span class="s1">'__text_signature__'</span><span class="p">,</span>
|
|
<span class="s1">'__module__'</span><span class="p">,</span> <span class="s1">'__defaults__'</span><span class="p">,</span> <span class="s1">'__kwdefaults__'</span><span class="p">,</span>
|
|
<span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">funcopy</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">attribute</span><span class="p">))</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_callable</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="p">(</span><span class="nb">staticmethod</span><span class="p">,</span> <span class="nb">classmethod</span><span class="p">,</span> <span class="n">MethodType</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="n">_callable</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="vm">__func__</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'__call__'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_is_list</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="c1"># checks for list or tuples</span>
|
|
<span class="c1"># XXXX badly named!</span>
|
|
<span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_instance_callable</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Given an object, return True if the object is callable.</span>
|
|
<span class="sd"> For classes, return True if instances would be callable."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
|
|
<span class="c1"># already an instance</span>
|
|
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">'__call__'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># *could* be broken by a class overriding __mro__ or __dict__ via</span>
|
|
<span class="c1"># a metaclass</span>
|
|
<span class="k">for</span> <span class="n">base</span> <span class="ow">in</span> <span class="p">(</span><span class="n">obj</span><span class="p">,)</span> <span class="o">+</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__mro__</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">base</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'__call__'</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_set_signature</span><span class="p">(</span><span class="n">mock</span><span class="p">,</span> <span class="n">original</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="c1"># creates a function with signature (*args, **kwargs) that delegates to a</span>
|
|
<span class="c1"># mock. It still does signature checking by calling a lambda with the same</span>
|
|
<span class="c1"># signature as the original.</span>
|
|
|
|
<span class="n">skipfirst</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">original</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">_get_signature_object</span><span class="p">(</span><span class="n">original</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">skipfirst</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">mock</span>
|
|
<span class="n">func</span><span class="p">,</span> <span class="n">sig</span> <span class="o">=</span> <span class="n">result</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">checksig</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="n">sig</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">_copy_func_details</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">checksig</span><span class="p">)</span>
|
|
|
|
<span class="n">name</span> <span class="o">=</span> <span class="n">original</span><span class="o">.</span><span class="vm">__name__</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">name</span><span class="o">.</span><span class="n">isidentifier</span><span class="p">():</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="s1">'funcopy'</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'_checksig_'</span><span class="p">:</span> <span class="n">checksig</span><span class="p">,</span> <span class="s1">'mock'</span><span class="p">:</span> <span class="n">mock</span><span class="p">}</span>
|
|
<span class="n">src</span> <span class="o">=</span> <span class="s2">"""def </span><span class="si">%s</span><span class="s2">(*args, **kwargs):</span>
|
|
<span class="s2"> _checksig_(*args, **kwargs)</span>
|
|
<span class="s2"> return mock(*args, **kwargs)"""</span> <span class="o">%</span> <span class="n">name</span>
|
|
<span class="n">exec</span> <span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
|
|
<span class="n">funcopy</span> <span class="o">=</span> <span class="n">context</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
|
|
<span class="n">_setup_func</span><span class="p">(</span><span class="n">funcopy</span><span class="p">,</span> <span class="n">mock</span><span class="p">,</span> <span class="n">sig</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">funcopy</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_set_async_signature</span><span class="p">(</span><span class="n">mock</span><span class="p">,</span> <span class="n">original</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">is_async_mock</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="c1"># creates an async function with signature (*args, **kwargs) that delegates to a</span>
|
|
<span class="c1"># mock. It still does signature checking by calling a lambda with the same</span>
|
|
<span class="c1"># signature as the original.</span>
|
|
|
|
<span class="n">skipfirst</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">original</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
|
|
<span class="n">func</span><span class="p">,</span> <span class="n">sig</span> <span class="o">=</span> <span class="n">_get_signature_object</span><span class="p">(</span><span class="n">original</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">skipfirst</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">checksig</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="n">sig</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">_copy_func_details</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">checksig</span><span class="p">)</span>
|
|
|
|
<span class="n">name</span> <span class="o">=</span> <span class="n">original</span><span class="o">.</span><span class="vm">__name__</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'_checksig_'</span><span class="p">:</span> <span class="n">checksig</span><span class="p">,</span> <span class="s1">'mock'</span><span class="p">:</span> <span class="n">mock</span><span class="p">}</span>
|
|
<span class="n">src</span> <span class="o">=</span> <span class="s2">"""async def </span><span class="si">%s</span><span class="s2">(*args, **kwargs):</span>
|
|
<span class="s2"> _checksig_(*args, **kwargs)</span>
|
|
<span class="s2"> return await mock(*args, **kwargs)"""</span> <span class="o">%</span> <span class="n">name</span>
|
|
<span class="n">exec</span> <span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
|
|
<span class="n">funcopy</span> <span class="o">=</span> <span class="n">context</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
|
|
<span class="n">_setup_func</span><span class="p">(</span><span class="n">funcopy</span><span class="p">,</span> <span class="n">mock</span><span class="p">,</span> <span class="n">sig</span><span class="p">)</span>
|
|
<span class="n">_setup_async_mock</span><span class="p">(</span><span class="n">funcopy</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">funcopy</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_setup_func</span><span class="p">(</span><span class="n">funcopy</span><span class="p">,</span> <span class="n">mock</span><span class="p">,</span> <span class="n">sig</span><span class="p">):</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">mock</span> <span class="o">=</span> <span class="n">mock</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_called_with</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">mock</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_called</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">mock</span><span class="o">.</span><span class="n">assert_called</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_not_called</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">mock</span><span class="o">.</span><span class="n">assert_not_called</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_called_once</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">mock</span><span class="o">.</span><span class="n">assert_called_once</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_called_once_with</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">mock</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_has_calls</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">mock</span><span class="o">.</span><span class="n">assert_has_calls</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_any_call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">mock</span><span class="o">.</span><span class="n">assert_any_call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">reset_mock</span><span class="p">():</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">method_calls</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">mock_calls</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">reset_mock</span><span class="p">()</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="n">funcopy</span><span class="o">.</span><span class="n">return_value</span>
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ret</span> <span class="ow">is</span> <span class="n">mock</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="o">.</span><span class="n">reset_mock</span><span class="p">()</span>
|
|
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">called</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">call_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">call_args</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">call_args_list</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">method_calls</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">mock_calls</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">return_value</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">side_effect</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">_mock_children</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">_mock_children</span>
|
|
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">assert_called_with</span> <span class="o">=</span> <span class="n">assert_called_with</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">assert_called_once_with</span> <span class="o">=</span> <span class="n">assert_called_once_with</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">assert_has_calls</span> <span class="o">=</span> <span class="n">assert_has_calls</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">assert_any_call</span> <span class="o">=</span> <span class="n">assert_any_call</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">reset_mock</span> <span class="o">=</span> <span class="n">reset_mock</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">assert_called</span> <span class="o">=</span> <span class="n">assert_called</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">assert_not_called</span> <span class="o">=</span> <span class="n">assert_not_called</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">assert_called_once</span> <span class="o">=</span> <span class="n">assert_called_once</span>
|
|
<span class="n">funcopy</span><span class="o">.</span><span class="n">__signature__</span> <span class="o">=</span> <span class="n">sig</span>
|
|
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">_mock_delegate</span> <span class="o">=</span> <span class="n">funcopy</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_setup_async_mock</span><span class="p">(</span><span class="n">mock</span><span class="p">):</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">_is_coroutine</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">coroutines</span><span class="o">.</span><span class="n">_is_coroutine</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">await_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">await_args</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">await_args_list</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
|
|
<span class="c1"># Mock is not configured yet so the attributes are set</span>
|
|
<span class="c1"># to a function and then the corresponding mock helper function</span>
|
|
<span class="c1"># is called when the helper is accessed similar to _setup_func.</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">wrapper</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">mock</span><span class="o">.</span><span class="n">mock</span><span class="p">,</span> <span class="n">attr</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">attribute</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'assert_awaited'</span><span class="p">,</span>
|
|
<span class="s1">'assert_awaited_once'</span><span class="p">,</span>
|
|
<span class="s1">'assert_awaited_with'</span><span class="p">,</span>
|
|
<span class="s1">'assert_awaited_once_with'</span><span class="p">,</span>
|
|
<span class="s1">'assert_any_await'</span><span class="p">,</span>
|
|
<span class="s1">'assert_has_awaits'</span><span class="p">,</span>
|
|
<span class="s1">'assert_not_awaited'</span><span class="p">):</span>
|
|
|
|
<span class="c1"># setattr(mock, attribute, wrapper) causes late binding</span>
|
|
<span class="c1"># hence attribute will always be the last value in the loop</span>
|
|
<span class="c1"># Use partial(wrapper, attribute) to ensure the attribute is bound</span>
|
|
<span class="c1"># correctly.</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">mock</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">partial</span><span class="p">(</span><span class="n">wrapper</span><span class="p">,</span> <span class="n">attribute</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_is_magic</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'__</span><span class="si">%s</span><span class="s1">__'</span> <span class="o">%</span> <span class="n">name</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="n">name</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_SentinelObject</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="s2">"A unique, named, sentinel object."</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__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="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'sentinel.</span><span class="si">%s</span><span class="s1">'</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="w"> </span><span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'sentinel.</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_Sentinel</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Access attributes to return a named object, usable as a sentinel."""</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__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">_sentinels</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__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">name</span> <span class="o">==</span> <span class="s1">'__bases__'</span><span class="p">:</span>
|
|
<span class="c1"># Without this help(unittest.mock) raises an exception</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sentinels</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">_SentinelObject</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'sentinel'</span>
|
|
|
|
|
|
<span class="n">sentinel</span> <span class="o">=</span> <span class="n">_Sentinel</span><span class="p">()</span>
|
|
|
|
<span class="n">DEFAULT</span> <span class="o">=</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">DEFAULT</span>
|
|
<span class="n">_missing</span> <span class="o">=</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">MISSING</span>
|
|
<span class="n">_deleted</span> <span class="o">=</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">DELETED</span>
|
|
|
|
|
|
<span class="n">_allowed_names</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'return_value'</span><span class="p">,</span> <span class="s1">'_mock_return_value'</span><span class="p">,</span> <span class="s1">'side_effect'</span><span class="p">,</span>
|
|
<span class="s1">'_mock_side_effect'</span><span class="p">,</span> <span class="s1">'_mock_parent'</span><span class="p">,</span> <span class="s1">'_mock_new_parent'</span><span class="p">,</span>
|
|
<span class="s1">'_mock_name'</span><span class="p">,</span> <span class="s1">'_mock_new_name'</span>
|
|
<span class="p">}</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_delegating_property</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
|
|
<span class="n">_allowed_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="n">_the_name</span> <span class="o">=</span> <span class="s1">'_mock_'</span> <span class="o">+</span> <span class="n">name</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get</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="n">name</span><span class="p">,</span> <span class="n">_the_name</span><span class="o">=</span><span class="n">_the_name</span><span class="p">):</span>
|
|
<span class="n">sig</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_delegate</span>
|
|
<span class="k">if</span> <span class="n">sig</span> <span class="ow">is</span> <span class="kc">None</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">_the_name</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">sig</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">_the_name</span><span class="o">=</span><span class="n">_the_name</span><span class="p">):</span>
|
|
<span class="n">sig</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_delegate</span>
|
|
<span class="k">if</span> <span class="n">sig</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">_the_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">sig</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">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get</span><span class="p">,</span> <span class="n">_set</span><span class="p">)</span>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_CallList</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">list</span><span class="o">.</span><span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
<span class="n">len_value</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
<span class="n">len_self</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">len_value</span> <span class="o">></span> <span class="n">len_self</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">len_self</span> <span class="o">-</span> <span class="n">len_value</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
|
|
<span class="n">sub_list</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="n">len_value</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">sub_list</span> <span class="o">==</span> <span class="n">value</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_check_and_set_parent</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">new_name</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">_extract_mock</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="p">((</span><span class="n">value</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="n">value</span><span class="o">.</span><span class="n">_mock_new_name</span><span class="p">)</span> <span class="ow">or</span>
|
|
<span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">_mock_parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">or</span>
|
|
<span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">_mock_new_parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="n">_parent</span> <span class="o">=</span> <span class="n">parent</span>
|
|
<span class="k">while</span> <span class="n">_parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># setting a mock (value) as a child or return value of itself</span>
|
|
<span class="c1"># should not modify the mock</span>
|
|
<span class="k">if</span> <span class="n">_parent</span> <span class="ow">is</span> <span class="n">value</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="n">_parent</span> <span class="o">=</span> <span class="n">_parent</span><span class="o">.</span><span class="n">_mock_new_parent</span>
|
|
|
|
<span class="k">if</span> <span class="n">new_name</span><span class="p">:</span>
|
|
<span class="n">value</span><span class="o">.</span><span class="n">_mock_new_parent</span> <span class="o">=</span> <span class="n">parent</span>
|
|
<span class="n">value</span><span class="o">.</span><span class="n">_mock_new_name</span> <span class="o">=</span> <span class="n">new_name</span>
|
|
<span class="k">if</span> <span class="n">name</span><span class="p">:</span>
|
|
<span class="n">value</span><span class="o">.</span><span class="n">_mock_parent</span> <span class="o">=</span> <span class="n">parent</span>
|
|
<span class="n">value</span><span class="o">.</span><span class="n">_mock_name</span> <span class="o">=</span> <span class="n">name</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="c1"># Internal class to identify if we wrapped an iterator object or not.</span>
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_MockIter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</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="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__next__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">)</span>
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">Base</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="n">_mock_return_value</span> <span class="o">=</span> <span class="n">DEFAULT</span>
|
|
<span class="n">_mock_side_effect</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">NonCallableMock</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A non-callable version of `Mock`"""</span>
|
|
|
|
<span class="c1"># Store a mutex as a class attribute in order to protect concurrent access</span>
|
|
<span class="c1"># to mock attributes. Using a class attribute allows all NonCallableMock</span>
|
|
<span class="c1"># instances to share the mutex for simplicity.</span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># See https://github.com/python/cpython/issues/98624 for why this is</span>
|
|
<span class="c1"># necessary.</span>
|
|
<span class="n">_lock</span> <span class="o">=</span> <span class="n">RLock</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__new__</span><span class="p">(</span>
|
|
<span class="bp">cls</span><span class="p">,</span> <span class="n">spec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">wraps</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_spec_state</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">_new_parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">_spec_as_instance</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">_eat_self</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">unsafe</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
|
|
<span class="p">):</span>
|
|
<span class="c1"># every instance has its own class</span>
|
|
<span class="c1"># so we can create magic methods on the</span>
|
|
<span class="c1"># class without stomping on other mocks</span>
|
|
<span class="n">bases</span> <span class="o">=</span> <span class="p">(</span><span class="bp">cls</span><span class="p">,)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">AsyncMockMixin</span><span class="p">):</span>
|
|
<span class="c1"># Check if spec is an async object or function</span>
|
|
<span class="n">spec_arg</span> <span class="o">=</span> <span class="n">spec_set</span> <span class="ow">or</span> <span class="n">spec</span>
|
|
<span class="k">if</span> <span class="n">spec_arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">_is_async_obj</span><span class="p">(</span><span class="n">spec_arg</span><span class="p">):</span>
|
|
<span class="n">bases</span> <span class="o">=</span> <span class="p">(</span><span class="n">AsyncMockMixin</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span>
|
|
<span class="n">new</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="p">{</span><span class="s1">'__doc__'</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">})</span>
|
|
<span class="n">instance</span> <span class="o">=</span> <span class="n">_safe_super</span><span class="p">(</span><span class="n">NonCallableMock</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="n">new</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">instance</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="p">,</span> <span class="n">spec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">wraps</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_spec_state</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">_new_parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">_spec_as_instance</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">_eat_self</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">unsafe</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
|
|
<span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">_new_parent</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">_new_parent</span> <span class="o">=</span> <span class="n">parent</span>
|
|
|
|
<span class="vm">__dict__</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_parent'</span><span class="p">]</span> <span class="o">=</span> <span class="n">parent</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_name'</span><span class="p">]</span> <span class="o">=</span> <span class="n">name</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_new_name'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_new_name</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_new_parent'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_new_parent</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_sealed'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
<span class="k">if</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">spec</span> <span class="o">=</span> <span class="n">spec_set</span>
|
|
<span class="n">spec_set</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">if</span> <span class="n">_eat_self</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">_eat_self</span> <span class="o">=</span> <span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_add_spec</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">,</span> <span class="n">_spec_as_instance</span><span class="p">,</span> <span class="n">_eat_self</span><span class="p">)</span>
|
|
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_children'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_wraps'</span><span class="p">]</span> <span class="o">=</span> <span class="n">wraps</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_delegate'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_called'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_call_args'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_call_count'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_call_args_list'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_mock_calls'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'method_calls'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_unsafe'</span><span class="p">]</span> <span class="o">=</span> <span class="n">unsafe</span>
|
|
|
|
<span class="k">if</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">configure_mock</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="n">_safe_super</span><span class="p">(</span><span class="n">NonCallableMock</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
|
|
<span class="n">spec</span><span class="p">,</span> <span class="n">wraps</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span>
|
|
<span class="n">_spec_state</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">attach_mock</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mock</span><span class="p">,</span> <span class="n">attribute</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Attach a mock as an attribute of this one, replacing its name and</span>
|
|
<span class="sd"> parent. Calls to the attached mock will be recorded in the</span>
|
|
<span class="sd"> `method_calls` and `mock_calls` attributes of this one."""</span>
|
|
<span class="n">inner_mock</span> <span class="o">=</span> <span class="n">_extract_mock</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
|
|
|
|
<span class="n">inner_mock</span><span class="o">.</span><span class="n">_mock_parent</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">inner_mock</span><span class="o">.</span><span class="n">_mock_new_parent</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">inner_mock</span><span class="o">.</span><span class="n">_mock_name</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="n">inner_mock</span><span class="o">.</span><span class="n">_mock_new_name</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">mock</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">mock_add_spec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Add a spec to a mock. `spec` can either be an object or a</span>
|
|
<span class="sd"> list of strings. Only attributes on the `spec` can be fetched as</span>
|
|
<span class="sd"> attributes from the mock.</span>
|
|
|
|
<span class="sd"> If `spec_set` is True then only attributes on the spec can be set."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_add_spec</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_mock_add_spec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">,</span> <span class="n">_spec_as_instance</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
|
<span class="n">_eat_self</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">InvalidSpecError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot spec a Mock object. [object=</span><span class="si">{</span><span class="n">spec</span><span class="si">!r}</span><span class="s1">]'</span><span class="p">)</span>
|
|
|
|
<span class="n">_spec_class</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">_spec_signature</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">_spec_asyncs</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="k">if</span> <span class="n">spec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">_is_list</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
|
|
<span class="n">_spec_class</span> <span class="o">=</span> <span class="n">spec</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">_spec_class</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
|
<span class="n">res</span> <span class="o">=</span> <span class="n">_get_signature_object</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span>
|
|
<span class="n">_spec_as_instance</span><span class="p">,</span> <span class="n">_eat_self</span><span class="p">)</span>
|
|
<span class="n">_spec_signature</span> <span class="o">=</span> <span class="n">res</span> <span class="ow">and</span> <span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="n">spec_list</span> <span class="o">=</span> <span class="nb">dir</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">spec_list</span><span class="p">:</span>
|
|
<span class="n">static_attr</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getattr_static</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">unwrapped_attr</span> <span class="o">=</span> <span class="n">static_attr</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">unwrapped_attr</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">unwrapped_attr</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">if</span> <span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">unwrapped_attr</span><span class="p">):</span>
|
|
<span class="n">_spec_asyncs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
|
|
|
|
<span class="n">spec</span> <span class="o">=</span> <span class="n">spec_list</span>
|
|
|
|
<span class="vm">__dict__</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_spec_class'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_spec_class</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_spec_set'</span><span class="p">]</span> <span class="o">=</span> <span class="n">spec_set</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_spec_signature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_spec_signature</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_methods'</span><span class="p">]</span> <span class="o">=</span> <span class="n">spec</span>
|
|
<span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_spec_asyncs'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_spec_asyncs</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">__get_return_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_return_value</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_delegate</span><span class="o">.</span><span class="n">return_value</span>
|
|
|
|
<span class="k">if</span> <span class="n">ret</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_child_mock</span><span class="p">(</span>
|
|
<span class="n">_new_parent</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="s1">'()'</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">ret</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">__set_return_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_delegate</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_return_value</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="n">_check_and_set_parent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="s1">'()'</span><span class="p">)</span>
|
|
|
|
<span class="n">__return_value_doc</span> <span class="o">=</span> <span class="s2">"The value to be returned when the mock is called."</span>
|
|
<span class="n">return_value</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">__get_return_value</span><span class="p">,</span> <span class="n">__set_return_value</span><span class="p">,</span>
|
|
<span class="n">__return_value_doc</span><span class="p">)</span>
|
|
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">__class__</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">_spec_class</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">type</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">_spec_class</span>
|
|
|
|
<span class="n">called</span> <span class="o">=</span> <span class="n">_delegating_property</span><span class="p">(</span><span class="s1">'called'</span><span class="p">)</span>
|
|
<span class="n">call_count</span> <span class="o">=</span> <span class="n">_delegating_property</span><span class="p">(</span><span class="s1">'call_count'</span><span class="p">)</span>
|
|
<span class="n">call_args</span> <span class="o">=</span> <span class="n">_delegating_property</span><span class="p">(</span><span class="s1">'call_args'</span><span class="p">)</span>
|
|
<span class="n">call_args_list</span> <span class="o">=</span> <span class="n">_delegating_property</span><span class="p">(</span><span class="s1">'call_args_list'</span><span class="p">)</span>
|
|
<span class="n">mock_calls</span> <span class="o">=</span> <span class="n">_delegating_property</span><span class="p">(</span><span class="s1">'mock_calls'</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">__get_side_effect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">delegated</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_delegate</span>
|
|
<span class="k">if</span> <span class="n">delegated</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_side_effect</span>
|
|
<span class="n">sf</span> <span class="o">=</span> <span class="n">delegated</span><span class="o">.</span><span class="n">side_effect</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">sf</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">sf</span><span class="p">,</span> <span class="n">_MockIter</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">_is_exception</span><span class="p">(</span><span class="n">sf</span><span class="p">)):</span>
|
|
<span class="n">sf</span> <span class="o">=</span> <span class="n">_MockIter</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span>
|
|
<span class="n">delegated</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">sf</span>
|
|
<span class="k">return</span> <span class="n">sf</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">__set_side_effect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">_try_iter</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
<span class="n">delegated</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_delegate</span>
|
|
<span class="k">if</span> <span class="n">delegated</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_side_effect</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">delegated</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">value</span>
|
|
|
|
<span class="n">side_effect</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">__get_side_effect</span><span class="p">,</span> <span class="n">__set_side_effect</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">reset_mock</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">visited</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span><span class="o">*</span><span class="p">,</span> <span class="n">return_value</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">side_effect</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="s2">"Restore the mock object to its initial state."</span>
|
|
<span class="k">if</span> <span class="n">visited</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">visited</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="ow">in</span> <span class="n">visited</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="n">visited</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">called</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_args</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">mock_calls</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_args_list</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">method_calls</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
|
|
<span class="k">if</span> <span class="n">return_value</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_return_value</span> <span class="o">=</span> <span class="n">DEFAULT</span>
|
|
<span class="k">if</span> <span class="n">side_effect</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_side_effect</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_children</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">child</span><span class="p">,</span> <span class="n">_SpecState</span><span class="p">)</span> <span class="ow">or</span> <span class="n">child</span> <span class="ow">is</span> <span class="n">_deleted</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="n">child</span><span class="o">.</span><span class="n">reset_mock</span><span class="p">(</span><span class="n">visited</span><span class="p">,</span> <span class="n">return_value</span><span class="o">=</span><span class="n">return_value</span><span class="p">,</span> <span class="n">side_effect</span><span class="o">=</span><span class="n">side_effect</span><span class="p">)</span>
|
|
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_return_value</span>
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span> <span class="ow">and</span> <span class="n">ret</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="o">.</span><span class="n">reset_mock</span><span class="p">(</span><span class="n">visited</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">configure_mock</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Set attributes on the mock through keyword arguments.</span>
|
|
|
|
<span class="sd"> Attributes plus return values and side effects can be set on child</span>
|
|
<span class="sd"> mocks using standard dot notation and unpacking a dictionary in the</span>
|
|
<span class="sd"> method call:</span>
|
|
|
|
<span class="sd"> >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}</span>
|
|
<span class="sd"> >>> mock.configure_mock(**attrs)"""</span>
|
|
<span class="k">for</span> <span class="n">arg</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span>
|
|
<span class="c1"># we sort on the number of dots so that</span>
|
|
<span class="c1"># attributes are set before we set attributes on</span>
|
|
<span class="c1"># attributes</span>
|
|
<span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">entry</span><span class="p">:</span> <span class="n">entry</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)):</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span>
|
|
<span class="n">final</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">entry</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">final</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__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">name</span> <span class="ow">in</span> <span class="p">{</span><span class="s1">'_mock_methods'</span><span class="p">,</span> <span class="s1">'_mock_unsafe'</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">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span> <span class="ow">or</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_all_magics</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">"Mock object has no attribute </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">_is_magic</span><span class="p">(</span><span class="n">name</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">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_unsafe</span> <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span> <span class="ow">or</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">((</span><span class="s1">'assert'</span><span class="p">,</span> <span class="s1">'assret'</span><span class="p">,</span> <span class="s1">'asert'</span><span class="p">,</span> <span class="s1">'aseert'</span><span class="p">,</span> <span class="s1">'assrt'</span><span class="p">))</span> <span class="ow">or</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_ATTRIB_DENY_LIST</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">name</span><span class="si">!r}</span><span class="s2"> is not a valid assertion. Use a spec "</span>
|
|
<span class="sa">f</span><span class="s2">"for the mock if </span><span class="si">{</span><span class="n">name</span><span class="si">!r}</span><span class="s2"> is meant to be an attribute."</span><span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">NonCallableMock</span><span class="o">.</span><span class="n">_lock</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_children</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="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="n">_deleted</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">elif</span> <span class="n">result</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">wraps</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_wraps</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># XXXX should we get the attribute without triggering code</span>
|
|
<span class="c1"># execution?</span>
|
|
<span class="n">wraps</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">_mock_wraps</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_child_mock</span><span class="p">(</span>
|
|
<span class="n">parent</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">wraps</span><span class="o">=</span><span class="n">wraps</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
|
|
<span class="n">_new_parent</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">_mock_children</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span>
|
|
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">_SpecState</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">create_autospec</span><span class="p">(</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">spec</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">spec_set</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">name</span>
|
|
<span class="p">)</span>
|
|
<span class="k">except</span> <span class="n">InvalidSpecError</span><span class="p">:</span>
|
|
<span class="n">target_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_name'</span><span class="p">]</span> <span class="ow">or</span> <span class="bp">self</span>
|
|
<span class="k">raise</span> <span class="n">InvalidSpecError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Cannot autospec attr </span><span class="si">{</span><span class="n">name</span><span class="si">!r}</span><span class="s1"> from target '</span>
|
|
<span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">target_name</span><span class="si">!r}</span><span class="s1"> as it has already been mocked out. '</span>
|
|
<span class="sa">f</span><span class="s1">'[target=</span><span class="si">{</span><span class="bp">self</span><span class="si">!r}</span><span class="s1">, attr=</span><span class="si">{</span><span class="n">result</span><span class="o">.</span><span class="n">spec</span><span class="si">!r}</span><span class="s1">]'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_children</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span>
|
|
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_extract_mock_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">_name_list</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_new_name</span><span class="p">]</span>
|
|
<span class="n">_parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_new_parent</span>
|
|
<span class="n">last</span> <span class="o">=</span> <span class="bp">self</span>
|
|
|
|
<span class="n">dot</span> <span class="o">=</span> <span class="s1">'.'</span>
|
|
<span class="k">if</span> <span class="n">_name_list</span> <span class="o">==</span> <span class="p">[</span><span class="s1">'()'</span><span class="p">]:</span>
|
|
<span class="n">dot</span> <span class="o">=</span> <span class="s1">''</span>
|
|
|
|
<span class="k">while</span> <span class="n">_parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">last</span> <span class="o">=</span> <span class="n">_parent</span>
|
|
|
|
<span class="n">_name_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_parent</span><span class="o">.</span><span class="n">_mock_new_name</span> <span class="o">+</span> <span class="n">dot</span><span class="p">)</span>
|
|
<span class="n">dot</span> <span class="o">=</span> <span class="s1">'.'</span>
|
|
<span class="k">if</span> <span class="n">_parent</span><span class="o">.</span><span class="n">_mock_new_name</span> <span class="o">==</span> <span class="s1">'()'</span><span class="p">:</span>
|
|
<span class="n">dot</span> <span class="o">=</span> <span class="s1">''</span>
|
|
|
|
<span class="n">_parent</span> <span class="o">=</span> <span class="n">_parent</span><span class="o">.</span><span class="n">_mock_new_parent</span>
|
|
|
|
<span class="n">_name_list</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">reversed</span><span class="p">(</span><span class="n">_name_list</span><span class="p">))</span>
|
|
<span class="n">_first</span> <span class="o">=</span> <span class="n">last</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="s1">'mock'</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">_name_list</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">_name_list</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'()'</span><span class="p">,</span> <span class="s1">'().'</span><span class="p">):</span>
|
|
<span class="n">_first</span> <span class="o">+=</span> <span class="s1">'.'</span>
|
|
<span class="n">_name_list</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">_first</span>
|
|
<span class="k">return</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_name_list</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extract_mock_name</span><span class="p">()</span>
|
|
|
|
<span class="n">name_string</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'mock'</span><span class="p">,</span> <span class="s1">'mock.'</span><span class="p">):</span>
|
|
<span class="n">name_string</span> <span class="o">=</span> <span class="s1">' name=</span><span class="si">%r</span><span class="s1">'</span> <span class="o">%</span> <span class="n">name</span>
|
|
|
|
<span class="n">spec_string</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_spec_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">spec_string</span> <span class="o">=</span> <span class="s1">' spec=</span><span class="si">%r</span><span class="s1">'</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_spec_set</span><span class="p">:</span>
|
|
<span class="n">spec_string</span> <span class="o">=</span> <span class="s1">' spec_set=</span><span class="si">%r</span><span class="s1">'</span>
|
|
<span class="n">spec_string</span> <span class="o">=</span> <span class="n">spec_string</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_spec_class</span><span class="o">.</span><span class="vm">__name__</span>
|
|
<span class="k">return</span> <span class="s2">"<</span><span class="si">%s%s%s</span><span class="s2"> id='</span><span class="si">%s</span><span class="s2">'>"</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
|
|
<span class="n">name_string</span><span class="p">,</span>
|
|
<span class="n">spec_string</span><span class="p">,</span>
|
|
<span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__dir__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Filter the output of `dir(mock)` to only useful members."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">FILTER_DIR</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__dir__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="n">extras</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span> <span class="ow">or</span> <span class="p">[]</span>
|
|
<span class="n">from_type</span> <span class="o">=</span> <span class="nb">dir</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
|
|
<span class="n">from_dict</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
|
|
<span class="n">from_child_mocks</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="n">m_name</span> <span class="k">for</span> <span class="n">m_name</span><span class="p">,</span> <span class="n">m_value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_children</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">m_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_deleted</span><span class="p">]</span>
|
|
|
|
<span class="n">from_type</span> <span class="o">=</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">from_type</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">e</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'_'</span><span class="p">)]</span>
|
|
<span class="n">from_dict</span> <span class="o">=</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">from_dict</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">e</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'_'</span><span class="p">)</span> <span class="ow">or</span>
|
|
<span class="n">_is_magic</span><span class="p">(</span><span class="n">e</span><span class="p">)]</span>
|
|
<span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">extras</span> <span class="o">+</span> <span class="n">from_type</span> <span class="o">+</span> <span class="n">from_dict</span> <span class="o">+</span> <span class="n">from_child_mocks</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__setattr__</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="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_allowed_names</span><span class="p">:</span>
|
|
<span class="c1"># property setters go through here</span>
|
|
<span class="k">return</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__setattr__</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="k">elif</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_spec_set</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span> <span class="ow">and</span>
|
|
<span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">"Mock object has no attribute '</span><span class="si">%s</span><span class="s2">'"</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_unsupported_magics</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="s1">'Attempting to set unsupported magic method </span><span class="si">%r</span><span class="s1">.'</span> <span class="o">%</span> <span class="n">name</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_all_magics</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">"Mock object has no attribute '</span><span class="si">%s</span><span class="s2">'"</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_is_instance_mock</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="nb">type</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">_get_method</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">original</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">:</span> <span class="n">original</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># only set _new_name and not name so that mock_calls is tracked</span>
|
|
<span class="c1"># but not method calls</span>
|
|
<span class="n">_check_and_set_parent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="nb">type</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="bp">self</span><span class="o">.</span><span class="n">_mock_children</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="k">elif</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">'__class__'</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_spec_class</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">return</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">_check_and_set_parent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">name</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">_mock_children</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_sealed</span> <span class="ow">and</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="n">name</span><span class="p">):</span>
|
|
<span class="n">mock_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_extract_mock_name</span><span class="p">()</span><span class="si">}</span><span class="s1">.</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot set </span><span class="si">{</span><span class="n">mock_name</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__setattr__</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="k">def</span><span class="w"> </span><span class="fm">__delattr__</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">name</span> <span class="ow">in</span> <span class="n">_all_magics</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
|
|
<span class="nb">delattr</span><span class="p">(</span><span class="nb">type</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">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
|
|
<span class="c1"># for magic methods that are still MagicProxy objects and</span>
|
|
<span class="c1"># not set on the instance itself</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_children</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">_missing</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
|
|
<span class="n">_safe_super</span><span class="p">(</span><span class="n">NonCallableMock</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__delattr__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">obj</span> <span class="ow">is</span> <span class="n">_deleted</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">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_missing</span><span class="p">:</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_children</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">_mock_children</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">_deleted</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_format_mock_call_signature</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">kwargs</span><span class="p">):</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="s1">'mock'</span>
|
|
<span class="k">return</span> <span class="n">_format_call_signature</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_format_mock_failure_message</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">kwargs</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'call'</span><span class="p">):</span>
|
|
<span class="n">message</span> <span class="o">=</span> <span class="s1">'expected </span><span class="si">%s</span><span class="s1"> not found.</span><span class="se">\n</span><span class="s1">Expected: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">Actual: </span><span class="si">%s</span><span class="s1">'</span>
|
|
<span class="n">expected_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_call_signature</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">call_args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">call_args</span>
|
|
<span class="n">actual_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_call_signature</span><span class="p">(</span><span class="o">*</span><span class="n">call_args</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">message</span> <span class="o">%</span> <span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">expected_string</span><span class="p">,</span> <span class="n">actual_string</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_call_signature_from_name</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="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> * If call objects are asserted against a method/function like obj.meth1</span>
|
|
<span class="sd"> then there could be no name for the call object to lookup. Hence just</span>
|
|
<span class="sd"> return the spec_signature of the method/function being asserted against.</span>
|
|
<span class="sd"> * If the name is not empty then remove () and split by '.' to get</span>
|
|
<span class="sd"> list of names to iterate through the children until a potential</span>
|
|
<span class="sd"> match is found. A child mock is created only during attribute access</span>
|
|
<span class="sd"> so if we get a _SpecState then no attributes of the spec were accessed</span>
|
|
<span class="sd"> and can be safely exited.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">name</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_spec_signature</span>
|
|
|
|
<span class="n">sig</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">names</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="s1">'()'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span>
|
|
<span class="n">children</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_children</span>
|
|
|
|
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
|
|
<span class="n">child</span> <span class="o">=</span> <span class="n">children</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="k">if</span> <span class="n">child</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">child</span><span class="p">,</span> <span class="n">_SpecState</span><span class="p">):</span>
|
|
<span class="k">break</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># If an autospecced object is attached using attach_mock the</span>
|
|
<span class="c1"># child would be a function with mock object as attribute from</span>
|
|
<span class="c1"># which signature has to be derived.</span>
|
|
<span class="n">child</span> <span class="o">=</span> <span class="n">_extract_mock</span><span class="p">(</span><span class="n">child</span><span class="p">)</span>
|
|
<span class="n">children</span> <span class="o">=</span> <span class="n">child</span><span class="o">.</span><span class="n">_mock_children</span>
|
|
<span class="n">sig</span> <span class="o">=</span> <span class="n">child</span><span class="o">.</span><span class="n">_spec_signature</span>
|
|
|
|
<span class="k">return</span> <span class="n">sig</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_call_matcher</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_call</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Given a call (or simply an (args, kwargs) tuple), return a</span>
|
|
<span class="sd"> comparison key suitable for matching with other calls.</span>
|
|
<span class="sd"> This is a best effort method which relies on the spec's signature,</span>
|
|
<span class="sd"> if available, or falls back on the arguments themselves.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_call</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">_call</span><span class="p">)</span> <span class="o">></span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">sig</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_call_signature_from_name</span><span class="p">(</span><span class="n">_call</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">sig</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_spec_signature</span>
|
|
|
|
<span class="k">if</span> <span class="n">sig</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">_call</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="n">_call</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="n">_call</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">bound_call</span> <span class="o">=</span> <span class="n">sig</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">call</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bound_call</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="n">bound_call</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">e</span><span class="o">.</span><span class="n">with_traceback</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_call</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_not_called</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""assert that the mock was never called.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">call_count</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"Expected '</span><span class="si">%s</span><span class="s2">' to not have been called. Called </span><span class="si">%s</span><span class="s2"> times.</span><span class="si">%s</span><span class="s2">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="s1">'mock'</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_count</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_calls_repr</span><span class="p">()))</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_called</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""assert that the mock was called at least once</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">call_count</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"Expected '</span><span class="si">%s</span><span class="s2">' to have been called."</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="s1">'mock'</span><span class="p">))</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_called_once</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""assert that the mock was called only once.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">call_count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"Expected '</span><span class="si">%s</span><span class="s2">' to have been called once. Called </span><span class="si">%s</span><span class="s2"> times.</span><span class="si">%s</span><span class="s2">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="s1">'mock'</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_count</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_calls_repr</span><span class="p">()))</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_called_with</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""assert that the last call was made with the specified arguments.</span>
|
|
|
|
<span class="sd"> Raises an AssertionError if the args and keyword args passed in are</span>
|
|
<span class="sd"> different to the last call to the mock."""</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">call_args</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">expected</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_call_signature</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">actual</span> <span class="o">=</span> <span class="s1">'not called.'</span>
|
|
<span class="n">error_message</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'expected call not found.</span><span class="se">\n</span><span class="s1">Expected: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">Actual: </span><span class="si">%s</span><span class="s1">'</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">actual</span><span class="p">))</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">error_message</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_error_message</span><span class="p">():</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_failure_message</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">msg</span>
|
|
<span class="n">expected</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">_Call</span><span class="p">((</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">),</span> <span class="n">two</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
|
|
<span class="n">actual</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">call_args</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">actual</span> <span class="o">!=</span> <span class="n">expected</span><span class="p">:</span>
|
|
<span class="n">cause</span> <span class="o">=</span> <span class="n">expected</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">_error_message</span><span class="p">())</span> <span class="kn">from</span><span class="w"> </span><span class="nn">cause</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_called_once_with</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""assert that the mock was called exactly once and that that call was</span>
|
|
<span class="sd"> with the specified arguments."""</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">call_count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"Expected '</span><span class="si">%s</span><span class="s2">' to be called once. Called </span><span class="si">%s</span><span class="s2"> times.</span><span class="si">%s</span><span class="s2">"</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="s1">'mock'</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_count</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_calls_repr</span><span class="p">()))</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_has_calls</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">calls</span><span class="p">,</span> <span class="n">any_order</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""assert the mock has been called with the specified calls.</span>
|
|
<span class="sd"> The `mock_calls` list is checked for the calls.</span>
|
|
|
|
<span class="sd"> If `any_order` is False (the default) then the calls must be</span>
|
|
<span class="sd"> sequential. There can be extra calls before or after the</span>
|
|
<span class="sd"> specified calls.</span>
|
|
|
|
<span class="sd"> If `any_order` is True then the calls can be in any order, but</span>
|
|
<span class="sd"> they must all appear in `mock_calls`."""</span>
|
|
<span class="n">expected</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">calls</span><span class="p">]</span>
|
|
<span class="n">cause</span> <span class="o">=</span> <span class="nb">next</span><span class="p">((</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expected</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)),</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">all_calls</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">mock_calls</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">any_order</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">expected</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">all_calls</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">cause</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">problem</span> <span class="o">=</span> <span class="s1">'Calls not found.'</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">problem</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'Error processing expected calls.</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'Errors: </span><span class="si">{}</span><span class="s1">'</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="n">e</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expected</span><span class="p">])</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">problem</span><span class="si">}</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="sa">f</span><span class="s1">'Expected: </span><span class="si">{</span><span class="n">_CallList</span><span class="p">(</span><span class="n">calls</span><span class="p">)</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_calls_repr</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="s2">"Actual"</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">"."</span><span class="p">)</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">cause</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">all_calls</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">all_calls</span><span class="p">)</span>
|
|
|
|
<span class="n">not_found</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">kall</span> <span class="ow">in</span> <span class="n">expected</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">all_calls</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">kall</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
|
<span class="n">not_found</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">kall</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">not_found</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span>
|
|
<span class="s1">'</span><span class="si">%r</span><span class="s1"> does not contain all of </span><span class="si">%r</span><span class="s1"> in its call list, '</span>
|
|
<span class="s1">'found </span><span class="si">%r</span><span class="s1"> instead'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="s1">'mock'</span><span class="p">,</span>
|
|
<span class="nb">tuple</span><span class="p">(</span><span class="n">not_found</span><span class="p">),</span> <span class="n">all_calls</span><span class="p">)</span>
|
|
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">cause</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_any_call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""assert the mock has been called with the specified arguments.</span>
|
|
|
|
<span class="sd"> The assert passes if the mock has *ever* been called, unlike</span>
|
|
<span class="sd"> `assert_called_with` and `assert_called_once_with` that only pass if</span>
|
|
<span class="sd"> the call is the most recent one."""</span>
|
|
<span class="n">expected</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">_Call</span><span class="p">((</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">),</span> <span class="n">two</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
|
|
<span class="n">cause</span> <span class="o">=</span> <span class="n">expected</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="n">actual</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">call_args_list</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">cause</span> <span class="ow">or</span> <span class="n">expected</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_AnyComparer</span><span class="p">(</span><span class="n">actual</span><span class="p">):</span>
|
|
<span class="n">expected_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_call_signature</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span>
|
|
<span class="s1">'</span><span class="si">%s</span><span class="s1"> call not found'</span> <span class="o">%</span> <span class="n">expected_string</span>
|
|
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">cause</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_child_mock</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Create the child mocks for attributes and return value.</span>
|
|
<span class="sd"> By default child mocks will be the same type as the parent.</span>
|
|
<span class="sd"> Subclasses of Mock may want to override this to customize the way</span>
|
|
<span class="sd"> child mocks are made.</span>
|
|
|
|
<span class="sd"> For non-callable mocks the callable variant will be used (rather than</span>
|
|
<span class="sd"> any custom subclass)."""</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_sealed</span><span class="p">:</span>
|
|
<span class="n">attribute</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">".</span><span class="si">{</span><span class="n">kw</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span> <span class="k">if</span> <span class="s2">"name"</span> <span class="ow">in</span> <span class="n">kw</span> <span class="k">else</span> <span class="s2">"()"</span>
|
|
<span class="n">mock_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extract_mock_name</span><span class="p">()</span> <span class="o">+</span> <span class="n">attribute</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="n">mock_name</span><span class="p">)</span>
|
|
|
|
<span class="n">_new_name</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_new_name"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_new_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_spec_asyncs'</span><span class="p">]:</span>
|
|
<span class="k">return</span> <span class="n">AsyncMock</span><span class="p">(</span><span class="o">**</span><span class="n">kw</span><span class="p">)</span>
|
|
|
|
<span class="n">_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">_type</span><span class="p">,</span> <span class="n">MagicMock</span><span class="p">)</span> <span class="ow">and</span> <span class="n">_new_name</span> <span class="ow">in</span> <span class="n">_async_method_magics</span><span class="p">:</span>
|
|
<span class="c1"># Any asynchronous magic becomes an AsyncMock</span>
|
|
<span class="n">klass</span> <span class="o">=</span> <span class="n">AsyncMock</span>
|
|
<span class="k">elif</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">_type</span><span class="p">,</span> <span class="n">AsyncMockMixin</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">_new_name</span> <span class="ow">in</span> <span class="n">_all_sync_magics</span> <span class="ow">or</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span> <span class="ow">and</span> <span class="n">_new_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span><span class="p">):</span>
|
|
<span class="c1"># Any synchronous method on AsyncMock becomes a MagicMock</span>
|
|
<span class="n">klass</span> <span class="o">=</span> <span class="n">MagicMock</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">klass</span> <span class="o">=</span> <span class="n">AsyncMock</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">_type</span><span class="p">,</span> <span class="n">CallableMixin</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">_type</span><span class="p">,</span> <span class="n">NonCallableMagicMock</span><span class="p">):</span>
|
|
<span class="n">klass</span> <span class="o">=</span> <span class="n">MagicMock</span>
|
|
<span class="k">elif</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">_type</span><span class="p">,</span> <span class="n">NonCallableMock</span><span class="p">):</span>
|
|
<span class="n">klass</span> <span class="o">=</span> <span class="n">Mock</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">klass</span> <span class="o">=</span> <span class="n">_type</span><span class="o">.</span><span class="vm">__mro__</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">klass</span><span class="p">(</span><span class="o">**</span><span class="n">kw</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_calls_repr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="s2">"Calls"</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Renders self.mock_calls as a string.</span>
|
|
|
|
<span class="sd"> Example: "\nCalls: [call(1), call(2)]."</span>
|
|
|
|
<span class="sd"> If self.mock_calls is empty, an empty string is returned. The</span>
|
|
<span class="sd"> output will be truncated if very long.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">mock_calls</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s2">""</span>
|
|
<span class="k">return</span> <span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="si">{</span><span class="n">prefix</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">safe_repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mock_calls</span><span class="p">)</span><span class="si">}</span><span class="s2">."</span>
|
|
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">removeprefix</span> <span class="o">=</span> <span class="nb">str</span><span class="o">.</span><span class="n">removeprefix</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="c1"># Py 3.8 and earlier:</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">removeprefix</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">prefix</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">name</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">prefix</span><span class="p">):]</span>
|
|
|
|
<span class="c1"># Denylist for forbidden attribute names in safe mode</span>
|
|
<span class="n">_ATTRIB_DENY_LIST</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span>
|
|
<span class="n">removeprefix</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">"assert_"</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">NonCallableMock</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"assert_"</span><span class="p">)</span>
|
|
<span class="p">})</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_AnyComparer</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A list which checks if it contains a call which may have an</span>
|
|
<span class="sd"> argument of ANY, flipping the components of item and self from</span>
|
|
<span class="sd"> their traditional locations so that ANY is guaranteed to be on</span>
|
|
<span class="sd"> the left."""</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">_call</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">_call</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">all</span><span class="p">([</span>
|
|
<span class="n">expected</span> <span class="o">==</span> <span class="n">actual</span>
|
|
<span class="k">for</span> <span class="n">expected</span><span class="p">,</span> <span class="n">actual</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">_call</span><span class="p">)</span>
|
|
<span class="p">]):</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_try_iter</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">obj</span>
|
|
<span class="k">if</span> <span class="n">_is_exception</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">obj</span>
|
|
<span class="k">if</span> <span class="n">_callable</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">obj</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
|
|
<span class="c1"># XXXX backwards compatibility</span>
|
|
<span class="c1"># but this will blow up on first call - so maybe we should fail early?</span>
|
|
<span class="k">return</span> <span class="n">obj</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">CallableMixin</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">side_effect</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">return_value</span><span class="o">=</span><span class="n">DEFAULT</span><span class="p">,</span>
|
|
<span class="n">wraps</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">_spec_state</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">_new_parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_return_value'</span><span class="p">]</span> <span class="o">=</span> <span class="n">return_value</span>
|
|
<span class="n">_safe_super</span><span class="p">(</span><span class="n">CallableMixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
|
|
<span class="n">spec</span><span class="p">,</span> <span class="n">wraps</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span>
|
|
<span class="n">_spec_state</span><span class="p">,</span> <span class="n">_new_name</span><span class="p">,</span> <span class="n">_new_parent</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">side_effect</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_mock_check_sig</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="c1"># stub method that can be replaced with one with a specific signature</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="c1"># can't use self in-case a function / method we are mocking uses self</span>
|
|
<span class="c1"># in the signature</span>
|
|
<span class="n">_mock_self</span><span class="o">.</span><span class="n">_mock_check_sig</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">_mock_self</span><span class="o">.</span><span class="n">_increment_mock_call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">_mock_self</span><span class="o">.</span><span class="n">_mock_call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_mock_call</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">_mock_self</span><span class="o">.</span><span class="n">_execute_mock_call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_increment_mock_call</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">called</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="c1"># handle call_args</span>
|
|
<span class="c1"># needs to be set here so assertions on call arguments pass before</span>
|
|
<span class="c1"># execution in the case of awaited calls</span>
|
|
<span class="n">_call</span> <span class="o">=</span> <span class="n">_Call</span><span class="p">((</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">),</span> <span class="n">two</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_args</span> <span class="o">=</span> <span class="n">_call</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">call_args_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_call</span><span class="p">)</span>
|
|
|
|
<span class="c1"># initial stuff for method_calls:</span>
|
|
<span class="n">do_method_calls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
<span class="n">method_call_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span>
|
|
|
|
<span class="c1"># initial stuff for mock_calls:</span>
|
|
<span class="n">mock_call_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_new_name</span>
|
|
<span class="n">is_a_call</span> <span class="o">=</span> <span class="n">mock_call_name</span> <span class="o">==</span> <span class="s1">'()'</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">mock_calls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_Call</span><span class="p">((</span><span class="s1">''</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)))</span>
|
|
|
|
<span class="c1"># follow up the chain of mocks:</span>
|
|
<span class="n">_new_parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_new_parent</span>
|
|
<span class="k">while</span> <span class="n">_new_parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
<span class="c1"># handle method_calls:</span>
|
|
<span class="k">if</span> <span class="n">do_method_calls</span><span class="p">:</span>
|
|
<span class="n">_new_parent</span><span class="o">.</span><span class="n">method_calls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_Call</span><span class="p">((</span><span class="n">method_call_name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)))</span>
|
|
<span class="n">do_method_calls</span> <span class="o">=</span> <span class="n">_new_parent</span><span class="o">.</span><span class="n">_mock_parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">do_method_calls</span><span class="p">:</span>
|
|
<span class="n">method_call_name</span> <span class="o">=</span> <span class="n">_new_parent</span><span class="o">.</span><span class="n">_mock_name</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> <span class="n">method_call_name</span>
|
|
|
|
<span class="c1"># handle mock_calls:</span>
|
|
<span class="n">this_mock_call</span> <span class="o">=</span> <span class="n">_Call</span><span class="p">((</span><span class="n">mock_call_name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
|
|
<span class="n">_new_parent</span><span class="o">.</span><span class="n">mock_calls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">this_mock_call</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">_new_parent</span><span class="o">.</span><span class="n">_mock_new_name</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">is_a_call</span><span class="p">:</span>
|
|
<span class="n">dot</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">dot</span> <span class="o">=</span> <span class="s1">'.'</span>
|
|
<span class="n">is_a_call</span> <span class="o">=</span> <span class="n">_new_parent</span><span class="o">.</span><span class="n">_mock_new_name</span> <span class="o">==</span> <span class="s1">'()'</span>
|
|
<span class="n">mock_call_name</span> <span class="o">=</span> <span class="n">_new_parent</span><span class="o">.</span><span class="n">_mock_new_name</span> <span class="o">+</span> <span class="n">dot</span> <span class="o">+</span> <span class="n">mock_call_name</span>
|
|
|
|
<span class="c1"># follow the parental chain:</span>
|
|
<span class="n">_new_parent</span> <span class="o">=</span> <span class="n">_new_parent</span><span class="o">.</span><span class="n">_mock_new_parent</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_execute_mock_call</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="c1"># separate from _increment_mock_call so that awaited functions are</span>
|
|
<span class="c1"># executed separately from their call, also AsyncMock overrides this method</span>
|
|
|
|
<span class="n">effect</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">side_effect</span>
|
|
<span class="k">if</span> <span class="n">effect</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">_is_exception</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">effect</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">_callable</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">effect</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_is_exception</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">result</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">effect</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_return_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">return_value</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_wraps</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_wraps</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">return_value</span>
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="Mock">
|
|
<a class="viewcode-back" href="../../api/evennia.utils.test_resources.html#evennia.contrib.base_systems.custom_gametime.tests.Mock">[docs]</a>
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">Mock</span><span class="p">(</span><span class="n">CallableMixin</span><span class="p">,</span> <span class="n">NonCallableMock</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Create a new `Mock` object. `Mock` takes several optional arguments</span>
|
|
<span class="sd"> that specify the behaviour of the Mock object:</span>
|
|
|
|
<span class="sd"> * `spec`: This can be either a list of strings or an existing object (a</span>
|
|
<span class="sd"> class or instance) that acts as the specification for the mock object. If</span>
|
|
<span class="sd"> you pass in an object then a list of strings is formed by calling dir on</span>
|
|
<span class="sd"> the object (excluding unsupported magic attributes and methods). Accessing</span>
|
|
<span class="sd"> any attribute not in this list will raise an `AttributeError`.</span>
|
|
|
|
<span class="sd"> If `spec` is an object (rather than a list of strings) then</span>
|
|
<span class="sd"> `mock.__class__` returns the class of the spec object. This allows mocks</span>
|
|
<span class="sd"> to pass `isinstance` tests.</span>
|
|
|
|
<span class="sd"> * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*</span>
|
|
<span class="sd"> or get an attribute on the mock that isn't on the object passed as</span>
|
|
<span class="sd"> `spec_set` will raise an `AttributeError`.</span>
|
|
|
|
<span class="sd"> * `side_effect`: A function to be called whenever the Mock is called. See</span>
|
|
<span class="sd"> the `side_effect` attribute. Useful for raising exceptions or</span>
|
|
<span class="sd"> dynamically changing return values. The function is called with the same</span>
|
|
<span class="sd"> arguments as the mock, and unless it returns `DEFAULT`, the return</span>
|
|
<span class="sd"> value of this function is used as the return value.</span>
|
|
|
|
<span class="sd"> If `side_effect` is an iterable then each call to the mock will return</span>
|
|
<span class="sd"> the next value from the iterable. If any of the members of the iterable</span>
|
|
<span class="sd"> are exceptions they will be raised instead of returned.</span>
|
|
|
|
<span class="sd"> * `return_value`: The value returned when the mock is called. By default</span>
|
|
<span class="sd"> this is a new Mock (created on first access). See the</span>
|
|
<span class="sd"> `return_value` attribute.</span>
|
|
|
|
<span class="sd"> * `unsafe`: By default, accessing any attribute whose name starts with</span>
|
|
<span class="sd"> *assert*, *assret*, *asert*, *aseert*, or *assrt* raises an AttributeError.</span>
|
|
<span class="sd"> Additionally, an AttributeError is raised when accessing</span>
|
|
<span class="sd"> attributes that match the name of an assertion method without the prefix</span>
|
|
<span class="sd"> `assert_`, e.g. accessing `called_once` instead of `assert_called_once`.</span>
|
|
<span class="sd"> Passing `unsafe=True` will allow access to these attributes.</span>
|
|
|
|
<span class="sd"> * `wraps`: Item for the mock object to wrap. If `wraps` is not None then</span>
|
|
<span class="sd"> calling the Mock will pass the call through to the wrapped object</span>
|
|
<span class="sd"> (returning the real result). Attribute access on the mock will return a</span>
|
|
<span class="sd"> Mock object that wraps the corresponding attribute of the wrapped object</span>
|
|
<span class="sd"> (so attempting to access an attribute that doesn't exist will raise an</span>
|
|
<span class="sd"> `AttributeError`).</span>
|
|
|
|
<span class="sd"> If the mock has an explicit `return_value` set then calls are not passed</span>
|
|
<span class="sd"> to the wrapped object and the `return_value` is returned instead.</span>
|
|
|
|
<span class="sd"> * `name`: If the mock has a name then it will be used in the repr of the</span>
|
|
<span class="sd"> mock. This can be useful for debugging. The name is propagated to child</span>
|
|
<span class="sd"> mocks.</span>
|
|
|
|
<span class="sd"> Mocks can also be called with arbitrary keyword arguments. These will be</span>
|
|
<span class="sd"> used to set attributes on the mock after it is created.</span>
|
|
<span class="sd"> """</span></div>
|
|
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_dot_lookup</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="n">comp</span><span class="p">,</span> <span class="n">import_path</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="n">thing</span><span class="p">,</span> <span class="n">comp</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="nb">__import__</span><span class="p">(</span><span class="n">import_path</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="n">comp</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_importer</span><span class="p">(</span><span class="n">target</span><span class="p">):</span>
|
|
<span class="n">components</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span>
|
|
<span class="n">import_path</span> <span class="o">=</span> <span class="n">components</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="n">thing</span> <span class="o">=</span> <span class="nb">__import__</span><span class="p">(</span><span class="n">import_path</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">comp</span> <span class="ow">in</span> <span class="n">components</span><span class="p">:</span>
|
|
<span class="n">import_path</span> <span class="o">+=</span> <span class="s2">".</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">comp</span>
|
|
<span class="n">thing</span> <span class="o">=</span> <span class="n">_dot_lookup</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="n">comp</span><span class="p">,</span> <span class="n">import_path</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">thing</span>
|
|
|
|
|
|
<span class="c1"># _check_spec_arg_typos takes kwargs from commands like patch and checks that</span>
|
|
<span class="c1"># they don't contain common misspellings of arguments related to autospeccing.</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_check_spec_arg_typos</span><span class="p">(</span><span class="n">kwargs_to_check</span><span class="p">):</span>
|
|
<span class="n">typos</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"autospect"</span><span class="p">,</span> <span class="s2">"auto_spec"</span><span class="p">,</span> <span class="s2">"set_spec"</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">typo</span> <span class="ow">in</span> <span class="n">typos</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">typo</span> <span class="ow">in</span> <span class="n">kwargs_to_check</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">typo</span><span class="si">!r}</span><span class="s2"> might be a typo; use unsafe=True if this is intended"</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_patch</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
|
|
<span class="n">attribute_name</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">_active_patches</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="p">,</span> <span class="n">getter</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">new</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">create</span><span class="p">,</span>
|
|
<span class="n">spec_set</span><span class="p">,</span> <span class="n">autospec</span><span class="p">,</span> <span class="n">new_callable</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">unsafe</span><span class="o">=</span><span class="kc">False</span>
|
|
<span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">new_callable</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">new</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s2">"Cannot use 'new' and 'new_callable' together"</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">autospec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s2">"Cannot use 'autospec' and 'new_callable' together"</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">unsafe</span><span class="p">:</span>
|
|
<span class="n">_check_spec_arg_typos</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">InvalidSpecError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Cannot spec attr </span><span class="si">{</span><span class="n">attribute</span><span class="si">!r}</span><span class="s1"> as the spec '</span>
|
|
<span class="sa">f</span><span class="s1">'has already been mocked out. [spec=</span><span class="si">{</span><span class="n">spec</span><span class="si">!r}</span><span class="s1">]'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">spec_set</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">InvalidSpecError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Cannot spec attr </span><span class="si">{</span><span class="n">attribute</span><span class="si">!r}</span><span class="s1"> as the spec_set '</span>
|
|
<span class="sa">f</span><span class="s1">'target has already been mocked out. [spec_set=</span><span class="si">{</span><span class="n">spec_set</span><span class="si">!r}</span><span class="s1">]'</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">getter</span> <span class="o">=</span> <span class="n">getter</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">attribute</span> <span class="o">=</span> <span class="n">attribute</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">new</span> <span class="o">=</span> <span class="n">new</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">new_callable</span> <span class="o">=</span> <span class="n">new_callable</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">spec</span> <span class="o">=</span> <span class="n">spec</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">create</span> <span class="o">=</span> <span class="n">create</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">has_local</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">spec_set</span> <span class="o">=</span> <span class="n">spec_set</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">autospec</span> <span class="o">=</span> <span class="n">autospec</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">additional_patchers</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">patcher</span> <span class="o">=</span> <span class="n">_patch</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">getter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">new</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">spec</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">create</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">spec_set</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">autospec</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_callable</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span>
|
|
<span class="p">)</span>
|
|
<span class="n">patcher</span><span class="o">.</span><span class="n">attribute_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute_name</span>
|
|
<span class="n">patcher</span><span class="o">.</span><span class="n">additional_patchers</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="n">p</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">additional_patchers</span>
|
|
<span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">patcher</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">decorate_class</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">decorate_async_callable</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">decorate_callable</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">decorate_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">patch</span><span class="o">.</span><span class="n">TEST_PREFIX</span><span class="p">):</span>
|
|
<span class="k">continue</span>
|
|
|
|
<span class="n">attr_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">attr_value</span><span class="p">,</span> <span class="s2">"__call__"</span><span class="p">):</span>
|
|
<span class="k">continue</span>
|
|
|
|
<span class="n">patcher</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">patcher</span><span class="p">(</span><span class="n">attr_value</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">klass</span>
|
|
|
|
|
|
<span class="nd">@contextlib</span><span class="o">.</span><span class="n">contextmanager</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">decoration_helper</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">patched</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">keywargs</span><span class="p">):</span>
|
|
<span class="n">extra_args</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">with</span> <span class="n">contextlib</span><span class="o">.</span><span class="n">ExitStack</span><span class="p">()</span> <span class="k">as</span> <span class="n">exit_stack</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">patching</span> <span class="ow">in</span> <span class="n">patched</span><span class="o">.</span><span class="n">patchings</span><span class="p">:</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">exit_stack</span><span class="o">.</span><span class="n">enter_context</span><span class="p">(</span><span class="n">patching</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">patching</span><span class="o">.</span><span class="n">attribute_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">keywargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">patching</span><span class="o">.</span><span class="n">new</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="n">extra_args</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">args</span> <span class="o">+=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">extra_args</span><span class="p">)</span>
|
|
<span class="k">yield</span> <span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">keywargs</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">decorate_callable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">):</span>
|
|
<span class="c1"># NB. Keep the method in sync with decorate_async_callable()</span>
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="s1">'patchings'</span><span class="p">):</span>
|
|
<span class="n">func</span><span class="o">.</span><span class="n">patchings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">func</span>
|
|
|
|
<span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">patched</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">keywargs</span><span class="p">):</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">decoration_helper</span><span class="p">(</span><span class="n">patched</span><span class="p">,</span>
|
|
<span class="n">args</span><span class="p">,</span>
|
|
<span class="n">keywargs</span><span class="p">)</span> <span class="k">as</span> <span class="p">(</span><span class="n">newargs</span><span class="p">,</span> <span class="n">newkeywargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">newargs</span><span class="p">,</span> <span class="o">**</span><span class="n">newkeywargs</span><span class="p">)</span>
|
|
|
|
<span class="n">patched</span><span class="o">.</span><span class="n">patchings</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">patched</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">decorate_async_callable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">):</span>
|
|
<span class="c1"># NB. Keep the method in sync with decorate_callable()</span>
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="s1">'patchings'</span><span class="p">):</span>
|
|
<span class="n">func</span><span class="o">.</span><span class="n">patchings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">func</span>
|
|
|
|
<span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
|
|
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">patched</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">keywargs</span><span class="p">):</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">decoration_helper</span><span class="p">(</span><span class="n">patched</span><span class="p">,</span>
|
|
<span class="n">args</span><span class="p">,</span>
|
|
<span class="n">keywargs</span><span class="p">)</span> <span class="k">as</span> <span class="p">(</span><span class="n">newargs</span><span class="p">,</span> <span class="n">newkeywargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="k">await</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">newargs</span><span class="p">,</span> <span class="o">**</span><span class="n">newkeywargs</span><span class="p">)</span>
|
|
|
|
<span class="n">patched</span><span class="o">.</span><span class="n">patchings</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">patched</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">get_original</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getter</span><span class="p">()</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</span>
|
|
|
|
<span class="n">original</span> <span class="o">=</span> <span class="n">DEFAULT</span>
|
|
<span class="n">local</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">original</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">):</span>
|
|
<span class="n">original</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">DEFAULT</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">local</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">_builtins</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">ModuleType</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">create</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">create</span> <span class="ow">and</span> <span class="n">original</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
|
|
<span class="s2">"</span><span class="si">%s</span><span class="s2"> does not have the attribute </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">original</span><span class="p">,</span> <span class="n">local</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Perform the patch."""</span>
|
|
<span class="n">new</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">new</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">spec</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">spec_set</span>
|
|
<span class="n">autospec</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">autospec</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span>
|
|
<span class="n">new_callable</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_callable</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getter</span><span class="p">()</span>
|
|
|
|
<span class="c1"># normalise False to None</span>
|
|
<span class="k">if</span> <span class="n">spec</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
|
|
<span class="n">spec</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
|
|
<span class="n">spec_set</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">autospec</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
|
|
<span class="n">autospec</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">if</span> <span class="n">spec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">autospec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Can't specify spec and autospec"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="p">((</span><span class="n">spec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">autospec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="n">spec_set</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="kc">None</span><span class="p">)):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Can't provide explicit spec_set *and* spec or autospec"</span><span class="p">)</span>
|
|
|
|
<span class="n">original</span><span class="p">,</span> <span class="n">local</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_original</span><span class="p">()</span>
|
|
|
|
<span class="k">if</span> <span class="n">new</span> <span class="ow">is</span> <span class="n">DEFAULT</span> <span class="ow">and</span> <span class="n">autospec</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">inherit</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">spec</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="c1"># set spec to the object we are replacing</span>
|
|
<span class="n">spec</span> <span class="o">=</span> <span class="n">original</span>
|
|
<span class="k">if</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="n">spec_set</span> <span class="o">=</span> <span class="n">original</span>
|
|
<span class="n">spec</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">elif</span> <span class="n">spec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="n">spec_set</span> <span class="o">=</span> <span class="n">spec</span>
|
|
<span class="n">spec</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">elif</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="n">spec_set</span> <span class="o">=</span> <span class="n">original</span>
|
|
|
|
<span class="k">if</span> <span class="n">spec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">original</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Can't use 'spec' with create=True"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">original</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
|
|
<span class="c1"># If we're patching out a class and there is a spec</span>
|
|
<span class="n">inherit</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">if</span> <span class="n">spec</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">_is_async_obj</span><span class="p">(</span><span class="n">original</span><span class="p">):</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">AsyncMock</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">MagicMock</span>
|
|
<span class="n">_kwargs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">if</span> <span class="n">new_callable</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">new_callable</span>
|
|
<span class="k">elif</span> <span class="n">spec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">this_spec</span> <span class="o">=</span> <span class="n">spec</span>
|
|
<span class="k">if</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">this_spec</span> <span class="o">=</span> <span class="n">spec_set</span>
|
|
<span class="k">if</span> <span class="n">_is_list</span><span class="p">(</span><span class="n">this_spec</span><span class="p">):</span>
|
|
<span class="n">not_callable</span> <span class="o">=</span> <span class="s1">'__call__'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">this_spec</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">not_callable</span> <span class="o">=</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">this_spec</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_is_async_obj</span><span class="p">(</span><span class="n">this_spec</span><span class="p">):</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">AsyncMock</span>
|
|
<span class="k">elif</span> <span class="n">not_callable</span><span class="p">:</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">NonCallableMagicMock</span>
|
|
|
|
<span class="k">if</span> <span class="n">spec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">_kwargs</span><span class="p">[</span><span class="s1">'spec'</span><span class="p">]</span> <span class="o">=</span> <span class="n">spec</span>
|
|
<span class="k">if</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">_kwargs</span><span class="p">[</span><span class="s1">'spec_set'</span><span class="p">]</span> <span class="o">=</span> <span class="n">spec_set</span>
|
|
|
|
<span class="c1"># add a name to mocks</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">Klass</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="nb">issubclass</span><span class="p">(</span><span class="n">Klass</span><span class="p">,</span> <span class="n">NonCallableMock</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="p">):</span>
|
|
<span class="n">_kwargs</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</span>
|
|
|
|
<span class="n">_kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">new</span> <span class="o">=</span> <span class="n">Klass</span><span class="p">(</span><span class="o">**</span><span class="n">_kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">inherit</span> <span class="ow">and</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">new</span><span class="p">):</span>
|
|
<span class="c1"># we can only tell if the instance should be callable if the</span>
|
|
<span class="c1"># spec is not a list</span>
|
|
<span class="n">this_spec</span> <span class="o">=</span> <span class="n">spec</span>
|
|
<span class="k">if</span> <span class="n">spec_set</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">this_spec</span> <span class="o">=</span> <span class="n">spec_set</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">_is_list</span><span class="p">(</span><span class="n">this_spec</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span>
|
|
<span class="n">_instance_callable</span><span class="p">(</span><span class="n">this_spec</span><span class="p">)):</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">NonCallableMagicMock</span>
|
|
|
|
<span class="n">_kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'name'</span><span class="p">)</span>
|
|
<span class="n">new</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">Klass</span><span class="p">(</span><span class="n">_new_parent</span><span class="o">=</span><span class="n">new</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="s1">'()'</span><span class="p">,</span>
|
|
<span class="o">**</span><span class="n">_kwargs</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">autospec</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># spec is ignored, new *must* be default, spec_set is treated</span>
|
|
<span class="c1"># as a boolean. Should we check spec is not None and that spec_set</span>
|
|
<span class="c1"># is a bool?</span>
|
|
<span class="k">if</span> <span class="n">new</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s2">"autospec creates the mock for you. Can't specify "</span>
|
|
<span class="s2">"autospec and new."</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">original</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Can't use 'autospec' with create=True"</span><span class="p">)</span>
|
|
<span class="n">spec_set</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">spec_set</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">autospec</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="n">autospec</span> <span class="o">=</span> <span class="n">original</span>
|
|
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">InvalidSpecError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Cannot autospec attr </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="si">!r}</span><span class="s1"> as the patch '</span>
|
|
<span class="sa">f</span><span class="s1">'target has already been mocked out. '</span>
|
|
<span class="sa">f</span><span class="s1">'[target=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="si">!r}</span><span class="s1">, attr=</span><span class="si">{</span><span class="n">autospec</span><span class="si">!r}</span><span class="s1">]'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">autospec</span><span class="p">):</span>
|
|
<span class="n">target_name</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">target</span><span class="p">,</span> <span class="s1">'__name__'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="n">InvalidSpecError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Cannot autospec attr </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="si">!r}</span><span class="s1"> from target '</span>
|
|
<span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">target_name</span><span class="si">!r}</span><span class="s1"> as it has already been mocked out. '</span>
|
|
<span class="sa">f</span><span class="s1">'[target=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="si">!r}</span><span class="s1">, attr=</span><span class="si">{</span><span class="n">autospec</span><span class="si">!r}</span><span class="s1">]'</span><span class="p">)</span>
|
|
|
|
<span class="n">new</span> <span class="o">=</span> <span class="n">create_autospec</span><span class="p">(</span><span class="n">autospec</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="n">spec_set</span><span class="p">,</span>
|
|
<span class="n">_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="c1"># can't set keyword args when we aren't creating the mock</span>
|
|
<span class="c1"># XXXX If new is a Mock we could call new.configure_mock(**kwargs)</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Can't pass kwargs to a mock we aren't creating"</span><span class="p">)</span>
|
|
|
|
<span class="n">new_attr</span> <span class="o">=</span> <span class="n">new</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">temp_original</span> <span class="o">=</span> <span class="n">original</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">is_local</span> <span class="o">=</span> <span class="n">local</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_exit_stack</span> <span class="o">=</span> <span class="n">contextlib</span><span class="o">.</span><span class="n">ExitStack</span><span class="p">()</span>
|
|
<span class="k">try</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">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="p">,</span> <span class="n">new_attr</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">extra_args</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">new</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="n">extra_args</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">attribute_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span>
|
|
<span class="k">for</span> <span class="n">patching</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">additional_patchers</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">_exit_stack</span><span class="o">.</span><span class="n">enter_context</span><span class="p">(</span><span class="n">patching</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">patching</span><span class="o">.</span><span class="n">new</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="n">extra_args</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">extra_args</span>
|
|
|
|
<span class="k">return</span> <span class="n">new</span>
|
|
<span class="k">except</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="fm">__exit__</span><span class="p">(</span><span class="o">*</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()):</span>
|
|
<span class="k">raise</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">exc_info</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Undo the patch."""</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">temp_original</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</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">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">temp_original</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="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</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">create</span> <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="p">)</span> <span class="ow">or</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">attribute</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'__doc__'</span><span class="p">,</span> <span class="s1">'__module__'</span><span class="p">,</span>
|
|
<span class="s1">'__defaults__'</span><span class="p">,</span> <span class="s1">'__annotations__'</span><span class="p">,</span>
|
|
<span class="s1">'__kwdefaults__'</span><span class="p">)):</span>
|
|
<span class="c1"># needed for proxy objects like django settings</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attribute</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">temp_original</span><span class="p">)</span>
|
|
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">temp_original</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span>
|
|
<span class="n">exit_stack</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exit_stack</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exit_stack</span>
|
|
<span class="k">return</span> <span class="n">exit_stack</span><span class="o">.</span><span class="fm">__exit__</span><span class="p">(</span><span class="o">*</span><span class="n">exc_info</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Activate a patch, returning any created mock."""</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__enter__</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_active_patches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Stop an active patch."""</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_active_patches</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
|
<span class="c1"># If the patch hasn't been started this will fail</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__exit__</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_target</span><span class="p">(</span><span class="n">target</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">target</span><span class="p">,</span> <span class="n">attribute</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s1">'.'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s2">"Need a valid target to patch. You supplied: </span><span class="si">{</span><span class="n">target</span><span class="si">!r}</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="n">getter</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">_importer</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">getter</span><span class="p">,</span> <span class="n">attribute</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_patch_object</span><span class="p">(</span>
|
|
<span class="n">target</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">DEFAULT</span><span class="p">,</span> <span class="n">spec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">create</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">autospec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">new_callable</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">unsafe</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
|
|
<span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> patch the named member (`attribute`) on an object (`target`) with a mock</span>
|
|
<span class="sd"> object.</span>
|
|
|
|
<span class="sd"> `patch.object` can be used as a decorator, class decorator or a context</span>
|
|
<span class="sd"> manager. Arguments `new`, `spec`, `create`, `spec_set`,</span>
|
|
<span class="sd"> `autospec` and `new_callable` have the same meaning as for `patch`. Like</span>
|
|
<span class="sd"> `patch`, `patch.object` takes arbitrary keyword arguments for configuring</span>
|
|
<span class="sd"> the mock object it creates.</span>
|
|
|
|
<span class="sd"> When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`</span>
|
|
<span class="sd"> for choosing which methods to wrap.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">str</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">target</span><span class="si">!r}</span><span class="s2"> must be the actual object to be patched, not a str"</span>
|
|
<span class="p">)</span>
|
|
<span class="n">getter</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">target</span>
|
|
<span class="k">return</span> <span class="n">_patch</span><span class="p">(</span>
|
|
<span class="n">getter</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">new</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">create</span><span class="p">,</span>
|
|
<span class="n">spec_set</span><span class="p">,</span> <span class="n">autospec</span><span class="p">,</span> <span class="n">new_callable</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">,</span> <span class="n">unsafe</span><span class="o">=</span><span class="n">unsafe</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_patch_multiple</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">spec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">create</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">autospec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">new_callable</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Perform multiple patches in a single call. It takes the object to be</span>
|
|
<span class="sd"> patched (either as an object or a string to fetch the object by importing)</span>
|
|
<span class="sd"> and keyword arguments for the patches::</span>
|
|
|
|
<span class="sd"> with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):</span>
|
|
<span class="sd"> ...</span>
|
|
|
|
<span class="sd"> Use `DEFAULT` as the value if you want `patch.multiple` to create</span>
|
|
<span class="sd"> mocks for you. In this case the created mocks are passed into a decorated</span>
|
|
<span class="sd"> function by keyword, and a dictionary is returned when `patch.multiple` is</span>
|
|
<span class="sd"> used as a context manager.</span>
|
|
|
|
<span class="sd"> `patch.multiple` can be used as a decorator, class decorator or a context</span>
|
|
<span class="sd"> manager. The arguments `spec`, `spec_set`, `create`,</span>
|
|
<span class="sd"> `autospec` and `new_callable` have the same meaning as for `patch`. These</span>
|
|
<span class="sd"> arguments will be applied to *all* patches done by `patch.multiple`.</span>
|
|
|
|
<span class="sd"> When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`</span>
|
|
<span class="sd"> for choosing which methods to wrap.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">str</span><span class="p">:</span>
|
|
<span class="n">getter</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">_importer</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">getter</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">target</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'Must supply at least one keyword argument with patch.multiple'</span>
|
|
<span class="p">)</span>
|
|
<span class="c1"># need to wrap in a list for python 3, where items is a view</span>
|
|
<span class="n">items</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
|
<span class="n">attribute</span><span class="p">,</span> <span class="n">new</span> <span class="o">=</span> <span class="n">items</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">patcher</span> <span class="o">=</span> <span class="n">_patch</span><span class="p">(</span>
|
|
<span class="n">getter</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">new</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">create</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">,</span>
|
|
<span class="n">autospec</span><span class="p">,</span> <span class="n">new_callable</span><span class="p">,</span> <span class="p">{}</span>
|
|
<span class="p">)</span>
|
|
<span class="n">patcher</span><span class="o">.</span><span class="n">attribute_name</span> <span class="o">=</span> <span class="n">attribute</span>
|
|
<span class="k">for</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">new</span> <span class="ow">in</span> <span class="n">items</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
|
<span class="n">this_patcher</span> <span class="o">=</span> <span class="n">_patch</span><span class="p">(</span>
|
|
<span class="n">getter</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">new</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">create</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">,</span>
|
|
<span class="n">autospec</span><span class="p">,</span> <span class="n">new_callable</span><span class="p">,</span> <span class="p">{}</span>
|
|
<span class="p">)</span>
|
|
<span class="n">this_patcher</span><span class="o">.</span><span class="n">attribute_name</span> <span class="o">=</span> <span class="n">attribute</span>
|
|
<span class="n">patcher</span><span class="o">.</span><span class="n">additional_patchers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">this_patcher</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">patcher</span>
|
|
|
|
|
|
<div class="viewcode-block" id="patch">
|
|
<a class="viewcode-back" href="../../api/evennia.web.utils.tests.html#evennia.contrib.base_systems.custom_gametime.tests.patch">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">patch</span><span class="p">(</span>
|
|
<span class="n">target</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">DEFAULT</span><span class="p">,</span> <span class="n">spec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">create</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
|
<span class="n">spec_set</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">autospec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">new_callable</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">unsafe</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
|
|
<span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> `patch` acts as a function decorator, class decorator or a context</span>
|
|
<span class="sd"> manager. Inside the body of the function or with statement, the `target`</span>
|
|
<span class="sd"> is patched with a `new` object. When the function/with statement exits</span>
|
|
<span class="sd"> the patch is undone.</span>
|
|
|
|
<span class="sd"> If `new` is omitted, then the target is replaced with an</span>
|
|
<span class="sd"> `AsyncMock if the patched object is an async function or a</span>
|
|
<span class="sd"> `MagicMock` otherwise. If `patch` is used as a decorator and `new` is</span>
|
|
<span class="sd"> omitted, the created mock is passed in as an extra argument to the</span>
|
|
<span class="sd"> decorated function. If `patch` is used as a context manager the created</span>
|
|
<span class="sd"> mock is returned by the context manager.</span>
|
|
|
|
<span class="sd"> `target` should be a string in the form `'package.module.ClassName'`. The</span>
|
|
<span class="sd"> `target` is imported and the specified object replaced with the `new`</span>
|
|
<span class="sd"> object, so the `target` must be importable from the environment you are</span>
|
|
<span class="sd"> calling `patch` from. The target is imported when the decorated function</span>
|
|
<span class="sd"> is executed, not at decoration time.</span>
|
|
|
|
<span class="sd"> The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`</span>
|
|
<span class="sd"> if patch is creating one for you.</span>
|
|
|
|
<span class="sd"> In addition you can pass `spec=True` or `spec_set=True`, which causes</span>
|
|
<span class="sd"> patch to pass in the object being mocked as the spec/spec_set object.</span>
|
|
|
|
<span class="sd"> `new_callable` allows you to specify a different class, or callable object,</span>
|
|
<span class="sd"> that will be called to create the `new` object. By default `AsyncMock` is</span>
|
|
<span class="sd"> used for async functions and `MagicMock` for the rest.</span>
|
|
|
|
<span class="sd"> A more powerful form of `spec` is `autospec`. If you set `autospec=True`</span>
|
|
<span class="sd"> then the mock will be created with a spec from the object being replaced.</span>
|
|
<span class="sd"> All attributes of the mock will also have the spec of the corresponding</span>
|
|
<span class="sd"> attribute of the object being replaced. Methods and functions being</span>
|
|
<span class="sd"> mocked will have their arguments checked and will raise a `TypeError` if</span>
|
|
<span class="sd"> they are called with the wrong signature. For mocks replacing a class,</span>
|
|
<span class="sd"> their return value (the 'instance') will have the same spec as the class.</span>
|
|
|
|
<span class="sd"> Instead of `autospec=True` you can pass `autospec=some_object` to use an</span>
|
|
<span class="sd"> arbitrary object as the spec instead of the one being replaced.</span>
|
|
|
|
<span class="sd"> By default `patch` will fail to replace attributes that don't exist. If</span>
|
|
<span class="sd"> you pass in `create=True`, and the attribute doesn't exist, patch will</span>
|
|
<span class="sd"> create the attribute for you when the patched function is called, and</span>
|
|
<span class="sd"> delete it again afterwards. This is useful for writing tests against</span>
|
|
<span class="sd"> attributes that your production code creates at runtime. It is off by</span>
|
|
<span class="sd"> default because it can be dangerous. With it switched on you can write</span>
|
|
<span class="sd"> passing tests against APIs that don't actually exist!</span>
|
|
|
|
<span class="sd"> Patch can be used as a `TestCase` class decorator. It works by</span>
|
|
<span class="sd"> decorating each test method in the class. This reduces the boilerplate</span>
|
|
<span class="sd"> code when your test methods share a common patchings set. `patch` finds</span>
|
|
<span class="sd"> tests by looking for method names that start with `patch.TEST_PREFIX`.</span>
|
|
<span class="sd"> By default this is `test`, which matches the way `unittest` finds tests.</span>
|
|
<span class="sd"> You can specify an alternative prefix by setting `patch.TEST_PREFIX`.</span>
|
|
|
|
<span class="sd"> Patch can be used as a context manager, with the with statement. Here the</span>
|
|
<span class="sd"> patching applies to the indented block after the with statement. If you</span>
|
|
<span class="sd"> use "as" then the patched object will be bound to the name after the</span>
|
|
<span class="sd"> "as"; very useful if `patch` is creating a mock object for you.</span>
|
|
|
|
<span class="sd"> Patch will raise a `RuntimeError` if passed some common misspellings of</span>
|
|
<span class="sd"> the arguments autospec and spec_set. Pass the argument `unsafe` with the</span>
|
|
<span class="sd"> value True to disable that check.</span>
|
|
|
|
<span class="sd"> `patch` takes arbitrary keyword arguments. These will be passed to</span>
|
|
<span class="sd"> `AsyncMock` if the patched object is asynchronous, to `MagicMock`</span>
|
|
<span class="sd"> otherwise or to `new_callable` if specified.</span>
|
|
|
|
<span class="sd"> `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are</span>
|
|
<span class="sd"> available for alternate use-cases.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">getter</span><span class="p">,</span> <span class="n">attribute</span> <span class="o">=</span> <span class="n">_get_target</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">_patch</span><span class="p">(</span>
|
|
<span class="n">getter</span><span class="p">,</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">new</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">create</span><span class="p">,</span>
|
|
<span class="n">spec_set</span><span class="p">,</span> <span class="n">autospec</span><span class="p">,</span> <span class="n">new_callable</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">,</span> <span class="n">unsafe</span><span class="o">=</span><span class="n">unsafe</span>
|
|
<span class="p">)</span></div>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_patch_dict</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Patch a dictionary, or dictionary like object, and restore the dictionary</span>
|
|
<span class="sd"> to its original state after the test.</span>
|
|
|
|
<span class="sd"> `in_dict` can be a dictionary or a mapping like container. If it is a</span>
|
|
<span class="sd"> mapping then it must at least support getting, setting and deleting items</span>
|
|
<span class="sd"> plus iterating over keys.</span>
|
|
|
|
<span class="sd"> `in_dict` can also be a string specifying the name of the dictionary, which</span>
|
|
<span class="sd"> will then be fetched by importing it.</span>
|
|
|
|
<span class="sd"> `values` can be a dictionary of values to set in the dictionary. `values`</span>
|
|
<span class="sd"> can also be an iterable of `(key, value)` pairs.</span>
|
|
|
|
<span class="sd"> If `clear` is True then the dictionary will be cleared before the new</span>
|
|
<span class="sd"> values are set.</span>
|
|
|
|
<span class="sd"> `patch.dict` can also be called with arbitrary keyword arguments to set</span>
|
|
<span class="sd"> values in the dictionary::</span>
|
|
|
|
<span class="sd"> with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):</span>
|
|
<span class="sd"> ...</span>
|
|
|
|
<span class="sd"> `patch.dict` can be used as a context manager, decorator or class</span>
|
|
<span class="sd"> decorator. When used as a class decorator `patch.dict` honours</span>
|
|
<span class="sd"> `patch.TEST_PREFIX` for choosing which methods to wrap.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">in_dict</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="p">(),</span> <span class="n">clear</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">in_dict</span> <span class="o">=</span> <span class="n">in_dict</span>
|
|
<span class="c1"># support any argument supported by dict(...) constructor</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">clear</span> <span class="o">=</span> <span class="n">clear</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_original</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">decorate_class</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">decorate_async_callable</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">decorate_callable</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">decorate_callable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
|
|
<span class="nd">@wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_patch_dict</span><span class="p">()</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_unpatch_dict</span><span class="p">()</span>
|
|
|
|
<span class="k">return</span> <span class="n">_inner</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">decorate_async_callable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
|
|
<span class="nd">@wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_patch_dict</span><span class="p">()</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="k">await</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_unpatch_dict</span><span class="p">()</span>
|
|
|
|
<span class="k">return</span> <span class="n">_inner</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">decorate_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span>
|
|
<span class="n">attr_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">patch</span><span class="o">.</span><span class="n">TEST_PREFIX</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="nb">hasattr</span><span class="p">(</span><span class="n">attr_value</span><span class="p">,</span> <span class="s2">"__call__"</span><span class="p">)):</span>
|
|
<span class="n">decorator</span> <span class="o">=</span> <span class="n">_patch_dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">in_dict</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">clear</span><span class="p">)</span>
|
|
<span class="n">decorated</span> <span class="o">=</span> <span class="n">decorator</span><span class="p">(</span><span class="n">attr_value</span><span class="p">)</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">decorated</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">klass</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Patch the dict."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_patch_dict</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">in_dict</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_patch_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">values</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">in_dict</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">in_dict</span> <span class="o">=</span> <span class="n">_importer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">in_dict</span><span class="p">)</span>
|
|
<span class="n">in_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">in_dict</span>
|
|
<span class="n">clear</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clear</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">original</span> <span class="o">=</span> <span class="n">in_dict</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="c1"># dict like object with no copy method</span>
|
|
<span class="c1"># must support iteration over keys</span>
|
|
<span class="n">original</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">in_dict</span><span class="p">:</span>
|
|
<span class="n">original</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">in_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_original</span> <span class="o">=</span> <span class="n">original</span>
|
|
|
|
<span class="k">if</span> <span class="n">clear</span><span class="p">:</span>
|
|
<span class="n">_clear_dict</span><span class="p">(</span><span class="n">in_dict</span><span class="p">)</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">in_dict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="c1"># dict like object with no update method</span>
|
|
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
|
|
<span class="n">in_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">values</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_unpatch_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">in_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">in_dict</span>
|
|
<span class="n">original</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_original</span>
|
|
|
|
<span class="n">_clear_dict</span><span class="p">(</span><span class="n">in_dict</span><span class="p">)</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">in_dict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">original</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">original</span><span class="p">:</span>
|
|
<span class="n">in_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">original</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Unpatch the dict."""</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_original</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_unpatch_dict</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Activate a patch, returning any created mock."""</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__enter__</span><span class="p">()</span>
|
|
<span class="n">_patch</span><span class="o">.</span><span class="n">_active_patches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Stop an active patch."""</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">_patch</span><span class="o">.</span><span class="n">_active_patches</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
|
<span class="c1"># If the patch hasn't been started this will fail</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__exit__</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_clear_dict</span><span class="p">(</span><span class="n">in_dict</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">in_dict</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">keys</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">in_dict</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
|
<span class="k">del</span> <span class="n">in_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_patch_stopall</span><span class="p">():</span>
|
|
<span class="w"> </span><span class="sd">"""Stop all active patches. LIFO to unroll nested patches."""</span>
|
|
<span class="k">for</span> <span class="n">patch</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">_patch</span><span class="o">.</span><span class="n">_active_patches</span><span class="p">):</span>
|
|
<span class="n">patch</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
|
|
|
|
|
|
<span class="n">patch</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="n">_patch_object</span>
|
|
<span class="n">patch</span><span class="o">.</span><span class="n">dict</span> <span class="o">=</span> <span class="n">_patch_dict</span>
|
|
<span class="n">patch</span><span class="o">.</span><span class="n">multiple</span> <span class="o">=</span> <span class="n">_patch_multiple</span>
|
|
<span class="n">patch</span><span class="o">.</span><span class="n">stopall</span> <span class="o">=</span> <span class="n">_patch_stopall</span>
|
|
<span class="n">patch</span><span class="o">.</span><span class="n">TEST_PREFIX</span> <span class="o">=</span> <span class="s1">'test'</span>
|
|
|
|
<span class="n">magic_methods</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="s2">"lt le gt ge eq ne "</span>
|
|
<span class="s2">"getitem setitem delitem "</span>
|
|
<span class="s2">"len contains iter "</span>
|
|
<span class="s2">"hash str sizeof "</span>
|
|
<span class="s2">"enter exit "</span>
|
|
<span class="c1"># we added divmod and rdivmod here instead of numerics</span>
|
|
<span class="c1"># because there is no idivmod</span>
|
|
<span class="s2">"divmod rdivmod neg pos abs invert "</span>
|
|
<span class="s2">"complex int float index "</span>
|
|
<span class="s2">"round trunc floor ceil "</span>
|
|
<span class="s2">"bool next "</span>
|
|
<span class="s2">"fspath "</span>
|
|
<span class="s2">"aiter "</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">IS_PYPY</span><span class="p">:</span>
|
|
<span class="c1"># PyPy has no __sizeof__: http://doc.pypy.org/en/latest/cpython_differences.html</span>
|
|
<span class="n">magic_methods</span> <span class="o">=</span> <span class="n">magic_methods</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'sizeof '</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span>
|
|
|
|
<span class="n">numerics</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="s2">"add sub mul matmul truediv floordiv mod lshift rshift and xor or pow"</span>
|
|
<span class="p">)</span>
|
|
<span class="n">inplace</span> <span class="o">=</span> <span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">'i</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">numerics</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
|
|
<span class="n">right</span> <span class="o">=</span> <span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">'r</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">numerics</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
|
|
|
|
<span class="c1"># not including __prepare__, __instancecheck__, __subclasscheck__</span>
|
|
<span class="c1"># (as they are metaclass methods)</span>
|
|
<span class="c1"># __del__ is not supported at all as it causes problems if it exists</span>
|
|
|
|
<span class="n">_non_defaults</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'__get__'</span><span class="p">,</span> <span class="s1">'__set__'</span><span class="p">,</span> <span class="s1">'__delete__'</span><span class="p">,</span> <span class="s1">'__reversed__'</span><span class="p">,</span> <span class="s1">'__missing__'</span><span class="p">,</span>
|
|
<span class="s1">'__reduce__'</span><span class="p">,</span> <span class="s1">'__reduce_ex__'</span><span class="p">,</span> <span class="s1">'__getinitargs__'</span><span class="p">,</span> <span class="s1">'__getnewargs__'</span><span class="p">,</span>
|
|
<span class="s1">'__getstate__'</span><span class="p">,</span> <span class="s1">'__setstate__'</span><span class="p">,</span> <span class="s1">'__getformat__'</span><span class="p">,</span>
|
|
<span class="s1">'__repr__'</span><span class="p">,</span> <span class="s1">'__dir__'</span><span class="p">,</span> <span class="s1">'__subclasses__'</span><span class="p">,</span> <span class="s1">'__format__'</span><span class="p">,</span>
|
|
<span class="s1">'__getnewargs_ex__'</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_method</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">func</span><span class="p">):</span>
|
|
<span class="s2">"Turns a callable object (like a mock) into a real function"</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
|
|
<span class="n">method</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">=</span> <span class="n">name</span>
|
|
<span class="k">return</span> <span class="n">method</span>
|
|
|
|
|
|
<span class="n">_magics</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'__</span><span class="si">%s</span><span class="s1">__'</span> <span class="o">%</span> <span class="n">method</span> <span class="k">for</span> <span class="n">method</span> <span class="ow">in</span>
|
|
<span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">magic_methods</span><span class="p">,</span> <span class="n">numerics</span><span class="p">,</span> <span class="n">inplace</span><span class="p">,</span> <span class="n">right</span><span class="p">])</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="c1"># Magic methods used for async `with` statements</span>
|
|
<span class="n">_async_method_magics</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"__aenter__"</span><span class="p">,</span> <span class="s2">"__aexit__"</span><span class="p">,</span> <span class="s2">"__anext__"</span><span class="p">}</span>
|
|
<span class="c1"># Magic methods that are only used with async calls but are synchronous functions themselves</span>
|
|
<span class="n">_sync_async_magics</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"__aiter__"</span><span class="p">}</span>
|
|
<span class="n">_async_magics</span> <span class="o">=</span> <span class="n">_async_method_magics</span> <span class="o">|</span> <span class="n">_sync_async_magics</span>
|
|
|
|
<span class="n">_all_sync_magics</span> <span class="o">=</span> <span class="n">_magics</span> <span class="o">|</span> <span class="n">_non_defaults</span>
|
|
<span class="n">_all_magics</span> <span class="o">=</span> <span class="n">_all_sync_magics</span> <span class="o">|</span> <span class="n">_async_magics</span>
|
|
|
|
<span class="n">_unsupported_magics</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'__getattr__'</span><span class="p">,</span> <span class="s1">'__setattr__'</span><span class="p">,</span>
|
|
<span class="s1">'__init__'</span><span class="p">,</span> <span class="s1">'__new__'</span><span class="p">,</span> <span class="s1">'__prepare__'</span><span class="p">,</span>
|
|
<span class="s1">'__instancecheck__'</span><span class="p">,</span> <span class="s1">'__subclasscheck__'</span><span class="p">,</span>
|
|
<span class="s1">'__del__'</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n">_calculate_return_value</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'__hash__'</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
|
|
<span class="s1">'__str__'</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
|
|
<span class="s1">'__sizeof__'</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="nb">object</span><span class="o">.</span><span class="n">__sizeof__</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
|
|
<span class="s1">'__fspath__'</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_extract_mock_name</span><span class="p">()</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="n">_return_values</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'__lt__'</span><span class="p">:</span> <span class="bp">NotImplemented</span><span class="p">,</span>
|
|
<span class="s1">'__gt__'</span><span class="p">:</span> <span class="bp">NotImplemented</span><span class="p">,</span>
|
|
<span class="s1">'__le__'</span><span class="p">:</span> <span class="bp">NotImplemented</span><span class="p">,</span>
|
|
<span class="s1">'__ge__'</span><span class="p">:</span> <span class="bp">NotImplemented</span><span class="p">,</span>
|
|
<span class="s1">'__int__'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
|
|
<span class="s1">'__contains__'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="s1">'__len__'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
|
|
<span class="s1">'__exit__'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="s1">'__complex__'</span><span class="p">:</span> <span class="mi">1</span><span class="n">j</span><span class="p">,</span>
|
|
<span class="s1">'__float__'</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">,</span>
|
|
<span class="s1">'__bool__'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
|
<span class="s1">'__index__'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
|
|
<span class="s1">'__aexit__'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_eq</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="n">other</span><span class="p">):</span>
|
|
<span class="n">ret_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__eq__</span><span class="o">.</span><span class="n">_mock_return_value</span>
|
|
<span class="k">if</span> <span class="n">ret_val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">ret_val</span>
|
|
<span class="k">if</span> <span class="bp">self</span> <span class="ow">is</span> <span class="n">other</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="bp">NotImplemented</span>
|
|
<span class="k">return</span> <span class="fm">__eq__</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_ne</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__ne__</span><span class="p">(</span><span class="n">other</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__ne__</span><span class="o">.</span><span class="n">_mock_return_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">DEFAULT</span>
|
|
<span class="k">if</span> <span class="bp">self</span> <span class="ow">is</span> <span class="n">other</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">return</span> <span class="bp">NotImplemented</span>
|
|
<span class="k">return</span> <span class="fm">__ne__</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_iter</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">():</span>
|
|
<span class="n">ret_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__iter__</span><span class="o">.</span><span class="n">_mock_return_value</span>
|
|
<span class="k">if</span> <span class="n">ret_val</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">iter</span><span class="p">([])</span>
|
|
<span class="c1"># if ret_val was already an iterator, then calling iter on it should</span>
|
|
<span class="c1"># return the iterator unchanged</span>
|
|
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="n">ret_val</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="fm">__iter__</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_async_iter</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__aiter__</span><span class="p">():</span>
|
|
<span class="n">ret_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__aiter__</span><span class="o">.</span><span class="n">_mock_return_value</span>
|
|
<span class="k">if</span> <span class="n">ret_val</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_AsyncIterator</span><span class="p">(</span><span class="nb">iter</span><span class="p">([]))</span>
|
|
<span class="k">return</span> <span class="n">_AsyncIterator</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">ret_val</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="fm">__aiter__</span>
|
|
|
|
<span class="n">_side_effect_methods</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'__eq__'</span><span class="p">:</span> <span class="n">_get_eq</span><span class="p">,</span>
|
|
<span class="s1">'__ne__'</span><span class="p">:</span> <span class="n">_get_ne</span><span class="p">,</span>
|
|
<span class="s1">'__iter__'</span><span class="p">:</span> <span class="n">_get_iter</span><span class="p">,</span>
|
|
<span class="s1">'__aiter__'</span><span class="p">:</span> <span class="n">_get_async_iter</span>
|
|
<span class="p">}</span>
|
|
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_set_return_value</span><span class="p">(</span><span class="n">mock</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="n">fixed</span> <span class="o">=</span> <span class="n">_return_values</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">DEFAULT</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">fixed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="n">method</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">fixed</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">return_calculator</span> <span class="o">=</span> <span class="n">_calculate_return_value</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="k">if</span> <span class="n">return_calculator</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">return_value</span> <span class="o">=</span> <span class="n">return_calculator</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
|
|
<span class="n">method</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">return_value</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">side_effector</span> <span class="o">=</span> <span class="n">_side_effect_methods</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="k">if</span> <span class="n">side_effector</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">method</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">side_effector</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">MagicMixin</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_set_magics</span><span class="p">()</span> <span class="c1"># make magic work for kwargs in init</span>
|
|
<span class="n">_safe_super</span><span class="p">(</span><span class="n">MagicMixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_set_magics</span><span class="p">()</span> <span class="c1"># fix magic broken by upper level init</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_mock_set_magics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">orig_magics</span> <span class="o">=</span> <span class="n">_magics</span> <span class="o">|</span> <span class="n">_async_method_magics</span>
|
|
<span class="n">these_magics</span> <span class="o">=</span> <span class="n">orig_magics</span>
|
|
|
|
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"_mock_methods"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">these_magics</span> <span class="o">=</span> <span class="n">orig_magics</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_methods</span><span class="p">)</span>
|
|
|
|
<span class="n">remove_magics</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
|
<span class="n">remove_magics</span> <span class="o">=</span> <span class="n">orig_magics</span> <span class="o">-</span> <span class="n">these_magics</span>
|
|
|
|
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">remove_magics</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
|
|
<span class="c1"># remove unneeded magic methods</span>
|
|
<span class="nb">delattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">)</span>
|
|
|
|
<span class="c1"># don't overwrite existing attributes if called a second time</span>
|
|
<span class="n">these_magics</span> <span class="o">=</span> <span class="n">these_magics</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
|
|
|
|
<span class="n">_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">these_magics</span><span class="p">:</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">_type</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">MagicProxy</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="bp">self</span><span class="p">))</span>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">NonCallableMagicMock</span><span class="p">(</span><span class="n">MagicMixin</span><span class="p">,</span> <span class="n">NonCallableMock</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A version of `MagicMock` that isn't callable."""</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">mock_add_spec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Add a spec to a mock. `spec` can either be an object or a</span>
|
|
<span class="sd"> list of strings. Only attributes on the `spec` can be fetched as</span>
|
|
<span class="sd"> attributes from the mock.</span>
|
|
|
|
<span class="sd"> If `spec_set` is True then only attributes on the spec can be set."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_add_spec</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_set_magics</span><span class="p">()</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">AsyncMagicMixin</span><span class="p">(</span><span class="n">MagicMixin</span><span class="p">):</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
<div class="viewcode-block" id="MagicMock">
|
|
<a class="viewcode-back" href="../../api/evennia.web.utils.tests.html#evennia.contrib.base_systems.custom_gametime.tests.MagicMock">[docs]</a>
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">MagicMock</span><span class="p">(</span><span class="n">MagicMixin</span><span class="p">,</span> <span class="n">Mock</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> MagicMock is a subclass of Mock with default implementations</span>
|
|
<span class="sd"> of most of the magic methods. You can use MagicMock without having to</span>
|
|
<span class="sd"> configure the magic methods yourself.</span>
|
|
|
|
<span class="sd"> If you use the `spec` or `spec_set` arguments then *only* magic</span>
|
|
<span class="sd"> methods that exist in the spec will be created.</span>
|
|
|
|
<span class="sd"> Attributes and the return value of a `MagicMock` will also be `MagicMocks`.</span>
|
|
<span class="sd"> """</span>
|
|
<div class="viewcode-block" id="MagicMock.mock_add_spec">
|
|
<a class="viewcode-back" href="../../api/evennia.web.utils.tests.html#evennia.contrib.base_systems.custom_gametime.tests.MagicMock.mock_add_spec">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">mock_add_spec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Add a spec to a mock. `spec` can either be an object or a</span>
|
|
<span class="sd"> list of strings. Only attributes on the `spec` can be fetched as</span>
|
|
<span class="sd"> attributes from the mock.</span>
|
|
|
|
<span class="sd"> If `spec_set` is True then only attributes on the spec can be set."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_add_spec</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_set_magics</span><span class="p">()</span></div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">MagicProxy</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</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="k">def</span><span class="w"> </span><span class="nf">create_mock</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
|
|
<span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span>
|
|
<span class="n">m</span> <span class="o">=</span> <span class="n">parent</span><span class="o">.</span><span class="n">_get_child_mock</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">entry</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="n">entry</span><span class="p">,</span>
|
|
<span class="n">_new_parent</span><span class="o">=</span><span class="n">parent</span><span class="p">)</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
|
|
<span class="n">_set_return_value</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">entry</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">m</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__get__</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">_type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_mock</span><span class="p">()</span>
|
|
|
|
|
|
<span class="n">_CODE_ATTRS</span> <span class="o">=</span> <span class="nb">dir</span><span class="p">(</span><span class="n">CodeType</span><span class="p">)</span>
|
|
<span class="n">_CODE_SIG</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">signature</span><span class="p">(</span><span class="n">partial</span><span class="p">(</span><span class="n">CodeType</span><span class="o">.</span><span class="fm">__init__</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">AsyncMockMixin</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
|
|
<span class="n">await_count</span> <span class="o">=</span> <span class="n">_delegating_property</span><span class="p">(</span><span class="s1">'await_count'</span><span class="p">)</span>
|
|
<span class="n">await_args</span> <span class="o">=</span> <span class="n">_delegating_property</span><span class="p">(</span><span class="s1">'await_args'</span><span class="p">)</span>
|
|
<span class="n">await_args_list</span> <span class="o">=</span> <span class="n">_delegating_property</span><span class="p">(</span><span class="s1">'await_args_list'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="c1"># iscoroutinefunction() checks _is_coroutine property to say if an</span>
|
|
<span class="c1"># object is a coroutine. Without this check it looks to see if it is a</span>
|
|
<span class="c1"># function/method, which in this case it is not (since it is an</span>
|
|
<span class="c1"># AsyncMock).</span>
|
|
<span class="c1"># It is set through __dict__ because when spec_set is True, this</span>
|
|
<span class="c1"># attribute is likely undefined.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_is_coroutine'</span><span class="p">]</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">coroutines</span><span class="o">.</span><span class="n">_is_coroutine</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_await_count'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_await_args'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_mock_await_args_list'</span><span class="p">]</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
<span class="n">code_mock</span> <span class="o">=</span> <span class="n">NonCallableMock</span><span class="p">(</span><span class="n">spec_set</span><span class="o">=</span><span class="n">_CODE_ATTRS</span><span class="p">)</span>
|
|
<span class="n">code_mock</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_spec_class"</span><span class="p">]</span> <span class="o">=</span> <span class="n">CodeType</span>
|
|
<span class="n">code_mock</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_spec_signature"</span><span class="p">]</span> <span class="o">=</span> <span class="n">_CODE_SIG</span>
|
|
<span class="n">code_mock</span><span class="o">.</span><span class="n">co_flags</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="n">inspect</span><span class="o">.</span><span class="n">CO_COROUTINE</span>
|
|
<span class="o">+</span> <span class="n">inspect</span><span class="o">.</span><span class="n">CO_VARARGS</span>
|
|
<span class="o">+</span> <span class="n">inspect</span><span class="o">.</span><span class="n">CO_VARKEYWORDS</span>
|
|
<span class="p">)</span>
|
|
<span class="n">code_mock</span><span class="o">.</span><span class="n">co_argcount</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">code_mock</span><span class="o">.</span><span class="n">co_varnames</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'args'</span><span class="p">,</span> <span class="s1">'kwargs'</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">code_mock</span><span class="o">.</span><span class="n">co_posonlyargcount</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="c1"># Python 3.7 and earlier.</span>
|
|
<span class="k">pass</span>
|
|
<span class="n">code_mock</span><span class="o">.</span><span class="n">co_kwonlyargcount</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'__code__'</span><span class="p">]</span> <span class="o">=</span> <span class="n">code_mock</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'__name__'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'AsyncMock'</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'__defaults__'</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'__kwdefaults__'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'__annotations__'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_execute_mock_call</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="c1"># This is nearly just like super(), except for special handling</span>
|
|
<span class="c1"># of coroutines</span>
|
|
|
|
<span class="n">_call</span> <span class="o">=</span> <span class="n">_Call</span><span class="p">((</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">),</span> <span class="n">two</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">await_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">await_args</span> <span class="o">=</span> <span class="n">_call</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">await_args_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_call</span><span class="p">)</span>
|
|
|
|
<span class="n">effect</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">side_effect</span>
|
|
<span class="k">if</span> <span class="n">effect</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">_is_exception</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">effect</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">_callable</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">effect</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
|
|
<span class="c1"># It is impossible to propagate a StopIteration</span>
|
|
<span class="c1"># through coroutines because of PEP 479</span>
|
|
<span class="k">raise</span> <span class="ne">StopAsyncIteration</span>
|
|
<span class="k">if</span> <span class="n">_is_exception</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">result</span>
|
|
<span class="k">elif</span> <span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">effect</span><span class="p">):</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">effect</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">effect</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_return_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">return_value</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_wraps</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">iscoroutinefunction</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_wraps</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_wraps</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_wraps</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">return_value</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_awaited</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Assert that the mock was awaited at least once.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">await_count</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Expected </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">'mock'</span><span class="si">}</span><span class="s2"> to have been awaited."</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_awaited_once</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Assert that the mock was awaited exactly once.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">await_count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">"Expected </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">'mock'</span><span class="si">}</span><span class="s2"> to have been awaited once."</span>
|
|
<span class="sa">f</span><span class="s2">" Awaited </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">await_count</span><span class="si">}</span><span class="s2"> times."</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_awaited_with</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Assert that the last await was with the specified arguments.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">await_args</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">expected</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_call_signature</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Expected await: </span><span class="si">{</span><span class="n">expected</span><span class="si">}</span><span class="se">\n</span><span class="s1">Not awaited'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_error_message</span><span class="p">():</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_failure_message</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'await'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">msg</span>
|
|
|
|
<span class="n">expected</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">_Call</span><span class="p">((</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">),</span> <span class="n">two</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
|
|
<span class="n">actual</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">await_args</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">actual</span> <span class="o">!=</span> <span class="n">expected</span><span class="p">:</span>
|
|
<span class="n">cause</span> <span class="o">=</span> <span class="n">expected</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">_error_message</span><span class="p">())</span> <span class="kn">from</span><span class="w"> </span><span class="nn">cause</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_awaited_once_with</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Assert that the mock was awaited exactly once and with the specified</span>
|
|
<span class="sd"> arguments.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">await_count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">"Expected </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">'mock'</span><span class="si">}</span><span class="s2"> to have been awaited once."</span>
|
|
<span class="sa">f</span><span class="s2">" Awaited </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">await_count</span><span class="si">}</span><span class="s2"> times."</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">assert_awaited_with</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_any_await</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Assert the mock has ever been awaited with the specified arguments.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="n">expected</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">_Call</span><span class="p">((</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">),</span> <span class="n">two</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
|
|
<span class="n">cause</span> <span class="o">=</span> <span class="n">expected</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="n">actual</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">await_args_list</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">cause</span> <span class="ow">or</span> <span class="n">expected</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_AnyComparer</span><span class="p">(</span><span class="n">actual</span><span class="p">):</span>
|
|
<span class="n">expected_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_call_signature</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span>
|
|
<span class="s1">'</span><span class="si">%s</span><span class="s1"> await not found'</span> <span class="o">%</span> <span class="n">expected_string</span>
|
|
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">cause</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_has_awaits</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">,</span> <span class="n">calls</span><span class="p">,</span> <span class="n">any_order</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Assert the mock has been awaited with the specified calls.</span>
|
|
<span class="sd"> The :attr:`await_args_list` list is checked for the awaits.</span>
|
|
|
|
<span class="sd"> If `any_order` is False (the default) then the awaits must be</span>
|
|
<span class="sd"> sequential. There can be extra calls before or after the</span>
|
|
<span class="sd"> specified awaits.</span>
|
|
|
|
<span class="sd"> If `any_order` is True then the awaits can be in any order, but</span>
|
|
<span class="sd"> they must all appear in :attr:`await_args_list`.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="n">expected</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">calls</span><span class="p">]</span>
|
|
<span class="n">cause</span> <span class="o">=</span> <span class="n">cause</span> <span class="o">=</span> <span class="nb">next</span><span class="p">((</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expected</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)),</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">all_awaits</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_call_matcher</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">await_args_list</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">any_order</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">expected</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">all_awaits</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">cause</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">problem</span> <span class="o">=</span> <span class="s1">'Awaits not found.'</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">problem</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'Error processing expected awaits.</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'Errors: </span><span class="si">{}</span><span class="s1">'</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="n">e</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expected</span><span class="p">])</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">problem</span><span class="si">}</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="sa">f</span><span class="s1">'Expected: </span><span class="si">{</span><span class="n">_CallList</span><span class="p">(</span><span class="n">calls</span><span class="p">)</span><span class="si">}</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="sa">f</span><span class="s1">'Actual: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">await_args_list</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">cause</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">all_awaits</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">all_awaits</span><span class="p">)</span>
|
|
|
|
<span class="n">not_found</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">kall</span> <span class="ow">in</span> <span class="n">expected</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">all_awaits</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">kall</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
|
<span class="n">not_found</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">kall</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">not_found</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span>
|
|
<span class="s1">'</span><span class="si">%r</span><span class="s1"> not all found in await list'</span> <span class="o">%</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">not_found</span><span class="p">),)</span>
|
|
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">cause</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assert_not_awaited</span><span class="p">(</span><span class="n">_mock_self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Assert that the mock was never awaited.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">_mock_self</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">await_count</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">"Expected </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">'mock'</span><span class="si">}</span><span class="s2"> to not have been awaited."</span>
|
|
<span class="sa">f</span><span class="s2">" Awaited </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">await_count</span><span class="si">}</span><span class="s2"> times."</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">reset_mock</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> See :func:`.Mock.reset_mock()`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">reset_mock</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">await_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">await_args</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">await_args_list</span> <span class="o">=</span> <span class="n">_CallList</span><span class="p">()</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">AsyncMock</span><span class="p">(</span><span class="n">AsyncMockMixin</span><span class="p">,</span> <span class="n">AsyncMagicMixin</span><span class="p">,</span> <span class="n">Mock</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Enhance :class:`Mock` with features allowing to mock</span>
|
|
<span class="sd"> an async function.</span>
|
|
|
|
<span class="sd"> The :class:`AsyncMock` object will behave so the object is</span>
|
|
<span class="sd"> recognized as an async function, and the result of a call is an awaitable:</span>
|
|
|
|
<span class="sd"> >>> mock = AsyncMock()</span>
|
|
<span class="sd"> >>> iscoroutinefunction(mock)</span>
|
|
<span class="sd"> True</span>
|
|
<span class="sd"> >>> inspect.isawaitable(mock())</span>
|
|
<span class="sd"> True</span>
|
|
|
|
|
|
<span class="sd"> The result of ``mock()`` is an async function which will have the outcome</span>
|
|
<span class="sd"> of ``side_effect`` or ``return_value``:</span>
|
|
|
|
<span class="sd"> - if ``side_effect`` is a function, the async function will return the</span>
|
|
<span class="sd"> result of that function,</span>
|
|
<span class="sd"> - if ``side_effect`` is an exception, the async function will raise the</span>
|
|
<span class="sd"> exception,</span>
|
|
<span class="sd"> - if ``side_effect`` is an iterable, the async function will return the</span>
|
|
<span class="sd"> next value of the iterable, however, if the sequence of result is</span>
|
|
<span class="sd"> exhausted, ``StopIteration`` is raised immediately,</span>
|
|
<span class="sd"> - if ``side_effect`` is not defined, the async function will return the</span>
|
|
<span class="sd"> value defined by ``return_value``, hence, by default, the async function</span>
|
|
<span class="sd"> returns a new :class:`AsyncMock` object.</span>
|
|
|
|
<span class="sd"> If the outcome of ``side_effect`` or ``return_value`` is an async function,</span>
|
|
<span class="sd"> the mock async function obtained when the mock object is called will be this</span>
|
|
<span class="sd"> async function itself (and not an async function returning an async</span>
|
|
<span class="sd"> function).</span>
|
|
|
|
<span class="sd"> The test author can also specify a wrapped object with ``wraps``. In this</span>
|
|
<span class="sd"> case, the :class:`Mock` object behavior is the same as with an</span>
|
|
<span class="sd"> :class:`.Mock` object: the wrapped object may have methods</span>
|
|
<span class="sd"> defined as async function functions.</span>
|
|
|
|
<span class="sd"> Based on Martin Richard's asynctest project.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_ANY</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="s2">"A helper object that compares equal to everything."</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__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">return</span> <span class="kc">True</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__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="kc">False</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'<ANY>'</span>
|
|
|
|
<span class="n">ANY</span> <span class="o">=</span> <span class="n">_ANY</span><span class="p">()</span>
|
|
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_format_call_signature</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="n">message</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">(</span><span class="si">%%</span><span class="s1">s)'</span> <span class="o">%</span> <span class="n">name</span>
|
|
<span class="n">formatted_args</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="n">args_string</span> <span class="o">=</span> <span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">repr</span><span class="p">(</span><span class="n">arg</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">kwargs_string</span> <span class="o">=</span> <span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span>
|
|
<span class="s1">'</span><span class="si">%s</span><span class="s1">=</span><span class="si">%r</span><span class="s1">'</span> <span class="o">%</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">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
|
|
<span class="p">])</span>
|
|
<span class="k">if</span> <span class="n">args_string</span><span class="p">:</span>
|
|
<span class="n">formatted_args</span> <span class="o">=</span> <span class="n">args_string</span>
|
|
<span class="k">if</span> <span class="n">kwargs_string</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">formatted_args</span><span class="p">:</span>
|
|
<span class="n">formatted_args</span> <span class="o">+=</span> <span class="s1">', '</span>
|
|
<span class="n">formatted_args</span> <span class="o">+=</span> <span class="n">kwargs_string</span>
|
|
|
|
<span class="k">return</span> <span class="n">message</span> <span class="o">%</span> <span class="n">formatted_args</span>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_Call</span><span class="p">(</span><span class="nb">tuple</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> A tuple for holding the results of a call to a mock, either in the form</span>
|
|
<span class="sd"> `(args, kwargs)` or `(name, args, kwargs)`.</span>
|
|
|
|
<span class="sd"> If args or kwargs are empty then a call tuple will compare equal to</span>
|
|
<span class="sd"> a tuple without those values. This makes comparisons less verbose::</span>
|
|
|
|
<span class="sd"> _Call(('name', (), {})) == ('name',)</span>
|
|
<span class="sd"> _Call(('name', (1,), {})) == ('name', (1,))</span>
|
|
<span class="sd"> _Call(((), {'a': 'b'})) == ({'a': 'b'},)</span>
|
|
|
|
<span class="sd"> The `_Call` object provides a useful shortcut for comparing with call::</span>
|
|
|
|
<span class="sd"> _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)</span>
|
|
<span class="sd"> _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)</span>
|
|
|
|
<span class="sd"> If the _Call has no name then it will match any name.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">two</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
|
<span class="n">from_kall</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="p">()</span>
|
|
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="n">_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_len</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
|
|
<span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">elif</span> <span class="n">_len</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">first</span><span class="p">,</span> <span class="n">second</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="n">first</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">second</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="n">second</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">kwargs</span> <span class="o">=</span> <span class="n">second</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span>
|
|
<span class="k">elif</span> <span class="n">_len</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">value</span><span class="p">,</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
|
<span class="n">args</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">kwargs</span> <span class="o">=</span> <span class="n">value</span>
|
|
|
|
<span class="k">if</span> <span class="n">two</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">tuple</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
|
|
|
|
<span class="k">return</span> <span class="nb">tuple</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">two</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
|
<span class="n">from_kall</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="o">=</span> <span class="n">name</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_parent</span> <span class="o">=</span> <span class="n">parent</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_from_kall</span> <span class="o">=</span> <span class="n">from_kall</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__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">try</span><span class="p">:</span>
|
|
<span class="n">len_other</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">NotImplemented</span>
|
|
|
|
<span class="n">self_name</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">self_args</span><span class="p">,</span> <span class="n">self_kwargs</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">self_name</span><span class="p">,</span> <span class="n">self_args</span><span class="p">,</span> <span class="n">self_kwargs</span> <span class="o">=</span> <span class="bp">self</span>
|
|
|
|
<span class="k">if</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="s1">'_mock_parent'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s1">'_mock_parent'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_parent</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">_mock_parent</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="n">other_name</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">if</span> <span class="n">len_other</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">other_args</span><span class="p">,</span> <span class="n">other_kwargs</span> <span class="o">=</span> <span class="p">(),</span> <span class="p">{}</span>
|
|
<span class="k">elif</span> <span class="n">len_other</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
|
|
<span class="n">other_name</span><span class="p">,</span> <span class="n">other_args</span><span class="p">,</span> <span class="n">other_kwargs</span> <span class="o">=</span> <span class="n">other</span>
|
|
<span class="k">elif</span> <span class="n">len_other</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">value</span><span class="p">,</span> <span class="o">=</span> <span class="n">other</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
|
<span class="n">other_args</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="n">other_kwargs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">other_name</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="n">other_args</span><span class="p">,</span> <span class="n">other_kwargs</span> <span class="o">=</span> <span class="p">(),</span> <span class="p">{}</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">other_args</span> <span class="o">=</span> <span class="p">()</span>
|
|
<span class="n">other_kwargs</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="k">elif</span> <span class="n">len_other</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="c1"># could be (name, args) or (name, kwargs) or (args, kwargs)</span>
|
|
<span class="n">first</span><span class="p">,</span> <span class="n">second</span> <span class="o">=</span> <span class="n">other</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">other_name</span> <span class="o">=</span> <span class="n">first</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">second</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
|
<span class="n">other_args</span><span class="p">,</span> <span class="n">other_kwargs</span> <span class="o">=</span> <span class="n">second</span><span class="p">,</span> <span class="p">{}</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">other_args</span><span class="p">,</span> <span class="n">other_kwargs</span> <span class="o">=</span> <span class="p">(),</span> <span class="n">second</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">other_args</span><span class="p">,</span> <span class="n">other_kwargs</span> <span class="o">=</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="k">if</span> <span class="n">self_name</span> <span class="ow">and</span> <span class="n">other_name</span> <span class="o">!=</span> <span class="n">self_name</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="c1"># this order is important for ANY to work!</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="n">other_args</span><span class="p">,</span> <span class="n">other_kwargs</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="n">self_args</span><span class="p">,</span> <span class="n">self_kwargs</span><span class="p">)</span>
|
|
|
|
|
|
<span class="fm">__ne__</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__ne__</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_Call</span><span class="p">((</span><span class="s1">''</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s1">'()'</span><span class="p">)</span>
|
|
|
|
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="o">+</span> <span class="s1">'()'</span>
|
|
<span class="k">return</span> <span class="n">_Call</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_Call</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">attr</span><span class="p">,</span> <span class="n">from_kall</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">_Call</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">from_kall</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">attr</span> <span class="ow">in</span> <span class="nb">tuple</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">AttributeError</span>
|
|
<span class="k">return</span> <span class="nb">tuple</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_call_arguments</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span>
|
|
|
|
<span class="k">return</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">args</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">_get_call_arguments</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">kwargs</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">_get_call_arguments</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_from_kall</span><span class="p">:</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span> <span class="ow">or</span> <span class="s1">'call'</span>
|
|
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'()'</span><span class="p">):</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="s1">'call</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">name</span>
|
|
<span class="k">return</span> <span class="n">name</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="s1">'call'</span>
|
|
<span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">name</span><span class="p">:</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="s1">'call'</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'()'</span><span class="p">):</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="s1">'call.</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">name</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="s1">'call</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">name</span>
|
|
<span class="k">return</span> <span class="n">_format_call_signature</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">call_list</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""For a call object that represents multiple calls, `call_list`</span>
|
|
<span class="sd"> returns a list of all the intermediate calls as well as the</span>
|
|
<span class="sd"> final call."""</span>
|
|
<span class="n">vals</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">thing</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="k">while</span> <span class="n">thing</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">thing</span><span class="o">.</span><span class="n">_mock_from_kall</span><span class="p">:</span>
|
|
<span class="n">vals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">thing</span><span class="p">)</span>
|
|
<span class="n">thing</span> <span class="o">=</span> <span class="n">thing</span><span class="o">.</span><span class="n">_mock_parent</span>
|
|
<span class="k">return</span> <span class="n">_CallList</span><span class="p">(</span><span class="nb">reversed</span><span class="p">(</span><span class="n">vals</span><span class="p">))</span>
|
|
|
|
|
|
<span class="n">call</span> <span class="o">=</span> <span class="n">_Call</span><span class="p">(</span><span class="n">from_kall</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">create_autospec</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">_parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">unsafe</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Create a mock object using another object as a spec. Attributes on the</span>
|
|
<span class="sd"> mock will use the corresponding attribute on the `spec` object as their</span>
|
|
<span class="sd"> spec.</span>
|
|
|
|
<span class="sd"> Functions or methods being mocked will have their arguments checked</span>
|
|
<span class="sd"> to check that they are called with the correct signature.</span>
|
|
|
|
<span class="sd"> If `spec_set` is True then attempting to set attributes that don't exist</span>
|
|
<span class="sd"> on the spec object will raise an `AttributeError`.</span>
|
|
|
|
<span class="sd"> If a class is used as a spec then the return value of the mock (the</span>
|
|
<span class="sd"> instance of the class) will have the same spec. You can use a class as the</span>
|
|
<span class="sd"> spec for an instance object by passing `instance=True`. The returned mock</span>
|
|
<span class="sd"> will only be callable if instances of the mock are callable.</span>
|
|
|
|
<span class="sd"> `create_autospec` will raise a `RuntimeError` if passed some common</span>
|
|
<span class="sd"> misspellings of the arguments autospec and spec_set. Pass the argument</span>
|
|
<span class="sd"> `unsafe` with the value True to disable that check.</span>
|
|
|
|
<span class="sd"> `create_autospec` also takes arbitrary keyword arguments that are passed to</span>
|
|
<span class="sd"> the constructor of the created mock."""</span>
|
|
<span class="k">if</span> <span class="n">_is_list</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="c1"># can't pass a list instance to the mock constructor as it will be</span>
|
|
<span class="c1"># interpreted as a list of strings</span>
|
|
<span class="n">spec</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
|
|
|
<span class="n">is_type</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_is_instance_mock</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">InvalidSpecError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot autospec a Mock object. '</span>
|
|
<span class="sa">f</span><span class="s1">'[object=</span><span class="si">{</span><span class="n">spec</span><span class="si">!r}</span><span class="s1">]'</span><span class="p">)</span>
|
|
<span class="n">is_async_func</span> <span class="o">=</span> <span class="n">_is_async_func</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
|
<span class="n">_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'spec'</span><span class="p">:</span> <span class="n">spec</span><span class="p">}</span>
|
|
<span class="k">if</span> <span class="n">spec_set</span><span class="p">:</span>
|
|
<span class="n">_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'spec_set'</span><span class="p">:</span> <span class="n">spec</span><span class="p">}</span>
|
|
<span class="k">elif</span> <span class="n">spec</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># None we mock with a normal mock without a spec</span>
|
|
<span class="n">_kwargs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">if</span> <span class="n">_kwargs</span> <span class="ow">and</span> <span class="n">instance</span><span class="p">:</span>
|
|
<span class="n">_kwargs</span><span class="p">[</span><span class="s1">'_spec_as_instance'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">unsafe</span><span class="p">:</span>
|
|
<span class="n">_check_spec_arg_typos</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="n">_kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">MagicMock</span>
|
|
<span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isdatadescriptor</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="c1"># descriptors don't have a spec</span>
|
|
<span class="c1"># because we don't know what type they return</span>
|
|
<span class="n">_kwargs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">elif</span> <span class="n">is_async_func</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">instance</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"Instance can not be True when create_autospec "</span>
|
|
<span class="s2">"is mocking an async function"</span><span class="p">)</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">AsyncMock</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">_callable</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">NonCallableMagicMock</span>
|
|
<span class="k">elif</span> <span class="n">is_type</span> <span class="ow">and</span> <span class="n">instance</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">_instance_callable</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="n">Klass</span> <span class="o">=</span> <span class="n">NonCallableMagicMock</span>
|
|
|
|
<span class="n">_name</span> <span class="o">=</span> <span class="n">_kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'name'</span><span class="p">,</span> <span class="n">_name</span><span class="p">)</span>
|
|
|
|
<span class="n">_new_name</span> <span class="o">=</span> <span class="n">_name</span>
|
|
<span class="k">if</span> <span class="n">_parent</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># for a top level object no _new_name should be set</span>
|
|
<span class="n">_new_name</span> <span class="o">=</span> <span class="s1">''</span>
|
|
|
|
<span class="n">mock</span> <span class="o">=</span> <span class="n">Klass</span><span class="p">(</span><span class="n">parent</span><span class="o">=</span><span class="n">_parent</span><span class="p">,</span> <span class="n">_new_parent</span><span class="o">=</span><span class="n">_parent</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="n">_new_name</span><span class="p">,</span>
|
|
<span class="n">name</span><span class="o">=</span><span class="n">_name</span><span class="p">,</span> <span class="o">**</span><span class="n">_kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">FunctionTypes</span><span class="p">):</span>
|
|
<span class="c1"># should only happen at the top level because we don't</span>
|
|
<span class="c1"># recurse for functions</span>
|
|
<span class="k">if</span> <span class="n">is_async_func</span><span class="p">:</span>
|
|
<span class="n">mock</span> <span class="o">=</span> <span class="n">_set_async_signature</span><span class="p">(</span><span class="n">mock</span><span class="p">,</span> <span class="n">spec</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">mock</span> <span class="o">=</span> <span class="n">_set_signature</span><span class="p">(</span><span class="n">mock</span><span class="p">,</span> <span class="n">spec</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">_check_signature</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">mock</span><span class="p">,</span> <span class="n">is_type</span><span class="p">,</span> <span class="n">instance</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">_parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">instance</span><span class="p">:</span>
|
|
<span class="n">_parent</span><span class="o">.</span><span class="n">_mock_children</span><span class="p">[</span><span class="n">_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">mock</span>
|
|
|
|
<span class="k">if</span> <span class="n">is_type</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">instance</span> <span class="ow">and</span> <span class="s1">'return_value'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">create_autospec</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
|
<span class="n">_name</span><span class="o">=</span><span class="s1">'()'</span><span class="p">,</span> <span class="n">_parent</span><span class="o">=</span><span class="n">mock</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">_is_magic</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
|
|
<span class="c1"># MagicMock already does the useful magic methods for us</span>
|
|
<span class="k">continue</span>
|
|
|
|
<span class="c1"># XXXX do we need a better way of getting attributes without</span>
|
|
<span class="c1"># triggering code execution (?) Probably not - we need the actual</span>
|
|
<span class="c1"># object to mock it so we would rather trigger a property than mock</span>
|
|
<span class="c1"># the property descriptor. Likewise we want to mock out dynamically</span>
|
|
<span class="c1"># provided attributes.</span>
|
|
<span class="c1"># XXXX what about attributes that raise exceptions other than</span>
|
|
<span class="c1"># AttributeError on being fetched?</span>
|
|
<span class="c1"># we could be resilient against it, or catch and propagate the</span>
|
|
<span class="c1"># exception when the attribute is fetched from the mock</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">original</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">entry</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
|
|
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'spec'</span><span class="p">:</span> <span class="n">original</span><span class="p">}</span>
|
|
<span class="k">if</span> <span class="n">spec_set</span><span class="p">:</span>
|
|
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'spec_set'</span><span class="p">:</span> <span class="n">original</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">original</span><span class="p">,</span> <span class="n">FunctionTypes</span><span class="p">):</span>
|
|
<span class="n">new</span> <span class="o">=</span> <span class="n">_SpecState</span><span class="p">(</span><span class="n">original</span><span class="p">,</span> <span class="n">spec_set</span><span class="p">,</span> <span class="n">mock</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">instance</span><span class="p">)</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">_mock_children</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">parent</span> <span class="o">=</span> <span class="n">mock</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">FunctionTypes</span><span class="p">):</span>
|
|
<span class="n">parent</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">mock</span>
|
|
|
|
<span class="n">skipfirst</span> <span class="o">=</span> <span class="n">_must_skip</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">is_type</span><span class="p">)</span>
|
|
<span class="n">kwargs</span><span class="p">[</span><span class="s1">'_eat_self'</span><span class="p">]</span> <span class="o">=</span> <span class="n">skipfirst</span>
|
|
<span class="k">if</span> <span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">original</span><span class="p">):</span>
|
|
<span class="n">child_klass</span> <span class="o">=</span> <span class="n">AsyncMock</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">child_klass</span> <span class="o">=</span> <span class="n">MagicMock</span>
|
|
<span class="n">new</span> <span class="o">=</span> <span class="n">child_klass</span><span class="p">(</span><span class="n">parent</span><span class="o">=</span><span class="n">parent</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">entry</span><span class="p">,</span> <span class="n">_new_name</span><span class="o">=</span><span class="n">entry</span><span class="p">,</span>
|
|
<span class="n">_new_parent</span><span class="o">=</span><span class="n">parent</span><span class="p">,</span>
|
|
<span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">_mock_children</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span>
|
|
<span class="n">new</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">child_klass</span><span class="p">()</span>
|
|
<span class="n">_check_signature</span><span class="p">(</span><span class="n">original</span><span class="p">,</span> <span class="n">new</span><span class="p">,</span> <span class="n">skipfirst</span><span class="o">=</span><span class="n">skipfirst</span><span class="p">)</span>
|
|
|
|
<span class="c1"># so functions created with _set_signature become instance attributes,</span>
|
|
<span class="c1"># *plus* their underlying mock exists in _mock_children of the parent</span>
|
|
<span class="c1"># mock. Adding to _mock_children may be unnecessary where we are also</span>
|
|
<span class="c1"># setting as an instance attribute?</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">new</span><span class="p">,</span> <span class="n">FunctionTypes</span><span class="p">):</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="n">mock</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">new</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">mock</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_must_skip</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">is_type</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Return whether we should skip the first argument on spec's `entry`</span>
|
|
<span class="sd"> attribute.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="s1">'__dict__'</span><span class="p">,</span> <span class="p">{}):</span>
|
|
<span class="c1"># instance attribute - shouldn't skip</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="n">spec</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="vm">__class__</span>
|
|
|
|
<span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">spec</span><span class="o">.</span><span class="vm">__mro__</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">klass</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">DEFAULT</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="n">DEFAULT</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="p">(</span><span class="nb">staticmethod</span><span class="p">,</span> <span class="nb">classmethod</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">FunctionTypes</span><span class="p">):</span>
|
|
<span class="c1"># Normal method => skip if looked up on type</span>
|
|
<span class="c1"># (if looked up on instance, self is already skipped)</span>
|
|
<span class="k">return</span> <span class="n">is_type</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="c1"># function is a dynamically provided attribute</span>
|
|
<span class="k">return</span> <span class="n">is_type</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_SpecState</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spec</span><span class="p">,</span> <span class="n">spec_set</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ids</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">spec</span> <span class="o">=</span> <span class="n">spec</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ids</span> <span class="o">=</span> <span class="n">ids</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">spec_set</span> <span class="o">=</span> <span class="n">spec_set</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="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="n">instance</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="n">FunctionTypes</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="c1"># python function</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="n">create_autospec</span><span class="p">),</span>
|
|
<span class="c1"># instance method</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="n">ANY</span><span class="o">.</span><span class="fm">__eq__</span><span class="p">),</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
<span class="n">file_spec</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">open_spec</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_to_stream</span><span class="p">(</span><span class="n">read_data</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">read_data</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">io</span><span class="o">.</span><span class="n">BytesIO</span><span class="p">(</span><span class="n">read_data</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">(</span><span class="n">read_data</span><span class="p">)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="mock_open">
|
|
<a class="viewcode-back" href="../../api/evennia.server.profiling.tests.html#evennia.contrib.base_systems.custom_gametime.tests.mock_open">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">mock_open</span><span class="p">(</span><span class="n">mock</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">read_data</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> A helper function to create a mock to replace the use of `open`. It works</span>
|
|
<span class="sd"> for `open` called directly or used as a context manager.</span>
|
|
|
|
<span class="sd"> The `mock` argument is the mock object to configure. If `None` (the</span>
|
|
<span class="sd"> default) then a `MagicMock` will be created for you, with the API limited</span>
|
|
<span class="sd"> to methods or attributes available on standard file handles.</span>
|
|
|
|
<span class="sd"> `read_data` is a string for the `read`, `readline` and `readlines` of the</span>
|
|
<span class="sd"> file handle to return. This is an empty string by default.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">_read_data</span> <span class="o">=</span> <span class="n">_to_stream</span><span class="p">(</span><span class="n">read_data</span><span class="p">)</span>
|
|
<span class="n">_state</span> <span class="o">=</span> <span class="p">[</span><span class="n">_read_data</span><span class="p">,</span> <span class="kc">None</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_readlines_side_effect</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">handle</span><span class="o">.</span><span class="n">readlines</span><span class="o">.</span><span class="n">return_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">handle</span><span class="o">.</span><span class="n">readlines</span><span class="o">.</span><span class="n">return_value</span>
|
|
<span class="k">return</span> <span class="n">_state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">readlines</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_read_side_effect</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">handle</span><span class="o">.</span><span class="n">read</span><span class="o">.</span><span class="n">return_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">handle</span><span class="o">.</span><span class="n">read</span><span class="o">.</span><span class="n">return_value</span>
|
|
<span class="k">return</span> <span class="n">_state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_readline_side_effect</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">yield from</span> <span class="n">_iter_side_effect</span><span class="p">()</span>
|
|
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">_state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">readline</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_iter_side_effect</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="n">handle</span><span class="o">.</span><span class="n">readline</span><span class="o">.</span><span class="n">return_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">handle</span><span class="o">.</span><span class="n">readline</span><span class="o">.</span><span class="n">return_value</span>
|
|
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">_state</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
|
|
<span class="k">yield</span> <span class="n">line</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_next_side_effect</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="n">handle</span><span class="o">.</span><span class="n">readline</span><span class="o">.</span><span class="n">return_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">handle</span><span class="o">.</span><span class="n">readline</span><span class="o">.</span><span class="n">return_value</span>
|
|
<span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">_state</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_exit_side_effect</span><span class="p">(</span><span class="n">exctype</span><span class="p">,</span> <span class="n">excinst</span><span class="p">,</span> <span class="n">exctb</span><span class="p">):</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
|
|
<span class="k">global</span> <span class="n">file_spec</span>
|
|
<span class="k">if</span> <span class="n">file_spec</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">_io</span>
|
|
<span class="n">file_spec</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">dir</span><span class="p">(</span><span class="n">_io</span><span class="o">.</span><span class="n">TextIOWrapper</span><span class="p">))</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">dir</span><span class="p">(</span><span class="n">_io</span><span class="o">.</span><span class="n">BytesIO</span><span class="p">))))</span>
|
|
|
|
<span class="k">global</span> <span class="n">open_spec</span>
|
|
<span class="k">if</span> <span class="n">open_spec</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">_io</span>
|
|
<span class="n">open_spec</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">dir</span><span class="p">(</span><span class="n">_io</span><span class="o">.</span><span class="n">open</span><span class="p">)))</span>
|
|
<span class="k">if</span> <span class="n">mock</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">mock</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">'open'</span><span class="p">,</span> <span class="n">spec</span><span class="o">=</span><span class="n">open_spec</span><span class="p">)</span>
|
|
|
|
<span class="n">handle</span> <span class="o">=</span> <span class="n">MagicMock</span><span class="p">(</span><span class="n">spec</span><span class="o">=</span><span class="n">file_spec</span><span class="p">)</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="fm">__enter__</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">handle</span>
|
|
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">write</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">read</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">readline</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">readlines</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">read</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">_read_side_effect</span>
|
|
<span class="n">_state</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">_readline_side_effect</span><span class="p">()</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">readline</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">_state</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">readlines</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">_readlines_side_effect</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="fm">__iter__</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">_iter_side_effect</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="fm">__next__</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">_next_side_effect</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="fm">__exit__</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">_exit_side_effect</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">reset_data</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="n">_state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">_to_stream</span><span class="p">(</span><span class="n">read_data</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">handle</span><span class="o">.</span><span class="n">readline</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">==</span> <span class="n">_state</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="c1"># Only reset the side effect if the user hasn't overridden it.</span>
|
|
<span class="n">_state</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">_readline_side_effect</span><span class="p">()</span>
|
|
<span class="n">handle</span><span class="o">.</span><span class="n">readline</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">_state</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">DEFAULT</span>
|
|
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">reset_data</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">handle</span>
|
|
<span class="k">return</span> <span class="n">mock</span></div>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">PropertyMock</span><span class="p">(</span><span class="n">Mock</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> A mock intended to be used as a property, or other descriptor, on a class.</span>
|
|
<span class="sd"> `PropertyMock` provides `__get__` and `__set__` methods so you can specify</span>
|
|
<span class="sd"> a return value when it is fetched.</span>
|
|
|
|
<span class="sd"> Fetching a `PropertyMock` instance from an object calls the mock, with</span>
|
|
<span class="sd"> no args. Setting it calls the mock with the value being set.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_child_mock</span><span class="p">(</span><span class="bp">self</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">MagicMock</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__get__</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">obj_type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="p">()</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__set__</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">val</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
|
|
|
|
|
|
<span class="n">_timeout_unset</span> <span class="o">=</span> <span class="n">sentinel</span><span class="o">.</span><span class="n">TIMEOUT_UNSET</span>
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">ThreadingMixin</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
|
|
|
|
<span class="n">DEFAULT_TIMEOUT</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_child_mock</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kw</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"parent"</span><span class="p">),</span> <span class="n">ThreadingMixin</span><span class="p">):</span>
|
|
<span class="n">kw</span><span class="p">[</span><span class="s2">"timeout"</span><span class="p">]</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s2">"parent"</span><span class="p">]</span><span class="o">.</span><span class="n">_mock_wait_timeout</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kw</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_new_parent"</span><span class="p">),</span> <span class="n">ThreadingMixin</span><span class="p">):</span>
|
|
<span class="n">kw</span><span class="p">[</span><span class="s2">"timeout"</span><span class="p">]</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s2">"_new_parent"</span><span class="p">]</span><span class="o">.</span><span class="n">_mock_wait_timeout</span>
|
|
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_get_child_mock</span><span class="p">(</span><span class="o">**</span><span class="n">kw</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">_timeout_unset</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">timeout</span> <span class="ow">is</span> <span class="n">_timeout_unset</span><span class="p">:</span>
|
|
<span class="n">timeout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">DEFAULT_TIMEOUT</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_mock_event"</span><span class="p">]</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Event</span><span class="p">()</span> <span class="c1"># Event for any call</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_mock_calls_events"</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># Events for each of the calls</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_mock_calls_events_lock"</span><span class="p">]</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_mock_wait_timeout"</span><span class="p">]</span> <span class="o">=</span> <span class="n">timeout</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">reset_mock</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> See :func:`.Mock.reset_mock()`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">reset_mock</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_mock_event"</span><span class="p">]</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Event</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_mock_calls_events"</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">__get_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_args</span><span class="p">,</span> <span class="n">expected_kwargs</span><span class="p">):</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_calls_events_lock</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">,</span> <span class="n">event</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_calls_events</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="n">expected_args</span><span class="p">,</span> <span class="n">expected_kwargs</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">event</span>
|
|
<span class="n">new_event</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Event</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_calls_events</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expected_args</span><span class="p">,</span> <span class="n">expected_kwargs</span><span class="p">,</span> <span class="n">new_event</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">new_event</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_mock_call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="n">ret_value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_mock_call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="n">call_event</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__get_event</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">call_event</span><span class="o">.</span><span class="n">set</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_mock_event</span><span class="o">.</span><span class="n">set</span><span class="p">()</span>
|
|
|
|
<span class="k">return</span> <span class="n">ret_value</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">wait_until_called</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">_timeout_unset</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Wait until the mock object is called.</span>
|
|
|
|
<span class="sd"> `timeout` - time to wait for in seconds, waits forever otherwise.</span>
|
|
<span class="sd"> Defaults to the constructor provided timeout.</span>
|
|
<span class="sd"> Use None to block undefinetively.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">timeout</span> <span class="ow">is</span> <span class="n">_timeout_unset</span><span class="p">:</span>
|
|
<span class="n">timeout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_wait_timeout</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mock_event</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">):</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">'mock'</span><span class="si">}</span><span class="s2"> was not called before"</span>
|
|
<span class="sa">f</span><span class="s2">" timeout(</span><span class="si">{</span><span class="n">timeout</span><span class="si">}</span><span class="s2">)."</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">wait_until_any_call_with</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Wait until the mock object is called with given args.</span>
|
|
|
|
<span class="sd"> Waits for the timeout in seconds provided in the constructor.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">event</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__get_event</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">event</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_mock_wait_timeout</span><span class="p">):</span>
|
|
<span class="n">expected_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_mock_call_signature</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">expected_string</span><span class="si">}</span><span class="s1"> call not found'</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">ThreadingMock</span><span class="p">(</span><span class="n">ThreadingMixin</span><span class="p">,</span> <span class="n">MagicMixin</span><span class="p">,</span> <span class="n">Mock</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> A mock that can be used to wait until on calls happening</span>
|
|
<span class="sd"> in a different thread.</span>
|
|
|
|
<span class="sd"> The constructor can take a `timeout` argument which</span>
|
|
<span class="sd"> controls the timeout in seconds for all `wait` calls of the mock.</span>
|
|
|
|
<span class="sd"> You can change the default timeout of all instances via the</span>
|
|
<span class="sd"> `ThreadingMock.DEFAULT_TIMEOUT` attribute.</span>
|
|
|
|
<span class="sd"> If no timeout is set, it will block undefinetively.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">seal</span><span class="p">(</span><span class="n">mock</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Disable the automatic generation of child mocks.</span>
|
|
|
|
<span class="sd"> Given an input Mock, seals it to ensure no further mocks will be generated</span>
|
|
<span class="sd"> when accessing an attribute that was not already defined.</span>
|
|
|
|
<span class="sd"> The operation recursively seals the mock passed in, meaning that</span>
|
|
<span class="sd"> the mock itself, any mocks generated by accessing one of its attributes,</span>
|
|
<span class="sd"> and all assigned mocks without a name or spec will be sealed.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">mock</span><span class="o">.</span><span class="n">_mock_sealed</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">mock</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">m</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">mock</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">NonCallableMock</span><span class="p">):</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">_mock_children</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">attr</span><span class="p">),</span> <span class="n">_SpecState</span><span class="p">):</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="n">m</span><span class="o">.</span><span class="n">_mock_new_parent</span> <span class="ow">is</span> <span class="n">mock</span><span class="p">:</span>
|
|
<span class="n">seal</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_AsyncIterator</span><span class="p">:</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Wraps an iterator in an asynchronous iterator.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">iterator</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">iterator</span> <span class="o">=</span> <span class="n">iterator</span>
|
|
<span class="n">code_mock</span> <span class="o">=</span> <span class="n">NonCallableMock</span><span class="p">(</span><span class="n">spec_set</span><span class="o">=</span><span class="n">CodeType</span><span class="p">)</span>
|
|
<span class="n">code_mock</span><span class="o">.</span><span class="n">co_flags</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">CO_ITERABLE_COROUTINE</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'__code__'</span><span class="p">]</span> <span class="o">=</span> <span class="n">code_mock</span>
|
|
|
|
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="fm">__anext__</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="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iterator</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">raise</span> <span class="ne">StopAsyncIteration</span>
|
|
</pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../index.html">Evennia latest</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">mock.mock</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2024, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
|
|
</div>
|
|
</body>
|
|
</html> |