evennia/docs/5.x/_modules/mock/mock.html
2025-07-01 10:01:48 +02:00

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 &#8212; 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> &#187;</li>
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</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">&#39;Mock&#39;</span><span class="p">,</span>
<span class="s1">&#39;MagicMock&#39;</span><span class="p">,</span>
<span class="s1">&#39;patch&#39;</span><span class="p">,</span>
<span class="s1">&#39;sentinel&#39;</span><span class="p">,</span>
<span class="s1">&#39;DEFAULT&#39;</span><span class="p">,</span>
<span class="s1">&#39;ANY&#39;</span><span class="p">,</span>
<span class="s1">&#39;call&#39;</span><span class="p">,</span>
<span class="s1">&#39;create_autospec&#39;</span><span class="p">,</span>
<span class="s1">&#39;AsyncMock&#39;</span><span class="p">,</span>
<span class="s1">&#39;ThreadingMock&#39;</span><span class="p">,</span>
<span class="s1">&#39;FILTER_DIR&#39;</span><span class="p">,</span>
<span class="s1">&#39;NonCallableMock&#39;</span><span class="p">,</span>
<span class="s1">&#39;NonCallableMagicMock&#39;</span><span class="p">,</span>
<span class="s1">&#39;mock_open&#39;</span><span class="p">,</span>
<span class="s1">&#39;PropertyMock&#39;</span><span class="p">,</span>
<span class="s1">&#39;seal&#39;</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">&quot;&quot;&quot;Indicates that an invalid value was used as a mock spec.&quot;&quot;&quot;</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">&#39;_&#39;</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&#39;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">&#39;__func__&#39;</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">&#39;__func__&#39;</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">&#39;__code__&#39;</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&#39;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 &quot;mock&quot; 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">&#39;mock&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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&#39;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&#39;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">&#39;__name__&#39;</span><span class="p">,</span> <span class="s1">&#39;__doc__&#39;</span><span class="p">,</span> <span class="s1">&#39;__text_signature__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__module__&#39;</span><span class="p">,</span> <span class="s1">&#39;__defaults__&#39;</span><span class="p">,</span> <span class="s1">&#39;__kwdefaults__&#39;</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">&#39;__call__&#39;</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">&quot;&quot;&quot;Given an object, return True if the object is callable.</span>
<span class="sd"> For classes, return True if instances would be callable.&quot;&quot;&quot;</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">&#39;__call__&#39;</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">&#39;__call__&#39;</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">&#39;funcopy&#39;</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;_checksig_&#39;</span><span class="p">:</span> <span class="n">checksig</span><span class="p">,</span> <span class="s1">&#39;mock&#39;</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">&quot;&quot;&quot;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)&quot;&quot;&quot;</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">&#39;_checksig_&#39;</span><span class="p">:</span> <span class="n">checksig</span><span class="p">,</span> <span class="s1">&#39;mock&#39;</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">&quot;&quot;&quot;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)&quot;&quot;&quot;</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">&#39;assert_awaited&#39;</span><span class="p">,</span>
<span class="s1">&#39;assert_awaited_once&#39;</span><span class="p">,</span>
<span class="s1">&#39;assert_awaited_with&#39;</span><span class="p">,</span>
<span class="s1">&#39;assert_awaited_once_with&#39;</span><span class="p">,</span>
<span class="s1">&#39;assert_any_await&#39;</span><span class="p">,</span>
<span class="s1">&#39;assert_has_awaits&#39;</span><span class="p">,</span>
<span class="s1">&#39;assert_not_awaited&#39;</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">&#39;__</span><span class="si">%s</span><span class="s1">__&#39;</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">&quot;A unique, named, sentinel object.&quot;</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">&#39;sentinel.</span><span class="si">%s</span><span class="s1">&#39;</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">&#39;sentinel.</span><span class="si">%s</span><span class="s1">&#39;</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">&quot;&quot;&quot;Access attributes to return a named object, usable as a sentinel.&quot;&quot;&quot;</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">&#39;__bases__&#39;</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">&#39;sentinel&#39;</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">&#39;return_value&#39;</span><span class="p">,</span> <span class="s1">&#39;_mock_return_value&#39;</span><span class="p">,</span> <span class="s1">&#39;side_effect&#39;</span><span class="p">,</span>
<span class="s1">&#39;_mock_side_effect&#39;</span><span class="p">,</span> <span class="s1">&#39;_mock_parent&#39;</span><span class="p">,</span> <span class="s1">&#39;_mock_new_parent&#39;</span><span class="p">,</span>
<span class="s1">&#39;_mock_name&#39;</span><span class="p">,</span> <span class="s1">&#39;_mock_new_name&#39;</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">&#39;_mock_&#39;</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">&gt;</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">&quot;&quot;&quot;A non-callable version of `Mock`&quot;&quot;&quot;</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">&#39;&#39;</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">&#39;__doc__&#39;</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">&#39;&#39;</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">&#39;_mock_parent&#39;</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">&#39;_mock_name&#39;</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">&#39;_mock_new_name&#39;</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">&#39;_mock_new_parent&#39;</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">&#39;_mock_sealed&#39;</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">&#39;_mock_children&#39;</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">&#39;_mock_wraps&#39;</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">&#39;_mock_delegate&#39;</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">&#39;_mock_called&#39;</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">&#39;_mock_call_args&#39;</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">&#39;_mock_call_count&#39;</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">&#39;_mock_call_args_list&#39;</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">&#39;_mock_mock_calls&#39;</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">&#39;method_calls&#39;</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">&#39;_mock_unsafe&#39;</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">&quot;&quot;&quot;</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.&quot;&quot;&quot;</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">&#39;&#39;</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">&quot;&quot;&quot;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.&quot;&quot;&quot;</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">&#39;Cannot spec a Mock object. [object=</span><span class="si">{</span><span class="n">spec</span><span class="si">!r}</span><span class="s1">]&#39;</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">&#39;_spec_class&#39;</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">&#39;_spec_set&#39;</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">&#39;_spec_signature&#39;</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">&#39;_mock_methods&#39;</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">&#39;_spec_asyncs&#39;</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">&#39;()&#39;</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">&#39;()&#39;</span><span class="p">)</span>
<span class="n">__return_value_doc</span> <span class="o">=</span> <span class="s2">&quot;The value to be returned when the mock is called.&quot;</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">&#39;called&#39;</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">&#39;call_count&#39;</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">&#39;call_args&#39;</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">&#39;call_args_list&#39;</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">&#39;mock_calls&#39;</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">&quot;Restore the mock object to its initial state.&quot;</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">&quot;&quot;&quot;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"> &gt;&gt;&gt; attrs = {&#39;method.return_value&#39;: 3, &#39;other.side_effect&#39;: KeyError}</span>
<span class="sd"> &gt;&gt;&gt; mock.configure_mock(**attrs)&quot;&quot;&quot;</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">&#39;.&#39;</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">&#39;.&#39;</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">&#39;_mock_methods&#39;</span><span class="p">,</span> <span class="s1">&#39;_mock_unsafe&#39;</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">&quot;Mock object has no attribute </span><span class="si">%r</span><span class="s2">&quot;</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">&#39;assert&#39;</span><span class="p">,</span> <span class="s1">&#39;assret&#39;</span><span class="p">,</span> <span class="s1">&#39;asert&#39;</span><span class="p">,</span> <span class="s1">&#39;aseert&#39;</span><span class="p">,</span> <span class="s1">&#39;assrt&#39;</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">&quot;</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 &quot;</span>
<span class="sa">f</span><span class="s2">&quot;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.&quot;</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">&#39;_mock_name&#39;</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">&#39;Cannot autospec attr </span><span class="si">{</span><span class="n">name</span><span class="si">!r}</span><span class="s1"> from target &#39;</span>
<span class="sa">f</span><span class="s1">&#39;</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. &#39;</span>
<span class="sa">f</span><span class="s1">&#39;[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">]&#39;</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">&#39;.&#39;</span>
<span class="k">if</span> <span class="n">_name_list</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;()&#39;</span><span class="p">]:</span>
<span class="n">dot</span> <span class="o">=</span> <span class="s1">&#39;&#39;</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">&#39;.&#39;</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">&#39;()&#39;</span><span class="p">:</span>
<span class="n">dot</span> <span class="o">=</span> <span class="s1">&#39;&#39;</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">&#39;mock&#39;</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">&gt;</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">&#39;()&#39;</span><span class="p">,</span> <span class="s1">&#39;().&#39;</span><span class="p">):</span>
<span class="n">_first</span> <span class="o">+=</span> <span class="s1">&#39;.&#39;</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">&#39;&#39;</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">&#39;&#39;</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">&#39;mock&#39;</span><span class="p">,</span> <span class="s1">&#39;mock.&#39;</span><span class="p">):</span>
<span class="n">name_string</span> <span class="o">=</span> <span class="s1">&#39; name=</span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">name</span>
<span class="n">spec_string</span> <span class="o">=</span> <span class="s1">&#39;&#39;</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">&#39; spec=</span><span class="si">%r</span><span class="s1">&#39;</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">&#39; spec_set=</span><span class="si">%r</span><span class="s1">&#39;</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">&quot;&lt;</span><span class="si">%s%s%s</span><span class="s2"> id=&#39;</span><span class="si">%s</span><span class="s2">&#39;&gt;&quot;</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">&quot;&quot;&quot;Filter the output of `dir(mock)` to only useful members.&quot;&quot;&quot;</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">&#39;_&#39;</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">&#39;_&#39;</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">&quot;Mock object has no attribute &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</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">&#39;Attempting to set unsupported magic method </span><span class="si">%r</span><span class="s1">.&#39;</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">&quot;Mock object has no attribute &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</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">&#39;__class__&#39;</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">&#39;</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">&#39;</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Cannot set </span><span class="si">{</span><span class="n">mock_name</span><span class="si">}</span><span class="s1">&#39;</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">&#39;mock&#39;</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">&#39;call&#39;</span><span class="p">):</span>
<span class="n">message</span> <span class="o">=</span> <span class="s1">&#39;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">&#39;</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">&quot;&quot;&quot;</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 &#39;.&#39; 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"> &quot;&quot;&quot;</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">&#39;()&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</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">&quot;&quot;&quot;</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&#39;s signature,</span>
<span class="sd"> if available, or falls back on the arguments themselves.</span>
<span class="sd"> &quot;&quot;&quot;</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">&gt;</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">&#39;&#39;</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">&quot;&quot;&quot;assert that the mock was never called.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;Expected &#39;</span><span class="si">%s</span><span class="s2">&#39; 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">&quot;</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">&#39;mock&#39;</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">&quot;&quot;&quot;assert that the mock was called at least once</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;Expected &#39;</span><span class="si">%s</span><span class="s2">&#39; to have been called.&quot;</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">&#39;mock&#39;</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">&quot;&quot;&quot;assert that the mock was called only once.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;Expected &#39;</span><span class="si">%s</span><span class="s2">&#39; 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">&quot;</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">&#39;mock&#39;</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">&quot;&quot;&quot;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.&quot;&quot;&quot;</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">&#39;not called.&#39;</span>
<span class="n">error_message</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;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">&#39;</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">&quot;&quot;&quot;assert that the mock was called exactly once and that that call was</span>
<span class="sd"> with the specified arguments.&quot;&quot;&quot;</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">&quot;Expected &#39;</span><span class="si">%s</span><span class="s2">&#39; to be called once. Called </span><span class="si">%s</span><span class="s2"> times.</span><span class="si">%s</span><span class="s2">&quot;</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">&#39;mock&#39;</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">&quot;&quot;&quot;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`.&quot;&quot;&quot;</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">&#39;Calls not found.&#39;</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">&#39;Error processing expected calls.</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="s1">&#39;Errors: </span><span class="si">{}</span><span class="s1">&#39;</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">&#39;</span><span class="si">{</span><span class="n">problem</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="sa">f</span><span class="s1">&#39;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">&#39;</span>
<span class="sa">f</span><span class="s1">&#39;</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">&quot;Actual&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</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">&#39;</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, &#39;</span>
<span class="s1">&#39;found </span><span class="si">%r</span><span class="s1"> instead&#39;</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">&#39;mock&#39;</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">&quot;&quot;&quot;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.&quot;&quot;&quot;</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">&#39;</span><span class="si">%s</span><span class="s1"> call not found&#39;</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">&quot;&quot;&quot;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).&quot;&quot;&quot;</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">&quot;.</span><span class="si">{</span><span class="n">kw</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="s2">&quot;name&quot;</span> <span class="ow">in</span> <span class="n">kw</span> <span class="k">else</span> <span class="s2">&quot;()&quot;</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">&quot;_new_name&quot;</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">&#39;_spec_asyncs&#39;</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">&quot;Calls&quot;</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Renders self.mock_calls as a string.</span>
<span class="sd"> Example: &quot;\nCalls: [call(1), call(2)].&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</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">.&quot;</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">&quot;assert_&quot;</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">&quot;assert_&quot;</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">&quot;&quot;&quot;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.&quot;&quot;&quot;</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">&#39;&#39;</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">&#39;_mock_return_value&#39;</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&#39;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">&#39;()&#39;</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">&#39;&#39;</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">&#39;.&#39;</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">&#39;&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">dot</span> <span class="o">=</span> <span class="s1">&#39;.&#39;</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">&#39;()&#39;</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">&quot;&quot;&quot;</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&#39;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&#39;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"> &quot;&quot;&quot;</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">&#39;.&#39;</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">&quot;.</span><span class="si">%s</span><span class="s2">&quot;</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&#39;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">&quot;autospect&quot;</span><span class="p">,</span> <span class="s2">&quot;auto_spec&quot;</span><span class="p">,</span> <span class="s2">&quot;set_spec&quot;</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">&quot;</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&quot;</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">&quot;Cannot use &#39;new&#39; and &#39;new_callable&#39; together&quot;</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">&quot;Cannot use &#39;autospec&#39; and &#39;new_callable&#39; together&quot;</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">&#39;Cannot spec attr </span><span class="si">{</span><span class="n">attribute</span><span class="si">!r}</span><span class="s1"> as the spec &#39;</span>
<span class="sa">f</span><span class="s1">&#39;has already been mocked out. [spec=</span><span class="si">{</span><span class="n">spec</span><span class="si">!r}</span><span class="s1">]&#39;</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">&#39;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 &#39;</span>
<span class="sa">f</span><span class="s1">&#39;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">]&#39;</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">&quot;__call__&quot;</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">&#39;patchings&#39;</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">&#39;patchings&#39;</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">&quot;</span><span class="si">%s</span><span class="s2"> does not have the attribute </span><span class="si">%r</span><span class="s2">&quot;</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">&quot;&quot;&quot;Perform the patch.&quot;&quot;&quot;</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">&quot;Can&#39;t specify spec and autospec&quot;</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">&quot;Can&#39;t provide explicit spec_set *and* spec or autospec&quot;</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">&quot;Can&#39;t use &#39;spec&#39; with create=True&quot;</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&#39;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">&#39;__call__&#39;</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">&#39;spec&#39;</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">&#39;spec_set&#39;</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">&#39;name&#39;</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">&#39;name&#39;</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">&#39;()&#39;</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">&quot;autospec creates the mock for you. Can&#39;t specify &quot;</span>
<span class="s2">&quot;autospec and new.&quot;</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">&quot;Can&#39;t use &#39;autospec&#39; with create=True&quot;</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">&#39;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 &#39;</span>
<span class="sa">f</span><span class="s1">&#39;target has already been mocked out. &#39;</span>
<span class="sa">f</span><span class="s1">&#39;[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">]&#39;</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">&#39;__name__&#39;</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">&#39;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 &#39;</span>
<span class="sa">f</span><span class="s1">&#39;</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. &#39;</span>
<span class="sa">f</span><span class="s1">&#39;[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">]&#39;</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&#39;t set keyword args when we aren&#39;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">&quot;Can&#39;t pass kwargs to a mock we aren&#39;t creating&quot;</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">&quot;&quot;&quot;Undo the patch.&quot;&quot;&quot;</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">&#39;__doc__&#39;</span><span class="p">,</span> <span class="s1">&#39;__module__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__defaults__&#39;</span><span class="p">,</span> <span class="s1">&#39;__annotations__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__kwdefaults__&#39;</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">&quot;&quot;&quot;Activate a patch, returning any created mock.&quot;&quot;&quot;</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">&quot;&quot;&quot;Stop an active patch.&quot;&quot;&quot;</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&#39;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">&#39;.&#39;</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">&quot;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">&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;</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&quot;</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">&quot;&quot;&quot;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=&#39;one&#39;, SECOND_PATCH=&#39;two&#39;):</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"> &quot;&quot;&quot;</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">&#39;Must supply at least one keyword argument with patch.multiple&#39;</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">&quot;&quot;&quot;</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 `&#39;package.module.ClassName&#39;`. 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 &#39;instance&#39;) 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&#39;t exist. If</span>
<span class="sd"> you pass in `create=True`, and the attribute doesn&#39;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&#39;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 &quot;as&quot; then the patched object will be bound to the name after the</span>
<span class="sd"> &quot;as&quot;; 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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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(&#39;sys.modules&#39;, 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"> &quot;&quot;&quot;</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">&quot;__call__&quot;</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">&quot;&quot;&quot;Patch the dict.&quot;&quot;&quot;</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">&quot;&quot;&quot;Unpatch the dict.&quot;&quot;&quot;</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">&quot;&quot;&quot;Activate a patch, returning any created mock.&quot;&quot;&quot;</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">&quot;&quot;&quot;Stop an active patch.&quot;&quot;&quot;</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&#39;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">&quot;&quot;&quot;Stop all active patches. LIFO to unroll nested patches.&quot;&quot;&quot;</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">&#39;test&#39;</span>
<span class="n">magic_methods</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;lt le gt ge eq ne &quot;</span>
<span class="s2">&quot;getitem setitem delitem &quot;</span>
<span class="s2">&quot;len contains iter &quot;</span>
<span class="s2">&quot;hash str sizeof &quot;</span>
<span class="s2">&quot;enter exit &quot;</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">&quot;divmod rdivmod neg pos abs invert &quot;</span>
<span class="s2">&quot;complex int float index &quot;</span>
<span class="s2">&quot;round trunc floor ceil &quot;</span>
<span class="s2">&quot;bool next &quot;</span>
<span class="s2">&quot;fspath &quot;</span>
<span class="s2">&quot;aiter &quot;</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">&#39;sizeof &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="n">numerics</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;add sub mul matmul truediv floordiv mod lshift rshift and xor or pow&quot;</span>
<span class="p">)</span>
<span class="n">inplace</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;i</span><span class="si">%s</span><span class="s1">&#39;</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">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;r</span><span class="si">%s</span><span class="s1">&#39;</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">&#39;__get__&#39;</span><span class="p">,</span> <span class="s1">&#39;__set__&#39;</span><span class="p">,</span> <span class="s1">&#39;__delete__&#39;</span><span class="p">,</span> <span class="s1">&#39;__reversed__&#39;</span><span class="p">,</span> <span class="s1">&#39;__missing__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__reduce__&#39;</span><span class="p">,</span> <span class="s1">&#39;__reduce_ex__&#39;</span><span class="p">,</span> <span class="s1">&#39;__getinitargs__&#39;</span><span class="p">,</span> <span class="s1">&#39;__getnewargs__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__getstate__&#39;</span><span class="p">,</span> <span class="s1">&#39;__setstate__&#39;</span><span class="p">,</span> <span class="s1">&#39;__getformat__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__repr__&#39;</span><span class="p">,</span> <span class="s1">&#39;__dir__&#39;</span><span class="p">,</span> <span class="s1">&#39;__subclasses__&#39;</span><span class="p">,</span> <span class="s1">&#39;__format__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__getnewargs_ex__&#39;</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">&quot;Turns a callable object (like a mock) into a real function&quot;</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">&#39;__</span><span class="si">%s</span><span class="s1">__&#39;</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">&#39; &#39;</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">&quot;__aenter__&quot;</span><span class="p">,</span> <span class="s2">&quot;__aexit__&quot;</span><span class="p">,</span> <span class="s2">&quot;__anext__&quot;</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">&quot;__aiter__&quot;</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">&#39;__getattr__&#39;</span><span class="p">,</span> <span class="s1">&#39;__setattr__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__init__&#39;</span><span class="p">,</span> <span class="s1">&#39;__new__&#39;</span><span class="p">,</span> <span class="s1">&#39;__prepare__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__instancecheck__&#39;</span><span class="p">,</span> <span class="s1">&#39;__subclasscheck__&#39;</span><span class="p">,</span>
<span class="s1">&#39;__del__&#39;</span>
<span class="p">}</span>
<span class="n">_calculate_return_value</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;__hash__&#39;</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">&#39;__str__&#39;</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">&#39;__sizeof__&#39;</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">&#39;__fspath__&#39;</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">&quot;</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">&quot;</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">&#39;__lt__&#39;</span><span class="p">:</span> <span class="bp">NotImplemented</span><span class="p">,</span>
<span class="s1">&#39;__gt__&#39;</span><span class="p">:</span> <span class="bp">NotImplemented</span><span class="p">,</span>
<span class="s1">&#39;__le__&#39;</span><span class="p">:</span> <span class="bp">NotImplemented</span><span class="p">,</span>
<span class="s1">&#39;__ge__&#39;</span><span class="p">:</span> <span class="bp">NotImplemented</span><span class="p">,</span>
<span class="s1">&#39;__int__&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s1">&#39;__contains__&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s1">&#39;__len__&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s1">&#39;__exit__&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s1">&#39;__complex__&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="n">j</span><span class="p">,</span>
<span class="s1">&#39;__float__&#39;</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">,</span>
<span class="s1">&#39;__bool__&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s1">&#39;__index__&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s1">&#39;__aexit__&#39;</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">&#39;__eq__&#39;</span><span class="p">:</span> <span class="n">_get_eq</span><span class="p">,</span>
<span class="s1">&#39;__ne__&#39;</span><span class="p">:</span> <span class="n">_get_ne</span><span class="p">,</span>
<span class="s1">&#39;__iter__&#39;</span><span class="p">:</span> <span class="n">_get_iter</span><span class="p">,</span>
<span class="s1">&#39;__aiter__&#39;</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">&quot;_mock_methods&quot;</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&#39;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">&quot;&quot;&quot;A version of `MagicMock` that isn&#39;t callable.&quot;&quot;&quot;</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">&quot;&quot;&quot;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.&quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;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.&quot;&quot;&quot;</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">&#39;await_count&#39;</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">&#39;await_args&#39;</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">&#39;await_args_list&#39;</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">&#39;_is_coroutine&#39;</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">&#39;_mock_await_count&#39;</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">&#39;_mock_await_args&#39;</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">&#39;_mock_await_args_list&#39;</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">&quot;_spec_class&quot;</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">&quot;_spec_signature&quot;</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">&#39;args&#39;</span><span class="p">,</span> <span class="s1">&#39;kwargs&#39;</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">&#39;__code__&#39;</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">&#39;__name__&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;AsyncMock&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">&#39;__defaults__&#39;</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">&#39;__kwdefaults__&#39;</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">&#39;__annotations__&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Assert that the mock was awaited at least once.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;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">&#39;mock&#39;</span><span class="si">}</span><span class="s2"> to have been awaited.&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Assert that the mock was awaited exactly once.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;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">&#39;mock&#39;</span><span class="si">}</span><span class="s2"> to have been awaited once.&quot;</span>
<span class="sa">f</span><span class="s2">&quot; 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.&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Assert that the last await was with the specified arguments.</span>
<span class="sd"> &quot;&quot;&quot;</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">&#39;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&#39;</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">&#39;await&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;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">&#39;mock&#39;</span><span class="si">}</span><span class="s2"> to have been awaited once.&quot;</span>
<span class="sa">f</span><span class="s2">&quot; 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.&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Assert the mock has ever been awaited with the specified arguments.</span>
<span class="sd"> &quot;&quot;&quot;</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">&#39;</span><span class="si">%s</span><span class="s1"> await not found&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;Awaits not found.&#39;</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">&#39;Error processing expected awaits.</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="s1">&#39;Errors: </span><span class="si">{}</span><span class="s1">&#39;</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">&#39;</span><span class="si">{</span><span class="n">problem</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="sa">f</span><span class="s1">&#39;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">&#39;</span>
<span class="sa">f</span><span class="s1">&#39;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">&#39;</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">&#39;</span><span class="si">%r</span><span class="s1"> not all found in await list&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Assert that the mock was never awaited.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;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">&#39;mock&#39;</span><span class="si">}</span><span class="s2"> to not have been awaited.&quot;</span>
<span class="sa">f</span><span class="s2">&quot; 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.&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> See :func:`.Mock.reset_mock()`</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &gt;&gt;&gt; mock = AsyncMock()</span>
<span class="sd"> &gt;&gt;&gt; iscoroutinefunction(mock)</span>
<span class="sd"> True</span>
<span class="sd"> &gt;&gt;&gt; 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&#39;s asynctest project.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;A helper object that compares equal to everything.&quot;</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">&#39;&lt;ANY&gt;&#39;</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">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%%</span><span class="s1">s)&#39;</span> <span class="o">%</span> <span class="n">name</span>
<span class="n">formatted_args</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="n">args_string</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</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">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span>
<span class="s1">&#39;</span><span class="si">%s</span><span class="s1">=</span><span class="si">%r</span><span class="s1">&#39;</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">&#39;, &#39;</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">&quot;&quot;&quot;</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((&#39;name&#39;, (), {})) == (&#39;name&#39;,)</span>
<span class="sd"> _Call((&#39;name&#39;, (1,), {})) == (&#39;name&#39;, (1,))</span>
<span class="sd"> _Call(((), {&#39;a&#39;: &#39;b&#39;})) == ({&#39;a&#39;: &#39;b&#39;},)</span>
<span class="sd"> The `_Call` object provides a useful shortcut for comparing with call::</span>
<span class="sd"> _Call(((1, 2), {&#39;a&#39;: 3})) == call(1, 2, a=3)</span>
<span class="sd"> _Call((&#39;foo&#39;, (1, 2), {&#39;a&#39;: 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"> &quot;&quot;&quot;</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">&#39;&#39;</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">&#39;&#39;</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">&#39;_mock_parent&#39;</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">&#39;_mock_parent&#39;</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">&#39;&#39;</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">&#39;&#39;</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">&#39;()&#39;</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">&#39;()&#39;</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">&#39;</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">&#39;</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">&#39;call&#39;</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">&#39;()&#39;</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;call</span><span class="si">%s</span><span class="s1">&#39;</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">&#39;call&#39;</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">&#39;call&#39;</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">&#39;()&#39;</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;call.</span><span class="si">%s</span><span class="s1">&#39;</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">&#39;call</span><span class="si">%s</span><span class="s1">&#39;</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">&quot;&quot;&quot;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.&quot;&quot;&quot;</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">&quot;&quot;&quot;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&#39;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.&quot;&quot;&quot;</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&#39;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">&#39;Cannot autospec a Mock object. &#39;</span>
<span class="sa">f</span><span class="s1">&#39;[object=</span><span class="si">{</span><span class="n">spec</span><span class="si">!r}</span><span class="s1">]&#39;</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">&#39;spec&#39;</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">&#39;spec_set&#39;</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">&#39;_spec_as_instance&#39;</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&#39;t have a spec</span>
<span class="c1"># because we don&#39;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">&quot;Instance can not be True when create_autospec &quot;</span>
<span class="s2">&quot;is mocking an async function&quot;</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">&#39;name&#39;</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">&#39;&#39;</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&#39;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">&#39;return_value&#39;</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">&#39;()&#39;</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">&#39;spec&#39;</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">&#39;spec_set&#39;</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">&#39;_eat_self&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return whether we should skip the first argument on spec&#39;s `entry`</span>
<span class="sd"> attribute.</span>
<span class="sd"> &quot;&quot;&quot;</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">&#39;__dict__&#39;</span><span class="p">,</span> <span class="p">{}):</span>
<span class="c1"># instance attribute - shouldn&#39;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 =&gt; 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">&#39;&#39;</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;open&#39;</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&#39;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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;parent&quot;</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">&quot;timeout&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s2">&quot;parent&quot;</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">&quot;_new_parent&quot;</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">&quot;timeout&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s2">&quot;_new_parent&quot;</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">&quot;_mock_event&quot;</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">&quot;_mock_calls_events&quot;</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">&quot;_mock_calls_events_lock&quot;</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">&quot;_mock_wait_timeout&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> See :func:`.Mock.reset_mock()`</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;_mock_event&quot;</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">&quot;_mock_calls_events&quot;</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">&quot;&quot;&quot;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"> &quot;&quot;&quot;</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">&quot;</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">&#39;mock&#39;</span><span class="si">}</span><span class="s2"> was not called before&quot;</span>
<span class="sa">f</span><span class="s2">&quot; timeout(</span><span class="si">{</span><span class="n">timeout</span><span class="si">}</span><span class="s2">).&quot;</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">&quot;&quot;&quot;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"> &quot;&quot;&quot;</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">&#39;</span><span class="si">{</span><span class="n">expected_string</span><span class="si">}</span><span class="s1"> call not found&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Wraps an iterator in an asynchronous iterator.</span>
<span class="sd"> &quot;&quot;&quot;</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">&#39;__code__&#39;</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> &#187;</li>
<li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">mock.mock</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2024, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>