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

1112 lines
No EOL
127 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>django.test.utils &#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="">django.test.utils</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 django.test.utils</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">collections</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">gc</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">re</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">time</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">contextlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">contextmanager</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="kn">from</span><span class="w"> </span><span class="nn">io</span><span class="w"> </span><span class="kn">import</span> <span class="n">StringIO</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">itertools</span><span class="w"> </span><span class="kn">import</span> <span class="n">chain</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">SimpleNamespace</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">unittest</span><span class="w"> </span><span class="kn">import</span> <span class="n">TestCase</span><span class="p">,</span> <span class="n">skipIf</span><span class="p">,</span> <span class="n">skipUnless</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">xml.dom.minidom</span><span class="w"> </span><span class="kn">import</span> <span class="n">Node</span><span class="p">,</span> <span class="n">parseString</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">asgiref.sync</span><span class="w"> </span><span class="kn">import</span> <span class="n">iscoroutinefunction</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.apps</span><span class="w"> </span><span class="kn">import</span> <span class="n">apps</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.apps.registry</span><span class="w"> </span><span class="kn">import</span> <span class="n">Apps</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.conf</span><span class="w"> </span><span class="kn">import</span> <span class="n">UserSettingsHolder</span><span class="p">,</span> <span class="n">settings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core</span><span class="w"> </span><span class="kn">import</span> <span class="n">mail</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.exceptions</span><span class="w"> </span><span class="kn">import</span> <span class="n">ImproperlyConfigured</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.signals</span><span class="w"> </span><span class="kn">import</span> <span class="n">request_started</span><span class="p">,</span> <span class="n">setting_changed</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db</span><span class="w"> </span><span class="kn">import</span> <span class="n">DEFAULT_DB_ALIAS</span><span class="p">,</span> <span class="n">connections</span><span class="p">,</span> <span class="n">reset_queries</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.options</span><span class="w"> </span><span class="kn">import</span> <span class="n">Options</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.template</span><span class="w"> </span><span class="kn">import</span> <span class="n">Template</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.test.signals</span><span class="w"> </span><span class="kn">import</span> <span class="n">template_rendered</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.urls</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_script_prefix</span><span class="p">,</span> <span class="n">set_script_prefix</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.translation</span><span class="w"> </span><span class="kn">import</span> <span class="n">deactivate</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.version</span><span class="w"> </span><span class="kn">import</span> <span class="n">PYPY</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">jinja2</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="n">jinja2</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;Approximate&quot;</span><span class="p">,</span>
<span class="s2">&quot;ContextList&quot;</span><span class="p">,</span>
<span class="s2">&quot;isolate_lru_cache&quot;</span><span class="p">,</span>
<span class="s2">&quot;garbage_collect&quot;</span><span class="p">,</span>
<span class="s2">&quot;get_runner&quot;</span><span class="p">,</span>
<span class="s2">&quot;CaptureQueriesContext&quot;</span><span class="p">,</span>
<span class="s2">&quot;ignore_warnings&quot;</span><span class="p">,</span>
<span class="s2">&quot;isolate_apps&quot;</span><span class="p">,</span>
<span class="s2">&quot;modify_settings&quot;</span><span class="p">,</span>
<span class="s2">&quot;override_settings&quot;</span><span class="p">,</span>
<span class="s2">&quot;override_system_checks&quot;</span><span class="p">,</span>
<span class="s2">&quot;tag&quot;</span><span class="p">,</span>
<span class="s2">&quot;requires_tz_support&quot;</span><span class="p">,</span>
<span class="s2">&quot;setup_databases&quot;</span><span class="p">,</span>
<span class="s2">&quot;setup_test_environment&quot;</span><span class="p">,</span>
<span class="s2">&quot;teardown_test_environment&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">TZ_SUPPORT</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">time</span><span class="p">,</span> <span class="s2">&quot;tzset&quot;</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Approximate</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">val</span><span class="p">,</span> <span class="n">places</span><span class="o">=</span><span class="mi">7</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="n">val</span>
<span class="bp">self</span><span class="o">.</span><span class="n">places</span> <span class="o">=</span> <span class="n">places</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="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</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="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">==</span> <span class="n">other</span> <span class="ow">or</span> <span class="nb">round</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">-</span> <span class="n">other</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">places</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ContextList</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A wrapper that provides direct key access to context items contained</span>
<span class="sd"> in a list of context objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">for</span> <span class="n">subcontext</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">subcontext</span><span class="p">:</span>
<span class="k">return</span> <span class="n">subcontext</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</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">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="n">default</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">key</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span><span class="w"> </span><span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Flattened keys of subcontexts.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">set</span><span class="p">(</span><span class="n">chain</span><span class="o">.</span><span class="n">from_iterable</span><span class="p">(</span><span class="n">d</span> <span class="k">for</span> <span class="n">subcontext</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">subcontext</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">instrumented_test_render</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An instrumented Template render method, providing a signal that can be</span>
<span class="sd"> intercepted by the test Client.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">template_rendered</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">template</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodelist</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_TestState</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">def</span><span class="w"> </span><span class="nf">setup_test_environment</span><span class="p">(</span><span class="n">debug</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Perform global pre-test setup, such as installing the instrumented template</span>
<span class="sd"> renderer and setting the email backend to the locmem email backend.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">_TestState</span><span class="p">,</span> <span class="s2">&quot;saved_data&quot;</span><span class="p">):</span>
<span class="c1"># Executing this function twice would overwrite the saved values.</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span>
<span class="s2">&quot;setup_test_environment() was already called and can&#39;t be called &quot;</span>
<span class="s2">&quot;again without first calling teardown_test_environment().&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">debug</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">debug</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEBUG</span>
<span class="n">saved_data</span> <span class="o">=</span> <span class="n">SimpleNamespace</span><span class="p">()</span>
<span class="n">_TestState</span><span class="o">.</span><span class="n">saved_data</span> <span class="o">=</span> <span class="n">saved_data</span>
<span class="n">saved_data</span><span class="o">.</span><span class="n">allowed_hosts</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">ALLOWED_HOSTS</span>
<span class="c1"># Add the default host of the test client.</span>
<span class="n">settings</span><span class="o">.</span><span class="n">ALLOWED_HOSTS</span> <span class="o">=</span> <span class="p">[</span><span class="o">*</span><span class="n">settings</span><span class="o">.</span><span class="n">ALLOWED_HOSTS</span><span class="p">,</span> <span class="s2">&quot;testserver&quot;</span><span class="p">]</span>
<span class="n">saved_data</span><span class="o">.</span><span class="n">debug</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEBUG</span>
<span class="n">settings</span><span class="o">.</span><span class="n">DEBUG</span> <span class="o">=</span> <span class="n">debug</span>
<span class="n">saved_data</span><span class="o">.</span><span class="n">email_backend</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">EMAIL_BACKEND</span>
<span class="n">settings</span><span class="o">.</span><span class="n">EMAIL_BACKEND</span> <span class="o">=</span> <span class="s2">&quot;django.core.mail.backends.locmem.EmailBackend&quot;</span>
<span class="n">saved_data</span><span class="o">.</span><span class="n">template_render</span> <span class="o">=</span> <span class="n">Template</span><span class="o">.</span><span class="n">_render</span>
<span class="n">Template</span><span class="o">.</span><span class="n">_render</span> <span class="o">=</span> <span class="n">instrumented_test_render</span>
<span class="n">mail</span><span class="o">.</span><span class="n">outbox</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">deactivate</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">teardown_test_environment</span><span class="p">():</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Perform any global post-test teardown, such as restoring the original</span>
<span class="sd"> template renderer and restoring the email sending functions.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">saved_data</span> <span class="o">=</span> <span class="n">_TestState</span><span class="o">.</span><span class="n">saved_data</span>
<span class="n">settings</span><span class="o">.</span><span class="n">ALLOWED_HOSTS</span> <span class="o">=</span> <span class="n">saved_data</span><span class="o">.</span><span class="n">allowed_hosts</span>
<span class="n">settings</span><span class="o">.</span><span class="n">DEBUG</span> <span class="o">=</span> <span class="n">saved_data</span><span class="o">.</span><span class="n">debug</span>
<span class="n">settings</span><span class="o">.</span><span class="n">EMAIL_BACKEND</span> <span class="o">=</span> <span class="n">saved_data</span><span class="o">.</span><span class="n">email_backend</span>
<span class="n">Template</span><span class="o">.</span><span class="n">_render</span> <span class="o">=</span> <span class="n">saved_data</span><span class="o">.</span><span class="n">template_render</span>
<span class="k">del</span> <span class="n">_TestState</span><span class="o">.</span><span class="n">saved_data</span>
<span class="k">del</span> <span class="n">mail</span><span class="o">.</span><span class="n">outbox</span>
<span class="k">def</span><span class="w"> </span><span class="nf">setup_databases</span><span class="p">(</span>
<span class="n">verbosity</span><span class="p">,</span>
<span class="n">interactive</span><span class="p">,</span>
<span class="o">*</span><span class="p">,</span>
<span class="n">time_keeper</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">keepdb</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">debug_sql</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">parallel</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">aliases</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">serialized_aliases</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="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Create the test databases.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">time_keeper</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">time_keeper</span> <span class="o">=</span> <span class="n">NullTimeKeeper</span><span class="p">()</span>
<span class="n">test_databases</span><span class="p">,</span> <span class="n">mirrored_aliases</span> <span class="o">=</span> <span class="n">get_unique_databases_and_mirrors</span><span class="p">(</span><span class="n">aliases</span><span class="p">)</span>
<span class="n">old_names</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">db_name</span><span class="p">,</span> <span class="n">aliases</span> <span class="ow">in</span> <span class="n">test_databases</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">first_alias</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span>
<span class="n">old_names</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">connection</span><span class="p">,</span> <span class="n">db_name</span><span class="p">,</span> <span class="n">first_alias</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">))</span>
<span class="c1"># Actually create the database for the first connection</span>
<span class="k">if</span> <span class="n">first_alias</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">first_alias</span> <span class="o">=</span> <span class="n">alias</span>
<span class="k">with</span> <span class="n">time_keeper</span><span class="o">.</span><span class="n">timed</span><span class="p">(</span><span class="s2">&quot; Creating &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">alias</span><span class="p">):</span>
<span class="n">serialize_alias</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">serialized_aliases</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">serialized_aliases</span>
<span class="p">)</span>
<span class="n">connection</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">create_test_db</span><span class="p">(</span>
<span class="n">verbosity</span><span class="o">=</span><span class="n">verbosity</span><span class="p">,</span>
<span class="n">autoclobber</span><span class="o">=</span><span class="ow">not</span> <span class="n">interactive</span><span class="p">,</span>
<span class="n">keepdb</span><span class="o">=</span><span class="n">keepdb</span><span class="p">,</span>
<span class="n">serialize</span><span class="o">=</span><span class="n">serialize_alias</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">parallel</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">parallel</span><span class="p">):</span>
<span class="k">with</span> <span class="n">time_keeper</span><span class="o">.</span><span class="n">timed</span><span class="p">(</span><span class="s2">&quot; Cloning &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">alias</span><span class="p">):</span>
<span class="n">connection</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">clone_test_db</span><span class="p">(</span>
<span class="n">suffix</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
<span class="n">verbosity</span><span class="o">=</span><span class="n">verbosity</span><span class="p">,</span>
<span class="n">keepdb</span><span class="o">=</span><span class="n">keepdb</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Configure all other connections as mirrors of the first one</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">connections</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">set_as_test_mirror</span><span class="p">(</span>
<span class="n">connections</span><span class="p">[</span><span class="n">first_alias</span><span class="p">]</span><span class="o">.</span><span class="n">settings_dict</span>
<span class="p">)</span>
<span class="c1"># Configure the test mirrors.</span>
<span class="k">for</span> <span class="n">alias</span><span class="p">,</span> <span class="n">mirror_alias</span> <span class="ow">in</span> <span class="n">mirrored_aliases</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">connections</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">set_as_test_mirror</span><span class="p">(</span>
<span class="n">connections</span><span class="p">[</span><span class="n">mirror_alias</span><span class="p">]</span><span class="o">.</span><span class="n">settings_dict</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">debug_sql</span><span class="p">:</span>
<span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">connections</span><span class="p">:</span>
<span class="n">connections</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">old_names</span>
<span class="k">def</span><span class="w"> </span><span class="nf">iter_test_cases</span><span class="p">(</span><span class="n">tests</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return an iterator over a test suite&#39;s unittest.TestCase objects.</span>
<span class="sd"> The tests argument can also be an iterable of TestCase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">test</span> <span class="ow">in</span> <span class="n">tests</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="c1"># Prevent an unfriendly RecursionError that can happen with</span>
<span class="c1"># strings.</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Test </span><span class="si">{</span><span class="n">test</span><span class="si">!r}</span><span class="s2"> must be a test case or test suite not string &quot;</span>
<span class="sa">f</span><span class="s2">&quot;(was found in </span><span class="si">{</span><span class="n">tests</span><span class="si">!r}</span><span class="s2">).&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="n">TestCase</span><span class="p">):</span>
<span class="k">yield</span> <span class="n">test</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Otherwise, assume it is a test suite.</span>
<span class="k">yield from</span> <span class="n">iter_test_cases</span><span class="p">(</span><span class="n">test</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">dependency_ordered</span><span class="p">(</span><span class="n">test_databases</span><span class="p">,</span> <span class="n">dependencies</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Reorder test_databases into an order that honors the dependencies</span>
<span class="sd"> described in TEST[DEPENDENCIES].</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">ordered_test_databases</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">resolved_databases</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="c1"># Maps db signature to dependencies of all its aliases</span>
<span class="n">dependencies_map</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># Check that no database depends on its own alias</span>
<span class="k">for</span> <span class="n">sig</span><span class="p">,</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">aliases</span><span class="p">)</span> <span class="ow">in</span> <span class="n">test_databases</span><span class="p">:</span>
<span class="n">all_deps</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">all_deps</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">dependencies</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="p">[]))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">all_deps</span><span class="o">.</span><span class="n">isdisjoint</span><span class="p">(</span><span class="n">aliases</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">&quot;Circular dependency: databases </span><span class="si">%r</span><span class="s2"> depend on each other, &quot;</span>
<span class="s2">&quot;but are aliases.&quot;</span> <span class="o">%</span> <span class="n">aliases</span>
<span class="p">)</span>
<span class="n">dependencies_map</span><span class="p">[</span><span class="n">sig</span><span class="p">]</span> <span class="o">=</span> <span class="n">all_deps</span>
<span class="k">while</span> <span class="n">test_databases</span><span class="p">:</span>
<span class="n">changed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">deferred</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># Try to find a DB that has all its dependencies met</span>
<span class="k">for</span> <span class="n">signature</span><span class="p">,</span> <span class="p">(</span><span class="n">db_name</span><span class="p">,</span> <span class="n">aliases</span><span class="p">)</span> <span class="ow">in</span> <span class="n">test_databases</span><span class="p">:</span>
<span class="k">if</span> <span class="n">dependencies_map</span><span class="p">[</span><span class="n">signature</span><span class="p">]</span><span class="o">.</span><span class="n">issubset</span><span class="p">(</span><span class="n">resolved_databases</span><span class="p">):</span>
<span class="n">resolved_databases</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">aliases</span><span class="p">)</span>
<span class="n">ordered_test_databases</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">signature</span><span class="p">,</span> <span class="p">(</span><span class="n">db_name</span><span class="p">,</span> <span class="n">aliases</span><span class="p">)))</span>
<span class="n">changed</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">deferred</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">signature</span><span class="p">,</span> <span class="p">(</span><span class="n">db_name</span><span class="p">,</span> <span class="n">aliases</span><span class="p">)))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">changed</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span><span class="s2">&quot;Circular dependency in TEST[DEPENDENCIES]&quot;</span><span class="p">)</span>
<span class="n">test_databases</span> <span class="o">=</span> <span class="n">deferred</span>
<span class="k">return</span> <span class="n">ordered_test_databases</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_unique_databases_and_mirrors</span><span class="p">(</span><span class="n">aliases</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Figure out which databases actually need to be created.</span>
<span class="sd"> Deduplicate entries in DATABASES that correspond the same database or are</span>
<span class="sd"> configured as test mirrors.</span>
<span class="sd"> Return two values:</span>
<span class="sd"> - test_databases: ordered mapping of signatures to (name, list of aliases)</span>
<span class="sd"> where all aliases share the same underlying database.</span>
<span class="sd"> - mirrored_aliases: mapping of mirror aliases to original aliases.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">aliases</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="n">connections</span>
<span class="n">mirrored_aliases</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">test_databases</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">dependencies</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">default_sig</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">DEFAULT_DB_ALIAS</span><span class="p">]</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">test_db_signature</span><span class="p">()</span>
<span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">connections</span><span class="p">:</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span>
<span class="n">test_settings</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">settings_dict</span><span class="p">[</span><span class="s2">&quot;TEST&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">test_settings</span><span class="p">[</span><span class="s2">&quot;MIRROR&quot;</span><span class="p">]:</span>
<span class="c1"># If the database is marked as a test mirror, save the alias.</span>
<span class="n">mirrored_aliases</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">test_settings</span><span class="p">[</span><span class="s2">&quot;MIRROR&quot;</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">aliases</span><span class="p">:</span>
<span class="c1"># Store a tuple with DB parameters that uniquely identify it.</span>
<span class="c1"># If we have two aliases with the same values for that tuple,</span>
<span class="c1"># we only need to create the test database once.</span>
<span class="n">item</span> <span class="o">=</span> <span class="n">test_databases</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span>
<span class="n">connection</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">test_db_signature</span><span class="p">(),</span>
<span class="p">(</span><span class="n">connection</span><span class="o">.</span><span class="n">settings_dict</span><span class="p">[</span><span class="s2">&quot;NAME&quot;</span><span class="p">],</span> <span class="p">[]),</span>
<span class="p">)</span>
<span class="c1"># The default database must be the first because data migrations</span>
<span class="c1"># use the default alias by default.</span>
<span class="k">if</span> <span class="n">alias</span> <span class="o">==</span> <span class="n">DEFAULT_DB_ALIAS</span><span class="p">:</span>
<span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;DEPENDENCIES&quot;</span> <span class="ow">in</span> <span class="n">test_settings</span><span class="p">:</span>
<span class="n">dependencies</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">test_settings</span><span class="p">[</span><span class="s2">&quot;DEPENDENCIES&quot;</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">alias</span> <span class="o">!=</span> <span class="n">DEFAULT_DB_ALIAS</span>
<span class="ow">and</span> <span class="n">connection</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">test_db_signature</span><span class="p">()</span> <span class="o">!=</span> <span class="n">default_sig</span>
<span class="p">):</span>
<span class="n">dependencies</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">test_settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;DEPENDENCIES&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">DEFAULT_DB_ALIAS</span><span class="p">]</span>
<span class="p">)</span>
<span class="n">test_databases</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">dependency_ordered</span><span class="p">(</span><span class="n">test_databases</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">dependencies</span><span class="p">))</span>
<span class="k">return</span> <span class="n">test_databases</span><span class="p">,</span> <span class="n">mirrored_aliases</span>
<span class="k">def</span><span class="w"> </span><span class="nf">teardown_databases</span><span class="p">(</span><span class="n">old_config</span><span class="p">,</span> <span class="n">verbosity</span><span class="p">,</span> <span class="n">parallel</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">keepdb</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Destroy all the non-mirror databases.&quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">connection</span><span class="p">,</span> <span class="n">old_name</span><span class="p">,</span> <span class="n">destroy</span> <span class="ow">in</span> <span class="n">old_config</span><span class="p">:</span>
<span class="k">if</span> <span class="n">destroy</span><span class="p">:</span>
<span class="k">if</span> <span class="n">parallel</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">parallel</span><span class="p">):</span>
<span class="n">connection</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">destroy_test_db</span><span class="p">(</span>
<span class="n">suffix</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
<span class="n">verbosity</span><span class="o">=</span><span class="n">verbosity</span><span class="p">,</span>
<span class="n">keepdb</span><span class="o">=</span><span class="n">keepdb</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">connection</span><span class="o">.</span><span class="n">creation</span><span class="o">.</span><span class="n">destroy_test_db</span><span class="p">(</span><span class="n">old_name</span><span class="p">,</span> <span class="n">verbosity</span><span class="p">,</span> <span class="n">keepdb</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_runner</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="n">test_runner_class</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">test_runner_class</span> <span class="o">=</span> <span class="n">test_runner_class</span> <span class="ow">or</span> <span class="n">settings</span><span class="o">.</span><span class="n">TEST_RUNNER</span>
<span class="n">test_path</span> <span class="o">=</span> <span class="n">test_runner_class</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
<span class="c1"># Allow for relative paths</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">test_path</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">test_module_name</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">test_path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">test_module_name</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>
<span class="n">test_module</span> <span class="o">=</span> <span class="nb">__import__</span><span class="p">(</span><span class="n">test_module_name</span><span class="p">,</span> <span class="p">{},</span> <span class="p">{},</span> <span class="n">test_path</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">test_module</span><span class="p">,</span> <span class="n">test_path</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">class</span><span class="w"> </span><span class="nc">TestContextDecorator</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A base class that can either be used as a context manager during tests</span>
<span class="sd"> or as a test function or unittest.TestCase subclass decorator to perform</span>
<span class="sd"> temporary alterations.</span>
<span class="sd"> `attr_name`: attribute assigned the return value of enable() if used as</span>
<span class="sd"> a class decorator.</span>
<span class="sd"> `kwarg_name`: keyword argument passing the return value of enable() if</span>
<span class="sd"> used as a function decorator.</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">attr_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">kwarg_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attr_name</span> <span class="o">=</span> <span class="n">attr_name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kwarg_name</span> <span class="o">=</span> <span class="n">kwarg_name</span>
<span class="k">def</span><span class="w"> </span><span class="nf">enable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span>
<span class="k">def</span><span class="w"> </span><span class="nf">disable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">enable</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="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">disable</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="bp">cls</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">TestCase</span><span class="p">):</span>
<span class="n">decorated_setUp</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">setUp</span>
<span class="k">def</span><span class="w"> </span><span class="nf">setUp</span><span class="p">(</span><span class="n">inner_self</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
<span class="n">inner_self</span><span class="o">.</span><span class="n">addCleanup</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">disable</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr_name</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">inner_self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr_name</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
<span class="n">decorated_setUp</span><span class="p">(</span><span class="n">inner_self</span><span class="p">)</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">setUp</span> <span class="o">=</span> <span class="n">setUp</span>
<span class="k">return</span> <span class="bp">cls</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Can only decorate subclasses of unittest.TestCase&quot;</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="k">if</span> <span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
<span class="c1"># If the inner function is an async function, we must execute async</span>
<span class="c1"># as well so that the `with` statement executes at the right time.</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">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">kwargs</span><span class="p">):</span>
<span class="k">with</span> <span class="bp">self</span> <span class="k">as</span> <span class="n">context</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwarg_name</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">kwarg_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</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">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="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">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">kwargs</span><span class="p">):</span>
<span class="k">with</span> <span class="bp">self</span> <span class="k">as</span> <span class="n">context</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwarg_name</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">kwarg_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</span>
<span class="k">return</span> <span class="n">func</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">inner</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">decorated</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">decorated</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">decorated</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">callable</span><span class="p">(</span><span class="n">decorated</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">decorated</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Cannot decorate object of type </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="n">decorated</span><span class="p">))</span>
<div class="viewcode-block" id="override_settings">
<a class="viewcode-back" href="../../../api/evennia.web.website.tests.html#evennia.commands.default.tests.override_settings">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">override_settings</span><span class="p">(</span><span class="n">TestContextDecorator</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Act as either a decorator or a context manager. If it&#39;s a decorator, take a</span>
<span class="sd"> function and return a wrapped function. If it&#39;s a contextmanager, use it</span>
<span class="sd"> with the ``with`` statement. In either event, entering/exiting are called</span>
<span class="sd"> before and after, respectively, the function/block is executed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">enable_exception</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="override_settings.__init__">
<a class="viewcode-back" href="../../../api/evennia.web.website.tests.html#evennia.commands.default.tests.override_settings.__init__">[docs]</a>
<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">kwargs</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="n">kwargs</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span></div>
<div class="viewcode-block" id="override_settings.enable">
<a class="viewcode-back" href="../../../api/evennia.web.website.tests.html#evennia.commands.default.tests.override_settings.enable">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">enable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Keep this code at the beginning to leave the settings unchanged</span>
<span class="c1"># in case it raises an exception because INSTALLED_APPS is invalid.</span>
<span class="k">if</span> <span class="s2">&quot;INSTALLED_APPS&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">apps</span><span class="o">.</span><span class="n">set_installed_apps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s2">&quot;INSTALLED_APPS&quot;</span><span class="p">])</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">apps</span><span class="o">.</span><span class="n">unset_installed_apps</span><span class="p">()</span>
<span class="k">raise</span>
<span class="n">override</span> <span class="o">=</span> <span class="n">UserSettingsHolder</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">override</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wrapped</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span>
<span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span> <span class="o">=</span> <span class="n">override</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">setting_changed</span><span class="o">.</span><span class="n">send</span><span class="p">(</span>
<span class="n">sender</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span>
<span class="n">setting</span><span class="o">=</span><span class="n">key</span><span class="p">,</span>
<span class="n">value</span><span class="o">=</span><span class="n">new_value</span><span class="p">,</span>
<span class="n">enter</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enable_exception</span> <span class="o">=</span> <span class="n">exc</span>
<span class="bp">self</span><span class="o">.</span><span class="n">disable</span><span class="p">()</span></div>
<div class="viewcode-block" id="override_settings.disable">
<a class="viewcode-back" href="../../../api/evennia.web.website.tests.html#evennia.commands.default.tests.override_settings.disable">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">disable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="s2">&quot;INSTALLED_APPS&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span>
<span class="n">apps</span><span class="o">.</span><span class="n">unset_installed_apps</span><span class="p">()</span>
<span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrapped</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrapped</span>
<span class="n">responses</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="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span>
<span class="n">new_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">responses_for_setting</span> <span class="o">=</span> <span class="n">setting_changed</span><span class="o">.</span><span class="n">send_robust</span><span class="p">(</span>
<span class="n">sender</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span>
<span class="n">setting</span><span class="o">=</span><span class="n">key</span><span class="p">,</span>
<span class="n">value</span><span class="o">=</span><span class="n">new_value</span><span class="p">,</span>
<span class="n">enter</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">responses</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">responses_for_setting</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enable_exception</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">exc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">enable_exception</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enable_exception</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">raise</span> <span class="n">exc</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">response</span> <span class="ow">in</span> <span class="n">responses</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">response</span></div>
<div class="viewcode-block" id="override_settings.save_options">
<a class="viewcode-back" href="../../../api/evennia.web.website.tests.html#evennia.commands.default.tests.override_settings.save_options">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">save_options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_func</span><span class="p">):</span>
<span class="k">if</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_overridden_settings</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">test_func</span><span class="o">.</span><span class="n">_overridden_settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Duplicate dict to prevent subclasses from altering their parent.</span>
<span class="n">test_func</span><span class="o">.</span><span class="n">_overridden_settings</span> <span class="o">=</span> <span class="p">{</span>
<span class="o">**</span><span class="n">test_func</span><span class="o">.</span><span class="n">_overridden_settings</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">,</span>
<span class="p">}</span></div>
<div class="viewcode-block" id="override_settings.decorate_class">
<a class="viewcode-back" href="../../../api/evennia.web.website.tests.html#evennia.commands.default.tests.override_settings.decorate_class">[docs]</a>
<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="bp">cls</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.test</span><span class="w"> </span><span class="kn">import</span> <span class="n">SimpleTestCase</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">SimpleTestCase</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Only subclasses of Django SimpleTestCase can be decorated &quot;</span>
<span class="s2">&quot;with override_settings&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">save_options</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">cls</span></div>
</div>
<span class="k">class</span><span class="w"> </span><span class="nc">modify_settings</span><span class="p">(</span><span class="n">override_settings</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Like override_settings, but makes it possible to append, prepend, or remove</span>
<span class="sd"> items instead of redefining the entire list.</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="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">args</span><span class="p">:</span>
<span class="c1"># Hack used when instantiating from SimpleTestCase.setUpClass.</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">kwargs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">operations</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="n">args</span>
<span class="bp">self</span><span class="o">.</span><span class="n">operations</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="nb">super</span><span class="p">(</span><span class="n">override_settings</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="k">def</span><span class="w"> </span><span class="nf">save_options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_func</span><span class="p">):</span>
<span class="k">if</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_modified_settings</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">test_func</span><span class="o">.</span><span class="n">_modified_settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Duplicate list to prevent subclasses from altering their parent.</span>
<span class="n">test_func</span><span class="o">.</span><span class="n">_modified_settings</span> <span class="o">=</span> <span class="p">(</span>
<span class="nb">list</span><span class="p">(</span><span class="n">test_func</span><span class="o">.</span><span class="n">_modified_settings</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">enable</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">options</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">operations</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># When called from SimpleTestCase.setUpClass, values may be</span>
<span class="c1"># overridden several times; cumulate changes.</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="p">[]))</span>
<span class="k">for</span> <span class="n">action</span><span class="p">,</span> <span class="n">items</span> <span class="ow">in</span> <span class="n">operations</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="c1"># items may be a single value or an iterable.</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">items</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">items</span> <span class="o">=</span> <span class="p">[</span><span class="n">items</span><span class="p">]</span>
<span class="k">if</span> <span class="n">action</span> <span class="o">==</span> <span class="s2">&quot;append&quot;</span><span class="p">:</span>
<span class="n">value</span> <span class="o">+=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s2">&quot;prepend&quot;</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span> <span class="o">+</span> <span class="n">value</span>
<span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s2">&quot;remove&quot;</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">value</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">items</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unsupported action: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">action</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">options</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="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
<span class="k">class</span><span class="w"> </span><span class="nc">override_system_checks</span><span class="p">(</span><span class="n">TestContextDecorator</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Act as a decorator. Override list of registered system checks.</span>
<span class="sd"> Useful when you override `INSTALLED_APPS`, e.g. if you exclude `auth` app,</span>
<span class="sd"> you also need to exclude its system checks.</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">new_checks</span><span class="p">,</span> <span class="n">deployment_checks</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.checks.registry</span><span class="w"> </span><span class="kn">import</span> <span class="n">registry</span>
<span class="bp">self</span><span class="o">.</span><span class="n">registry</span> <span class="o">=</span> <span class="n">registry</span>
<span class="bp">self</span><span class="o">.</span><span class="n">new_checks</span> <span class="o">=</span> <span class="n">new_checks</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deployment_checks</span> <span class="o">=</span> <span class="n">deployment_checks</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="k">def</span><span class="w"> </span><span class="nf">enable</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">old_checks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">registered_checks</span>
<span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">registered_checks</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">check</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">new_checks</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="o">*</span><span class="nb">getattr</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="p">()))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">old_deployment_checks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">deployment_checks</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">deployment_checks</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">registry</span><span class="o">.</span><span class="n">deployment_checks</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">check</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">deployment_checks</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="o">*</span><span class="nb">getattr</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="p">()),</span> <span class="n">deploy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">disable</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">registry</span><span class="o">.</span><span class="n">registered_checks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">old_checks</span>
<span class="bp">self</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">deployment_checks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">old_deployment_checks</span>
<span class="k">def</span><span class="w"> </span><span class="nf">compare_xml</span><span class="p">(</span><span class="n">want</span><span class="p">,</span> <span class="n">got</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Try to do a &#39;xml-comparison&#39; of want and got. Plain string comparison</span>
<span class="sd"> doesn&#39;t always work because, for example, attribute ordering should not be</span>
<span class="sd"> important. Ignore comment nodes, processing instructions, document type</span>
<span class="sd"> node, and leading and trailing whitespaces.</span>
<span class="sd"> Based on https://github.com/lxml/lxml/blob/master/src/lxml/doctestcompare.py</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_norm_whitespace_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;[ \t\n][ \t\n]+&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">norm_whitespace</span><span class="p">(</span><span class="n">v</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_norm_whitespace_re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">child_text</span><span class="p">(</span><span class="n">element</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">c</span><span class="o">.</span><span class="n">data</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">element</span><span class="o">.</span><span class="n">childNodes</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">nodeType</span> <span class="o">==</span> <span class="n">Node</span><span class="o">.</span><span class="n">TEXT_NODE</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">children</span><span class="p">(</span><span class="n">element</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">element</span><span class="o">.</span><span class="n">childNodes</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">nodeType</span> <span class="o">==</span> <span class="n">Node</span><span class="o">.</span><span class="n">ELEMENT_NODE</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">norm_child_text</span><span class="p">(</span><span class="n">element</span><span class="p">):</span>
<span class="k">return</span> <span class="n">norm_whitespace</span><span class="p">(</span><span class="n">child_text</span><span class="p">(</span><span class="n">element</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">attrs_dict</span><span class="p">(</span><span class="n">element</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="n">element</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check_element</span><span class="p">(</span><span class="n">want_element</span><span class="p">,</span> <span class="n">got_element</span><span class="p">):</span>
<span class="k">if</span> <span class="n">want_element</span><span class="o">.</span><span class="n">tagName</span> <span class="o">!=</span> <span class="n">got_element</span><span class="o">.</span><span class="n">tagName</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">norm_child_text</span><span class="p">(</span><span class="n">want_element</span><span class="p">)</span> <span class="o">!=</span> <span class="n">norm_child_text</span><span class="p">(</span><span class="n">got_element</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">attrs_dict</span><span class="p">(</span><span class="n">want_element</span><span class="p">)</span> <span class="o">!=</span> <span class="n">attrs_dict</span><span class="p">(</span><span class="n">got_element</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">want_children</span> <span class="o">=</span> <span class="n">children</span><span class="p">(</span><span class="n">want_element</span><span class="p">)</span>
<span class="n">got_children</span> <span class="o">=</span> <span class="n">children</span><span class="p">(</span><span class="n">got_element</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">want_children</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">got_children</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="nb">all</span><span class="p">(</span>
<span class="n">check_element</span><span class="p">(</span><span class="n">want</span><span class="p">,</span> <span class="n">got</span><span class="p">)</span> <span class="k">for</span> <span class="n">want</span><span class="p">,</span> <span class="n">got</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">want_children</span><span class="p">,</span> <span class="n">got_children</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">first_node</span><span class="p">(</span><span class="n">document</span><span class="p">):</span>
<span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">document</span><span class="o">.</span><span class="n">childNodes</span><span class="p">:</span>
<span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">nodeType</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span>
<span class="n">Node</span><span class="o">.</span><span class="n">COMMENT_NODE</span><span class="p">,</span>
<span class="n">Node</span><span class="o">.</span><span class="n">DOCUMENT_TYPE_NODE</span><span class="p">,</span>
<span class="n">Node</span><span class="o">.</span><span class="n">PROCESSING_INSTRUCTION_NODE</span><span class="p">,</span>
<span class="p">):</span>
<span class="k">return</span> <span class="n">node</span>
<span class="n">want</span> <span class="o">=</span> <span class="n">want</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">n&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">got</span> <span class="o">=</span> <span class="n">got</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">n&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="c1"># If the string is not a complete xml document, we may need to add a</span>
<span class="c1"># root element. This allow us to compare fragments, like &quot;&lt;foo/&gt;&lt;bar/&gt;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">want</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;&lt;?xml&quot;</span><span class="p">):</span>
<span class="n">wrapper</span> <span class="o">=</span> <span class="s2">&quot;&lt;root&gt;</span><span class="si">%s</span><span class="s2">&lt;/root&gt;&quot;</span>
<span class="n">want</span> <span class="o">=</span> <span class="n">wrapper</span> <span class="o">%</span> <span class="n">want</span>
<span class="n">got</span> <span class="o">=</span> <span class="n">wrapper</span> <span class="o">%</span> <span class="n">got</span>
<span class="c1"># Parse the want and got strings, and compare the parsings.</span>
<span class="n">want_root</span> <span class="o">=</span> <span class="n">first_node</span><span class="p">(</span><span class="n">parseString</span><span class="p">(</span><span class="n">want</span><span class="p">))</span>
<span class="n">got_root</span> <span class="o">=</span> <span class="n">first_node</span><span class="p">(</span><span class="n">parseString</span><span class="p">(</span><span class="n">got</span><span class="p">))</span>
<span class="k">return</span> <span class="n">check_element</span><span class="p">(</span><span class="n">want_root</span><span class="p">,</span> <span class="n">got_root</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">CaptureQueriesContext</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Context manager that captures queries executed by the specified connection.</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">connection</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="n">connection</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">captured_queries</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">captured_queries</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">captured_queries</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">captured_queries</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">connection</span><span class="o">.</span><span class="n">queries</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">initial_queries</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">final_queries</span><span class="p">]</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="bp">self</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">force_debug_cursor</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># Run any initialization queries if needed so that they won&#39;t be</span>
<span class="c1"># included as part of the count.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">ensure_connection</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initial_queries</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">queries_log</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">final_queries</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">request_started</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">reset_queries</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</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="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">force_debug_cursor</span>
<span class="n">request_started</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">reset_queries</span><span class="p">)</span>
<span class="k">if</span> <span class="n">exc_type</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">final_queries</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">queries_log</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ignore_warnings</span><span class="p">(</span><span class="n">TestContextDecorator</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">kwargs</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
<span class="k">if</span> <span class="s2">&quot;message&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span> <span class="ow">or</span> <span class="s2">&quot;module&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filter_func</span> <span class="o">=</span> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filter_func</span> <span class="o">=</span> <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</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="k">def</span><span class="w"> </span><span class="nf">enable</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">catch_warnings</span> <span class="o">=</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">catch_warnings</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">filter_func</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">disable</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">catch_warnings</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="c1"># On OSes that don&#39;t provide tzset (Windows), we can&#39;t set the timezone</span>
<span class="c1"># in which the program runs. As a consequence, we must skip tests that</span>
<span class="c1"># don&#39;t enforce a specific timezone (with timezone.override or equivalent),</span>
<span class="c1"># or attempt to interpret naive datetimes in the default timezone.</span>
<span class="n">requires_tz_support</span> <span class="o">=</span> <span class="n">skipUnless</span><span class="p">(</span>
<span class="n">TZ_SUPPORT</span><span class="p">,</span>
<span class="s2">&quot;This test relies on the ability to run a program in an arbitrary &quot;</span>
<span class="s2">&quot;time zone, but your operating system isn&#39;t able to do that.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="nd">@contextmanager</span>
<span class="k">def</span><span class="w"> </span><span class="nf">extend_sys_path</span><span class="p">(</span><span class="o">*</span><span class="n">paths</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Context manager to temporarily add paths to sys.path.&quot;&quot;&quot;</span>
<span class="n">_orig_sys_path</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">[:]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">paths</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">yield</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">_orig_sys_path</span>
<span class="nd">@contextmanager</span>
<span class="k">def</span><span class="w"> </span><span class="nf">isolate_lru_cache</span><span class="p">(</span><span class="n">lru_cache_object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Clear the cache of an LRU cache object on entering and exiting.&quot;&quot;&quot;</span>
<span class="n">lru_cache_object</span><span class="o">.</span><span class="n">cache_clear</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">yield</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">lru_cache_object</span><span class="o">.</span><span class="n">cache_clear</span><span class="p">()</span>
<span class="nd">@contextmanager</span>
<span class="k">def</span><span class="w"> </span><span class="nf">captured_output</span><span class="p">(</span><span class="n">stream_name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a context manager used by captured_stdout/stdin/stderr</span>
<span class="sd"> that temporarily replaces the sys stream *stream_name* with a StringIO.</span>
<span class="sd"> Note: This function and the following ``captured_std*`` are copied</span>
<span class="sd"> from CPython&#39;s ``test.support`` module.&quot;&quot;&quot;</span>
<span class="n">orig_stdout</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="n">stream_name</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="n">stream_name</span><span class="p">,</span> <span class="n">StringIO</span><span class="p">())</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">yield</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="n">stream_name</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="n">stream_name</span><span class="p">,</span> <span class="n">orig_stdout</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">captured_stdout</span><span class="p">():</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Capture the output of sys.stdout:</span>
<span class="sd"> with captured_stdout() as stdout:</span>
<span class="sd"> print(&quot;hello&quot;)</span>
<span class="sd"> self.assertEqual(stdout.getvalue(), &quot;hello\n&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">captured_output</span><span class="p">(</span><span class="s2">&quot;stdout&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">captured_stderr</span><span class="p">():</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Capture the output of sys.stderr:</span>
<span class="sd"> with captured_stderr() as stderr:</span>
<span class="sd"> print(&quot;hello&quot;, file=sys.stderr)</span>
<span class="sd"> self.assertEqual(stderr.getvalue(), &quot;hello\n&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">captured_output</span><span class="p">(</span><span class="s2">&quot;stderr&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">captured_stdin</span><span class="p">():</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Capture the input to sys.stdin:</span>
<span class="sd"> with captured_stdin() as stdin:</span>
<span class="sd"> stdin.write(&#39;hello\n&#39;)</span>
<span class="sd"> stdin.seek(0)</span>
<span class="sd"> # call test code that consumes from sys.stdin</span>
<span class="sd"> captured = input()</span>
<span class="sd"> self.assertEqual(captured, &quot;hello&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">captured_output</span><span class="p">(</span><span class="s2">&quot;stdin&quot;</span><span class="p">)</span>
<span class="nd">@contextmanager</span>
<span class="k">def</span><span class="w"> </span><span class="nf">freeze_time</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Context manager to temporarily freeze time.time(). This temporarily</span>
<span class="sd"> modifies the time function of the time module. Modules which import the</span>
<span class="sd"> time function directly (e.g. `from time import time`) won&#39;t be affected</span>
<span class="sd"> This isn&#39;t meant as a public API, but helps reduce some repetitive code in</span>
<span class="sd"> Django&#39;s test suite.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_real_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span>
<span class="n">time</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">t</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">yield</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">time</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="n">_real_time</span>
<span class="k">def</span><span class="w"> </span><span class="nf">require_jinja2</span><span class="p">(</span><span class="n">test_func</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Decorator to enable a Jinja2 template engine in addition to the regular</span>
<span class="sd"> Django template engine for a test or skip it if Jinja2 isn&#39;t available.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">test_func</span> <span class="o">=</span> <span class="n">skipIf</span><span class="p">(</span><span class="n">jinja2</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;this test requires jinja2&quot;</span><span class="p">)(</span><span class="n">test_func</span><span class="p">)</span>
<span class="k">return</span> <span class="n">override_settings</span><span class="p">(</span>
<span class="n">TEMPLATES</span><span class="o">=</span><span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;BACKEND&quot;</span><span class="p">:</span> <span class="s2">&quot;django.template.backends.django.DjangoTemplates&quot;</span><span class="p">,</span>
<span class="s2">&quot;APP_DIRS&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s2">&quot;BACKEND&quot;</span><span class="p">:</span> <span class="s2">&quot;django.template.backends.jinja2.Jinja2&quot;</span><span class="p">,</span>
<span class="s2">&quot;APP_DIRS&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;OPTIONS&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;keep_trailing_newline&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">},</span>
<span class="p">},</span>
<span class="p">]</span>
<span class="p">)(</span><span class="n">test_func</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">override_script_prefix</span><span class="p">(</span><span class="n">TestContextDecorator</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Decorator or context manager to temporary override the script prefix.&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">prefix</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">=</span> <span class="n">prefix</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="k">def</span><span class="w"> </span><span class="nf">enable</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">old_prefix</span> <span class="o">=</span> <span class="n">get_script_prefix</span><span class="p">()</span>
<span class="n">set_script_prefix</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">disable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">set_script_prefix</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">old_prefix</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">LoggingCaptureMixin</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Capture the output from the &#39;django&#39; logger and store it on the class&#39;s</span>
<span class="sd"> logger_output attribute.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">setUp</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">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">&quot;django&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">old_stream</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">handlers</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">stream</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger_output</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">handlers</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">logger_output</span>
<span class="k">def</span><span class="w"> </span><span class="nf">tearDown</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">logger</span><span class="o">.</span><span class="n">handlers</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">old_stream</span>
<span class="k">class</span><span class="w"> </span><span class="nc">isolate_apps</span><span class="p">(</span><span class="n">TestContextDecorator</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Act as either a decorator or a context manager to register models defined</span>
<span class="sd"> in its wrapped context to an isolated registry.</span>
<span class="sd"> The list of installed apps the isolated registry should contain must be</span>
<span class="sd"> passed as arguments.</span>
<span class="sd"> Two optional keyword arguments can be specified:</span>
<span class="sd"> `attr_name`: attribute assigned the isolated registry if used as a class</span>
<span class="sd"> decorator.</span>
<span class="sd"> `kwarg_name`: keyword argument passing the isolated registry if used as a</span>
<span class="sd"> function decorator.</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="o">*</span><span class="n">installed_apps</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">installed_apps</span> <span class="o">=</span> <span class="n">installed_apps</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">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">enable</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">old_apps</span> <span class="o">=</span> <span class="n">Options</span><span class="o">.</span><span class="n">default_apps</span>
<span class="n">apps</span> <span class="o">=</span> <span class="n">Apps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">installed_apps</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">Options</span><span class="p">,</span> <span class="s2">&quot;default_apps&quot;</span><span class="p">,</span> <span class="n">apps</span><span class="p">)</span>
<span class="k">return</span> <span class="n">apps</span>
<span class="k">def</span><span class="w"> </span><span class="nf">disable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">Options</span><span class="p">,</span> <span class="s2">&quot;default_apps&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">old_apps</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">TimeKeeper</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="bp">self</span><span class="o">.</span><span class="n">records</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
<span class="nd">@contextmanager</span>
<span class="k">def</span><span class="w"> </span><span class="nf">timed</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">records</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">yield</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">end_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span>
<span class="bp">self</span><span class="o">.</span><span class="n">records</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">end_time</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">print_results</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">end_times</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">records</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">for</span> <span class="n">record_time</span> <span class="ow">in</span> <span class="n">end_times</span><span class="p">:</span>
<span class="n">record</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> took </span><span class="si">%.3f</span><span class="s2">s&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">record_time</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">record</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">NullTimeKeeper</span><span class="p">:</span>
<span class="nd">@contextmanager</span>
<span class="k">def</span><span class="w"> </span><span class="nf">timed</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">yield</span>
<span class="k">def</span><span class="w"> </span><span class="nf">print_results</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span><span class="w"> </span><span class="nf">tag</span><span class="p">(</span><span class="o">*</span><span class="n">tags</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Decorator to add tags to a test class or method.&quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">decorator</span><span class="p">(</span><span class="n">obj</span><span class="p">):</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="s2">&quot;tags&quot;</span><span class="p">):</span>
<span class="n">obj</span><span class="o">.</span><span class="n">tags</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">tags</span><span class="p">)</span>
<span class="k">else</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="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="nb">set</span><span class="p">(</span><span class="n">tags</span><span class="p">))</span>
<span class="k">return</span> <span class="n">obj</span>
<span class="k">return</span> <span class="n">decorator</span>
<span class="nd">@contextmanager</span>
<span class="k">def</span><span class="w"> </span><span class="nf">register_lookup</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="o">*</span><span class="n">lookups</span><span class="p">,</span> <span class="n">lookup_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Context manager to temporarily register lookups on a model field using</span>
<span class="sd"> lookup_name (or the lookup&#39;s lookup_name if not provided).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">lookup</span> <span class="ow">in</span> <span class="n">lookups</span><span class="p">:</span>
<span class="n">field</span><span class="o">.</span><span class="n">register_lookup</span><span class="p">(</span><span class="n">lookup</span><span class="p">,</span> <span class="n">lookup_name</span><span class="p">)</span>
<span class="k">yield</span>
<span class="k">finally</span><span class="p">:</span>
<span class="k">for</span> <span class="n">lookup</span> <span class="ow">in</span> <span class="n">lookups</span><span class="p">:</span>
<span class="n">field</span><span class="o">.</span><span class="n">_unregister_lookup</span><span class="p">(</span><span class="n">lookup</span><span class="p">,</span> <span class="n">lookup_name</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">garbage_collect</span><span class="p">():</span>
<span class="n">gc</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>
<span class="k">if</span> <span class="n">PYPY</span><span class="p">:</span>
<span class="c1"># Collecting weakreferences can take two collections on PyPy.</span>
<span class="n">gc</span><span class="o">.</span><span class="n">collect</span><span class="p">()</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="">django.test.utils</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>