Updated HTML docs

This commit is contained in:
Griatch 2021-01-30 13:29:07 +01:00
parent 87191ef0c4
commit 801df95026
1203 changed files with 7193 additions and 30090 deletions

View file

@ -30,7 +30,6 @@
<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.conf</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -321,6 +320,7 @@
<li><a href="../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -338,7 +338,6 @@
<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.conf</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -30,7 +30,6 @@
<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.db.models.fields.related_descriptors</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -1203,6 +1202,7 @@
<li><a href="../../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1220,7 +1220,6 @@
<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.db.models.fields.related_descriptors</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -30,7 +30,6 @@
<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.db.models.manager</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -267,6 +266,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -284,7 +284,6 @@
<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.db.models.manager</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

File diff suppressed because it is too large Load diff

View file

@ -30,7 +30,6 @@
<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.db.models.query_utils</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -402,6 +401,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -419,7 +419,6 @@
<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.db.models.query_utils</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -1,148 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>django.utils.deconstruct &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<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 1.0-dev</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.utils.deconstruct</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for django.utils.deconstruct</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span> <span class="nn">importlib</span> <span class="kn">import</span> <span class="n">import_module</span>
<span class="kn">from</span> <span class="nn">django.utils.version</span> <span class="kn">import</span> <span class="n">get_docs_version</span>
<span class="k">def</span> <span class="nf">deconstructible</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Class decorator that allows the decorated class to be serialized</span>
<span class="sd"> by the migrations subsystem.</span>
<span class="sd"> The `path` kwarg specifies the import path.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># We capture the arguments to make returning them trivial</span>
<span class="n">obj</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">_constructor_args</span> <span class="o">=</span> <span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span>
<span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a 3-tuple of class import path, positional arguments,</span>
<span class="sd"> and keyword arguments.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Fallback version</span>
<span class="k">if</span> <span class="n">path</span><span class="p">:</span>
<span class="n">module_name</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">rpartition</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">module_name</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__module__</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
<span class="c1"># Make sure it&#39;s actually there and not an inner class</span>
<span class="n">module</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="n">module_name</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Could not find object </span><span class="si">%s</span><span class="s2"> in </span><span class="si">%s</span><span class="s2">.</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;Please note that you cannot serialize things like inner &quot;</span>
<span class="s2">&quot;classes. Please move the object into the main module &quot;</span>
<span class="s2">&quot;body to use migrations.</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;For more information, see &quot;</span>
<span class="s2">&quot;https://docs.djangoproject.com/en/</span><span class="si">%s</span><span class="s2">/topics/migrations/#serializing-values&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">module_name</span><span class="p">,</span> <span class="n">get_docs_version</span><span class="p">()))</span>
<span class="k">return</span> <span class="p">(</span>
<span class="n">path</span> <span class="ow">or</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="n">name</span><span class="p">),</span>
<span class="n">obj</span><span class="o">.</span><span class="n">_constructor_args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">obj</span><span class="o">.</span><span class="n">_constructor_args</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="p">)</span>
<span class="n">klass</span><span class="o">.</span><span class="fm">__new__</span> <span class="o">=</span> <span class="nb">staticmethod</span><span class="p">(</span><span class="fm">__new__</span><span class="p">)</span>
<span class="n">klass</span><span class="o">.</span><span class="n">deconstruct</span> <span class="o">=</span> <span class="n">deconstruct</span>
<span class="k">return</span> <span class="n">klass</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
<span class="k">return</span> <span class="n">decorator</span>
<span class="k">return</span> <span class="n">decorator</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../index.html">
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div 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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="deconstruct.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></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 1.0-dev</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.utils.deconstruct</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -30,7 +30,6 @@
<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.utils.functional</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -499,6 +498,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -516,7 +516,6 @@
<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.utils.functional</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -30,7 +30,6 @@
<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="">evennia</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -533,6 +532,7 @@
<li><a href="../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -550,7 +550,6 @@
<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="">evennia</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.accounts</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -74,7 +73,7 @@
<span class="n">SIGNAL_OBJECT_POST_PUPPET</span><span class="p">,</span>
<span class="n">SIGNAL_OBJECT_POST_UNPUPPET</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.attributes</span> <span class="kn">import</span> <span class="n">NickHandler</span><span class="p">,</span> <span class="n">ModelAttributeBackend</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.attributes</span> <span class="kn">import</span> <span class="n">NickHandler</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.scripthandler</span> <span class="kn">import</span> <span class="n">ScriptHandler</span>
<span class="kn">from</span> <span class="nn">evennia.commands.cmdsethandler</span> <span class="kn">import</span> <span class="n">CmdSetHandler</span>
<span class="kn">from</span> <span class="nn">evennia.utils.optionhandler</span> <span class="kn">import</span> <span class="n">OptionHandler</span>
@ -82,7 +81,7 @@
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">getrandbits</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;DefaultAccount&quot;</span><span class="p">,</span> <span class="s2">&quot;DefaultGuest&quot;</span><span class="p">)</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;DefaultAccount&quot;</span><span class="p">,)</span>
<span class="n">_SESSIONS</span> <span class="o">=</span> <span class="kc">None</span>
@ -94,10 +93,10 @@
<span class="c1"># Create throttles for too many account-creations and login attempts</span>
<span class="n">CREATION_THROTTLE</span> <span class="o">=</span> <span class="n">Throttle</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="s1">&#39;creation&#39;</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">CREATION_THROTTLE_LIMIT</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">CREATION_THROTTLE_TIMEOUT</span>
<span class="n">limit</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">CREATION_THROTTLE_LIMIT</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">CREATION_THROTTLE_TIMEOUT</span>
<span class="p">)</span>
<span class="n">LOGIN_THROTTLE</span> <span class="o">=</span> <span class="n">Throttle</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="s1">&#39;login&#39;</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">LOGIN_THROTTLE_LIMIT</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">LOGIN_THROTTLE_TIMEOUT</span>
<span class="n">limit</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">LOGIN_THROTTLE_LIMIT</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">LOGIN_THROTTLE_TIMEOUT</span>
<span class="p">)</span>
@ -226,7 +225,7 @@
<span class="sd"> - at_server_reload()</span>
<span class="sd"> - at_server_shutdown()</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">AccountManager</span><span class="p">()</span>
@ -241,7 +240,7 @@
<div class="viewcode-block" id="DefaultAccount.nicks"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.nicks">[docs]</a> <span class="nd">@lazy_property</span>
<span class="k">def</span> <span class="nf">nicks</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">NickHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ModelAttributeBackend</span><span class="p">)</span></div>
<span class="k">return</span> <span class="n">NickHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultAccount.sessions"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultAccount.sessions">[docs]</a> <span class="nd">@lazy_property</span>
<span class="k">def</span> <span class="nf">sessions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -722,6 +721,9 @@
<span class="p">)</span>
<span class="n">Character</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">character_typeclass</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;location&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_id</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">START_LOCATION</span><span class="p">)</span>
<span class="c1"># Create the character</span>
<span class="n">character</span><span class="p">,</span> <span class="n">errs</span> <span class="o">=</span> <span class="n">Character</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
<span class="n">character_key</span><span class="p">,</span>
@ -1589,21 +1591,21 @@
<span class="k">return</span> <span class="n">look_string</span></div></div>
<div class="viewcode-block" id="DefaultGuest"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultGuest">[docs]</a><span class="k">class</span> <span class="nc">DefaultGuest</span><span class="p">(</span><span class="n">DefaultAccount</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">DefaultGuest</span><span class="p">(</span><span class="n">DefaultAccount</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This class is used for guest logins. Unlike Accounts, Guests and</span>
<span class="sd"> their characters are deleted after disconnection.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="DefaultGuest.create"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultGuest.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Forwards request to cls.authenticate(); returns a DefaultGuest object</span>
<span class="sd"> if one is available for use.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">authenticate</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">authenticate</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<div class="viewcode-block" id="DefaultGuest.authenticate"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultGuest.authenticate">[docs]</a> <span class="nd">@classmethod</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">authenticate</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Gets or creates a Guest account object.</span>
@ -1675,9 +1677,9 @@
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="n">errors</span>
<span class="k">return</span> <span class="n">account</span><span class="p">,</span> <span class="n">errors</span></div>
<span class="k">return</span> <span class="n">account</span><span class="p">,</span> <span class="n">errors</span>
<div class="viewcode-block" id="DefaultGuest.at_post_login"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultGuest.at_post_login">[docs]</a> <span class="k">def</span> <span class="nf">at_post_login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</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="k">def</span> <span class="nf">at_post_login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> In theory, guests only have one character regardless of which</span>
<span class="sd"> MULTISESSION_MODE we&#39;re in. They don&#39;t get a choice.</span>
@ -1689,9 +1691,9 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_send_to_connect_channel</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;|G</span><span class="si">{key}</span><span class="s2"> connected|n&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">puppet_object</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span><span class="p">)</span></div>
<span class="bp">self</span><span class="o">.</span><span class="n">puppet_object</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span><span class="p">)</span>
<div class="viewcode-block" id="DefaultGuest.at_server_shutdown"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultGuest.at_server_shutdown">[docs]</a> <span class="k">def</span> <span class="nf">at_server_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">at_server_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> We repeat the functionality of `at_disconnect()` here just to</span>
<span class="sd"> be on the safe side.</span>
@ -1700,9 +1702,9 @@
<span class="n">characters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span>
<span class="k">for</span> <span class="n">character</span> <span class="ow">in</span> <span class="n">characters</span><span class="p">:</span>
<span class="k">if</span> <span class="n">character</span><span class="p">:</span>
<span class="n">character</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span></div>
<span class="n">character</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<div class="viewcode-block" id="DefaultGuest.at_post_disconnect"><a class="viewcode-back" href="../../../api/evennia.accounts.accounts.html#evennia.accounts.accounts.DefaultGuest.at_post_disconnect">[docs]</a> <span class="k">def</span> <span class="nf">at_post_disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">at_post_disconnect</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Once having disconnected, destroy the guest&#39;s characters and</span>
@ -1716,7 +1718,7 @@
<span class="k">for</span> <span class="n">character</span> <span class="ow">in</span> <span class="n">characters</span><span class="p">:</span>
<span class="k">if</span> <span class="n">character</span><span class="p">:</span>
<span class="n">character</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span></div></div>
<span class="bp">self</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
</pre></div>
<div class="clearer"></div>
@ -1744,6 +1746,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1762,7 +1765,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.accounts</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.admin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -432,6 +431,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -450,7 +450,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.admin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.bots</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -646,6 +645,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -664,7 +664,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.bots</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.manager</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -256,6 +255,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -274,7 +274,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.manager</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.models</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -248,6 +247,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -266,7 +266,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.accounts.models</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.cmdhandler</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -894,6 +893,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -912,7 +912,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.cmdhandler</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.cmdparser</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -290,6 +289,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -308,7 +308,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.cmdparser</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.cmdset</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -400,14 +399,18 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">perm</span> <span class="o">=</span> <span class="s2">&quot;perm&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">permanent</span> <span class="k">else</span> <span class="s2">&quot;non-perm&quot;</span>
<span class="n">options</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="s2">&quot;</span><span class="si">{}</span><span class="s2">:</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="s2">&quot;T&quot;</span> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opt</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;F&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;no_exits&quot;</span><span class="p">,</span> <span class="s2">&quot;no_objs&quot;</span><span class="p">,</span> <span class="s2">&quot;no_channels&quot;</span><span class="p">,</span> <span class="s2">&quot;duplicates&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opt</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="p">])</span>
<span class="n">options</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="p">[</span>
<span class="s2">&quot;</span><span class="si">{}</span><span class="s2">:</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="s2">&quot;T&quot;</span> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opt</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;F&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;no_exits&quot;</span><span class="p">,</span> <span class="s2">&quot;no_objs&quot;</span><span class="p">,</span> <span class="s2">&quot;no_channels&quot;</span><span class="p">,</span> <span class="s2">&quot;duplicates&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opt</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="n">options</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;, &quot;</span> <span class="o">+</span> <span class="n">options</span><span class="p">)</span> <span class="k">if</span> <span class="n">options</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;&lt;CmdSet </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mergetype</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">perm</span><span class="si">}</span><span class="s2">, prio </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">priority</span><span class="si">}{</span><span class="n">options</span><span class="si">}</span><span class="s2">&gt;: &quot;</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="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">commands</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">o</span><span class="p">:</span> <span class="n">o</span><span class="o">.</span><span class="n">key</span><span class="p">)])</span>
<span class="k">return</span> <span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;&lt;CmdSet </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mergetype</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">perm</span><span class="si">}</span><span class="s2">, prio </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">priority</span><span class="si">}{</span><span class="n">options</span><span class="si">}</span><span class="s2">&gt;: &quot;</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="nb">str</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">commands</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">o</span><span class="p">:</span> <span class="n">o</span><span class="o">.</span><span class="n">key</span><span class="p">)])</span>
<span class="p">)</span>
<span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -741,6 +744,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -759,7 +763,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.cmdset</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.cmdsethandler</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -373,7 +372,7 @@
<span class="k">if</span> <span class="n">mergelist</span><span class="p">:</span>
<span class="c1"># current is a result of mergers</span>
<span class="n">mergelist</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">mergelist</span><span class="p">)</span>
<span class="n">mergelist</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">mergelist</span><span class="p">)</span>
<span class="n">strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; &lt;Merged </span><span class="si">{</span><span class="n">mergelist</span><span class="si">}</span><span class="s2">&gt;: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">current</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># current is a single cmdset</span>
@ -721,6 +720,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -739,7 +739,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.cmdsethandler</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.command</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -126,15 +125,6 @@
<span class="k">break</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">help_category</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">help_category</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="c1"># pre-prepare a help index entry for quicker lookup</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">search_index_entry</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="s2">&quot;aliases&quot;</span><span class="p">:</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">aliases</span><span class="p">),</span>
<span class="s2">&quot;category&quot;</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="n">help_category</span><span class="p">,</span>
<span class="s2">&quot;text&quot;</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="p">}</span>
<div class="viewcode-block" id="CommandMeta"><a class="viewcode-back" href="../../../api/evennia.commands.command.html#evennia.commands.cmdhandler.CommandMeta">[docs]</a><span class="k">class</span> <span class="nc">CommandMeta</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -561,6 +551,20 @@
<span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_WIDTH</span></div>
<div class="viewcode-block" id="Command.client_height"><a class="viewcode-back" href="../../../api/evennia.commands.command.html#evennia.commands.cmdhandler.Command.client_height">[docs]</a> <span class="k">def</span> <span class="nf">client_height</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the client screenheight for the session using this command.</span>
<span class="sd"> Returns:</span>
<span class="sd"> client height (int): The height (in characters) of the client window.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">protocol_flags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;SCREENHEIGHT&quot;</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_HEIGHT</span><span class="p">}</span>
<span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_HEIGHT</span></div>
<div class="viewcode-block" id="Command.styled_table"><a class="viewcode-back" href="../../../api/evennia.commands.command.html#evennia.commands.cmdhandler.Command.styled_table">[docs]</a> <span class="k">def</span> <span class="nf">styled_table</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create an EvTable styled by on user preferences.</span>
@ -742,6 +746,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -760,7 +765,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.command</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.account</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -1121,6 +1120,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1139,7 +1139,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.account</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.admin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -662,6 +661,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -680,7 +680,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.admin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.batchprocess</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -888,6 +887,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -906,7 +906,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.batchprocess</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.building</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -2558,12 +2557,14 @@
<span class="k">def</span> <span class="nf">_format_options</span><span class="p">(</span><span class="n">cmdset</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;helper for cmdset-option display&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_truefalse</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">string</span><span class="si">}</span><span class="s2">: T&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">string</span><span class="si">}</span><span class="s2">: F&quot;</span>
<span class="n">options</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">_truefalse</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">cmdset</span><span class="p">,</span> <span class="n">opt</span><span class="p">))</span>
<span class="k">for</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;no_exits&quot;</span><span class="p">,</span> <span class="s2">&quot;no_objs&quot;</span><span class="p">,</span> <span class="s2">&quot;no_channels&quot;</span><span class="p">,</span> <span class="s2">&quot;duplicates&quot;</span><span class="p">)</span>
@ -2580,7 +2581,8 @@
<span class="k">continue</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">_format_options</span><span class="p">(</span><span class="n">cmdset</span><span class="p">)</span>
<span class="n">stored</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">path</span><span class="si">}</span><span class="s2"> [</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">] (</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">mergetype</span><span class="si">}</span><span class="s2">, prio </span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">priority</span><span class="si">}{</span><span class="n">options</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">path</span><span class="si">}</span><span class="s2"> [</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">] (</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">mergetype</span><span class="si">}</span><span class="s2">, prio </span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">priority</span><span class="si">}{</span><span class="n">options</span><span class="si">}</span><span class="s2">)&quot;</span>
<span class="p">)</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Stored Cmdset(s)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">stored</span><span class="p">)</span>
<span class="c1"># this gets all components of the currently merged set</span>
@ -2618,13 +2620,15 @@
<span class="c1"># the resulting merged cmdset</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">_format_options</span><span class="p">(</span><span class="n">current_cmdset</span><span class="p">)</span>
<span class="n">merged</span> <span class="o">=</span> <span class="p">[</span>
<span class="sa">f</span><span class="s2">&quot;&lt;Current merged cmdset&gt; (</span><span class="si">{</span><span class="n">current_cmdset</span><span class="o">.</span><span class="n">mergetype</span><span class="si">}</span><span class="s2"> prio </span><span class="si">{</span><span class="n">current_cmdset</span><span class="o">.</span><span class="n">priority</span><span class="si">}{</span><span class="n">options</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">]</span>
<span class="sa">f</span><span class="s2">&quot;&lt;Current merged cmdset&gt; (</span><span class="si">{</span><span class="n">current_cmdset</span><span class="o">.</span><span class="n">mergetype</span><span class="si">}</span><span class="s2"> prio </span><span class="si">{</span><span class="n">current_cmdset</span><span class="o">.</span><span class="n">priority</span><span class="si">}{</span><span class="n">options</span><span class="si">}</span><span class="s2">)&quot;</span>
<span class="p">]</span>
<span class="c1"># the merge stack</span>
<span class="k">for</span> <span class="n">cmdset</span> <span class="ow">in</span> <span class="n">all_cmdsets</span><span class="p">:</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">_format_options</span><span class="p">(</span><span class="n">cmdset</span><span class="p">)</span>
<span class="n">merged</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">path</span><span class="si">}</span><span class="s2"> [</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">] (</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">mergetype</span><span class="si">}</span><span class="s2"> prio </span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">priority</span><span class="si">}{</span><span class="n">options</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">path</span><span class="si">}</span><span class="s2"> [</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">] (</span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">mergetype</span><span class="si">}</span><span class="s2"> prio </span><span class="si">{</span><span class="n">cmdset</span><span class="o">.</span><span class="n">priority</span><span class="si">}{</span><span class="n">options</span><span class="si">}</span><span class="s2">)&quot;</span>
<span class="p">)</span>
<span class="n">output</span><span class="p">[</span><span class="s2">&quot;Merged Cmdset(s)&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">merged</span><span class="p">)</span>
<span class="c1"># list the commands available to this object</span>
@ -3885,6 +3889,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -3903,7 +3908,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.building</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.cmdset_account</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -144,6 +143,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -162,7 +162,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.cmdset_account</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.cmdset_character</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -159,6 +158,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -177,7 +177,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.cmdset_character</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.cmdset_session</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -85,6 +84,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -103,7 +103,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.cmdset_session</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.cmdset_unloggedin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -94,6 +93,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -112,7 +112,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.cmdset_unloggedin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.comms</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -875,7 +874,7 @@
<span class="n">receiver</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;|n,</span><span class="si">{</span><span class="n">clr</span><span class="si">}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">page</span><span class="o">.</span><span class="n">receivers</span><span class="p">])</span>
<span class="k">if</span> <span class="n">sending</span><span class="p">:</span>
<span class="n">template</span> <span class="o">=</span> <span class="n">to_template</span>
<span class="n">sender</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">sender</span><span class="si">}</span><span class="s2"> &quot;</span> <span class="k">if</span> <span class="n">multi_send</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">sender</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">sender</span><span class="si">}</span><span class="s2"> &quot;</span> <span class="k">if</span> <span class="n">multi_send</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">receiver</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; </span><span class="si">{</span><span class="n">receiver</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">multi_recv</span> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot; </span><span class="si">{</span><span class="n">receiver</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">template</span> <span class="o">=</span> <span class="n">from_template</span>
@ -890,7 +889,6 @@
<span class="n">receiver</span><span class="o">=</span><span class="n">receiver</span><span class="p">,</span>
<span class="n">message</span><span class="o">=</span><span class="n">page</span><span class="o">.</span><span class="n">message</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">lastpages</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">listing</span><span class="p">)</span>
@ -1424,6 +1422,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1442,7 +1441,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.comms</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.general</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -421,10 +420,13 @@
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;You are not carrying anything.&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="kn">import</span> <span class="n">raw</span> <span class="k">as</span> <span class="n">raw_ansi</span>
<span class="n">table</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">styled_table</span><span class="p">(</span><span class="n">border</span><span class="o">=</span><span class="s2">&quot;header&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span><span class="p">:</span>
<span class="n">table</span><span class="o">.</span><span class="n">add_row</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;|C</span><span class="si">{</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">|n&quot;</span><span class="p">,</span>
<span class="s2">&quot;</span><span class="si">{}</span><span class="s2">|n&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">utils</span><span class="o">.</span><span class="n">crop</span><span class="p">(</span><span class="n">raw_ansi</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
<span class="n">table</span><span class="o">.</span><span class="n">add_row</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;|C</span><span class="si">{</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">|n&quot;</span><span class="p">,</span>
<span class="s2">&quot;</span><span class="si">{}</span><span class="s2">|n&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">utils</span><span class="o">.</span><span class="n">crop</span><span class="p">(</span><span class="n">raw_ansi</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="p">),</span> <span class="n">width</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">string</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;|wYou are carrying:</span><span class="se">\n</span><span class="si">{</span><span class="n">table</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span></div></div>
@ -795,6 +797,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -813,7 +816,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.general</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.help</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -54,14 +53,8 @@
<span class="kn">from</span> <span class="nn">evennia.commands.command</span> <span class="kn">import</span> <span class="n">Command</span>
<span class="kn">from</span> <span class="nn">evennia.help.models</span> <span class="kn">import</span> <span class="n">HelpEntry</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">create</span><span class="p">,</span> <span class="n">evmore</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="kn">import</span> <span class="n">ANSIString</span>
<span class="kn">from</span> <span class="nn">evennia.utils.eveditor</span> <span class="kn">import</span> <span class="n">EvEditor</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">string_suggestions</span><span class="p">,</span>
<span class="n">class_from_module</span><span class="p">,</span>
<span class="n">inherits_from</span><span class="p">,</span>
<span class="n">format_grid</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">string_suggestions</span><span class="p">,</span> <span class="n">class_from_module</span>
<span class="n">COMMAND_DEFAULT_CLASS</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">)</span>
<span class="n">HELP_MORE</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">HELP_MORE</span>
@ -72,73 +65,8 @@
<span class="n">_DEFAULT_WIDTH</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_WIDTH</span>
<span class="n">_SEP</span> <span class="o">=</span> <span class="s2">&quot;|C&quot;</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">*</span> <span class="n">_DEFAULT_WIDTH</span> <span class="o">+</span> <span class="s2">&quot;|n&quot;</span>
<span class="n">_LUNR</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_LUNR_EXCEPTION</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">class</span> <span class="nc">HelpCategory</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</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="bp">self</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">key</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">search_index_entry</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
<span class="s2">&quot;aliases&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;category&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;text&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;Category: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">def</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="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="nb">str</span><span class="p">(</span><span class="n">other</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">def</span> <span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">help_search_with_index</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">candidate_entries</span><span class="p">,</span> <span class="n">suggestion_maxnum</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Lunr-powered fast index search and suggestion wrapper</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_LUNR</span><span class="p">,</span> <span class="n">_LUNR_EXCEPTION</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_LUNR</span><span class="p">:</span>
<span class="c1"># we have to delay-load lunr because it messes with logging if it&#39;s imported</span>
<span class="c1"># before twisted&#39;s logging has been set up</span>
<span class="kn">from</span> <span class="nn">lunr</span> <span class="kn">import</span> <span class="n">lunr</span> <span class="k">as</span> <span class="n">_LUNR</span>
<span class="kn">from</span> <span class="nn">lunr.exceptions</span> <span class="kn">import</span> <span class="n">QueryParseError</span> <span class="k">as</span> <span class="n">_LUNR_EXCEPTION</span>
<span class="n">indx</span> <span class="o">=</span> <span class="p">[</span><span class="n">cnd</span><span class="o">.</span><span class="n">search_index_entry</span> <span class="k">for</span> <span class="n">cnd</span> <span class="ow">in</span> <span class="n">candidate_entries</span><span class="p">]</span>
<span class="n">mapping</span> <span class="o">=</span> <span class="p">{</span><span class="n">indx</span><span class="p">[</span><span class="n">ix</span><span class="p">][</span><span class="s2">&quot;key&quot;</span><span class="p">]:</span> <span class="n">cand</span> <span class="k">for</span> <span class="n">ix</span><span class="p">,</span> <span class="n">cand</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">candidate_entries</span><span class="p">)}</span>
<span class="n">search_index</span> <span class="o">=</span> <span class="n">_LUNR</span><span class="p">(</span>
<span class="n">ref</span><span class="o">=</span><span class="s2">&quot;key&quot;</span><span class="p">,</span>
<span class="n">fields</span><span class="o">=</span><span class="p">[</span>
<span class="p">{</span><span class="s2">&quot;field_name&quot;</span><span class="p">:</span> <span class="s2">&quot;key&quot;</span><span class="p">,</span> <span class="s2">&quot;boost&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">},</span>
<span class="p">{</span><span class="s2">&quot;field_name&quot;</span><span class="p">:</span> <span class="s2">&quot;aliases&quot;</span><span class="p">,</span> <span class="s2">&quot;boost&quot;</span><span class="p">:</span> <span class="mi">9</span><span class="p">},</span>
<span class="p">{</span><span class="s2">&quot;field_name&quot;</span><span class="p">:</span> <span class="s2">&quot;category&quot;</span><span class="p">,</span> <span class="s2">&quot;boost&quot;</span><span class="p">:</span> <span class="mi">8</span><span class="p">},</span>
<span class="p">{</span><span class="s2">&quot;field_name&quot;</span><span class="p">:</span> <span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="s2">&quot;boost&quot;</span><span class="p">:</span> <span class="mi">5</span><span class="p">},</span>
<span class="p">{</span><span class="s2">&quot;field_name&quot;</span><span class="p">:</span> <span class="s2">&quot;text&quot;</span><span class="p">,</span> <span class="s2">&quot;boost&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span>
<span class="p">],</span>
<span class="n">documents</span><span class="o">=</span><span class="n">indx</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">search_index</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">query</span><span class="p">)[:</span><span class="n">suggestion_maxnum</span><span class="p">]</span>
<span class="k">except</span> <span class="n">_LUNR_EXCEPTION</span><span class="p">:</span>
<span class="c1"># this is a user-input problem</span>
<span class="n">matches</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># matches (objs), suggestions (strs)</span>
<span class="k">return</span> <span class="p">(</span>
<span class="p">[</span><span class="n">mapping</span><span class="p">[</span><span class="n">match</span><span class="p">[</span><span class="s2">&quot;ref&quot;</span><span class="p">]]</span> <span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">],</span>
<span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">match</span><span class="p">[</span><span class="s2">&quot;ref&quot;</span><span class="p">])</span> <span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">],</span> <span class="c1"># + f&quot; (score {match[&#39;score&#39;]})&quot;) # good debug</span>
<span class="p">)</span>
<div class="viewcode-block" id="CmdHelp"><a class="viewcode-back" href="../../../../api/evennia.commands.default.help.html#evennia.commands.default.help.CmdHelp">[docs]</a><span class="k">class</span> <span class="nc">CmdHelp</span><span class="p">(</span><span class="n">Command</span><span class="p">):</span>
<div class="viewcode-block" id="CmdHelp"><a class="viewcode-back" href="../../../../api/evennia.commands.default.help.html#evennia.commands.default.help.CmdHelp">[docs]</a><span class="k">class</span> <span class="nc">CmdHelp</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> View help or a list of topics</span>
@ -180,7 +108,7 @@
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">help_more</span><span class="p">:</span>
<span class="n">usemore</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">protocol_key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;websocket&quot;</span><span class="p">,</span> <span class="s2">&quot;ajax/comet&quot;</span><span class="p">,):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">protocol_key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;websocket&quot;</span><span class="p">,</span> <span class="s2">&quot;ajax/comet&quot;</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">options</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_saved_webclient_options</span>
<span class="k">if</span> <span class="n">options</span> <span class="ow">and</span> <span class="n">options</span><span class="p">[</span><span class="s2">&quot;helppopup&quot;</span><span class="p">]:</span>
@ -210,49 +138,44 @@
<span class="sd"> Returns the formatted string, ready to be sent.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">start</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">_SEP</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">title</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;|CHelp for |w</span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s2">|n&quot;</span> <span class="k">if</span> <span class="n">title</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot; |C(aliases: </span><span class="si">{}</span><span class="s2">|C)|n&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot;|C,|n &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;|w</span><span class="si">{</span><span class="n">ali</span><span class="si">}</span><span class="s2">|n&quot;</span> <span class="k">for</span> <span class="n">ali</span> <span class="ow">in</span> <span class="n">aliases</span><span class="p">))</span>
<span class="k">if</span> <span class="n">aliases</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">help_text</span> <span class="o">=</span> <span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="si">{</span><span class="n">dedent</span><span class="p">(</span><span class="n">help_text</span><span class="o">.</span><span class="n">rstrip</span><span class="p">())</span><span class="si">}</span><span class="s2">&quot;</span><span class="k">if</span> <span class="n">help_text</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">suggested</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">|CSuggested:|n </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">fill</span><span class="p">(</span><span class="s2">&quot;|C,|n &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;|w</span><span class="si">{</span><span class="n">sug</span><span class="si">}</span><span class="s2">|n&quot;</span> <span class="k">for</span> <span class="n">sug</span> <span class="ow">in</span> <span class="n">suggested</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">suggested</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">end</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="si">{</span><span class="n">_SEP</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">_SEP</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="k">if</span> <span class="n">title</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;|CHelp for |w</span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="n">title</span>
<span class="k">if</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; |C(aliases: </span><span class="si">%s</span><span class="s2">|C)|n&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;|C,|n &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot;|w</span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="n">ali</span> <span class="k">for</span> <span class="n">ali</span> <span class="ow">in</span> <span class="n">aliases</span><span class="p">))</span>
<span class="k">if</span> <span class="n">help_text</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">dedent</span><span class="p">(</span><span class="n">help_text</span><span class="o">.</span><span class="n">rstrip</span><span class="p">())</span>
<span class="k">if</span> <span class="n">suggested</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">|CSuggested:|n &quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">fill</span><span class="p">(</span><span class="s2">&quot;|C,|n &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot;|w</span><span class="si">%s</span><span class="s2">|n&quot;</span> <span class="o">%</span> <span class="n">sug</span> <span class="k">for</span> <span class="n">sug</span> <span class="ow">in</span> <span class="n">suggested</span><span class="p">))</span>
<span class="n">string</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">_SEP</span>
<span class="k">return</span> <span class="n">string</span></div>
<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">start</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">aliases</span><span class="p">,</span> <span class="n">help_text</span><span class="p">,</span> <span class="n">suggested</span><span class="p">,</span> <span class="n">end</span><span class="p">))</span></div>
<div class="viewcode-block" id="CmdHelp.format_help_list"><a class="viewcode-back" href="../../../../api/evennia.commands.default.help.html#evennia.commands.default.help.CmdHelp.format_help_list">[docs]</a> <span class="k">def</span> <span class="nf">format_help_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hdict_cmds</span><span class="p">,</span> <span class="n">hdict_db</span><span class="p">):</span>
<div class="viewcode-block" id="CmdHelp.format_help_list"><a class="viewcode-back" href="../../../../api/evennia.commands.default.help.html#evennia.commands.default.help.CmdHelp.format_help_list">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">format_help_list</span><span class="p">(</span><span class="n">hdict_cmds</span><span class="p">,</span> <span class="n">hdict_db</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Output a category-ordered list. The input are the</span>
<span class="sd"> pre-loaded help files for commands and database-helpfiles</span>
<span class="sd"> respectively. You can override this method to return a</span>
<span class="sd"> custom display of the list of commands and topics.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">category_clr</span> <span class="o">=</span> <span class="s2">&quot;|w&quot;</span>
<span class="n">topic_clr</span> <span class="o">=</span> <span class="s2">&quot;|G&quot;</span>
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client_width</span><span class="p">()</span>
<span class="n">grid</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">verbatim_elements</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">hdict_cmds</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">hdict_db</span><span class="o">.</span><span class="n">keys</span><span class="p">()))):</span>
<span class="n">category_str</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;-- </span><span class="si">{</span><span class="n">category</span><span class="o">.</span><span class="n">title</span><span class="p">()</span><span class="si">}</span><span class="s2"> &quot;</span>
<span class="n">grid</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">ANSIString</span><span class="p">(</span>
<span class="n">category_clr</span> <span class="o">+</span> <span class="n">category_str</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">*</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">category_str</span><span class="p">))</span> <span class="o">+</span> <span class="n">topic_clr</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">hdict_cmds</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span><span class="n">hdict_cmds</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">_SEP</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> |CCommand help entries|n</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">_SEP</span>
<span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">hdict_cmds</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> |w</span><span class="si">%s</span><span class="s2">|n:</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">category</span><span class="p">)</span><span class="o">.</span><span class="n">title</span><span class="p">())</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;|G&quot;</span> <span class="o">+</span> <span class="n">fill</span><span class="p">(</span><span class="s2">&quot;|C, |G&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">hdict_cmds</span><span class="p">[</span><span class="n">category</span><span class="p">])))</span> <span class="o">+</span> <span class="s2">&quot;|n&quot;</span>
<span class="k">if</span> <span class="n">hdict_db</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span><span class="n">hdict_db</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">_SEP</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n\r</span><span class="s2"> |COther help entries|n</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">_SEP</span>
<span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">hdict_db</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n\r</span><span class="s2"> |w</span><span class="si">%s</span><span class="s2">|n:</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">category</span><span class="p">)</span><span class="o">.</span><span class="n">title</span><span class="p">())</span>
<span class="n">string</span> <span class="o">+=</span> <span class="p">(</span>
<span class="s2">&quot;|G&quot;</span>
<span class="o">+</span> <span class="n">fill</span><span class="p">(</span><span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">topic</span><span class="p">)</span> <span class="k">for</span> <span class="n">topic</span> <span class="ow">in</span> <span class="n">hdict_db</span><span class="p">[</span><span class="n">category</span><span class="p">]])))</span>
<span class="o">+</span> <span class="s2">&quot;|n&quot;</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">verbatim_elements</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">grid</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">entries</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">hdict_cmds</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="p">,</span> <span class="p">[])</span> <span class="o">+</span> <span class="n">hdict_db</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="p">,</span> <span class="p">[])))</span>
<span class="n">grid</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
<span class="n">gridrows</span> <span class="o">=</span> <span class="n">format_grid</span><span class="p">(</span><span class="n">grid</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="n">verbatim_elements</span><span class="o">=</span><span class="n">verbatim_elements</span><span class="p">)</span>
<span class="n">gridrows</span> <span class="o">=</span> <span class="n">ANSIString</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="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">gridrows</span><span class="p">)</span>
<span class="k">return</span> <span class="n">gridrows</span></div>
<span class="k">return</span> <span class="n">string</span></div>
<div class="viewcode-block" id="CmdHelp.check_show_help"><a class="viewcode-back" href="../../../../api/evennia.commands.default.help.html#evennia.commands.default.help.CmdHelp.check_show_help">[docs]</a> <span class="k">def</span> <span class="nf">check_show_help</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">caller</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -293,7 +216,7 @@
<span class="sd"> False: the command shouldn&#39;t appear in the table.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<span class="k">return</span> <span class="n">cmd</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="CmdHelp.parse"><a class="viewcode-back" href="../../../../api/evennia.commands.default.help.html#evennia.commands.default.help.CmdHelp.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -326,8 +249,8 @@
<span class="p">]</span>
<span class="n">all_categories</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span>
<span class="nb">set</span><span class="p">(</span>
<span class="p">[</span><span class="n">HelpCategory</span><span class="p">(</span><span class="n">cmd</span><span class="o">.</span><span class="n">help_category</span><span class="p">)</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span><span class="p">]</span>
<span class="o">+</span> <span class="p">[</span><span class="n">HelpCategory</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">help_category</span><span class="p">)</span> <span class="k">for</span> <span class="n">topic</span> <span class="ow">in</span> <span class="n">all_topics</span><span class="p">]</span>
<span class="p">[</span><span class="n">cmd</span><span class="o">.</span><span class="n">help_category</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span><span class="p">]</span>
<span class="o">+</span> <span class="p">[</span><span class="n">topic</span><span class="o">.</span><span class="n">help_category</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">topic</span> <span class="ow">in</span> <span class="n">all_topics</span><span class="p">]</span>
<span class="p">)</span>
<span class="p">)</span>
@ -340,59 +263,92 @@
<span class="c1"># system, but not be displayed in the table, or be displayed differently.</span>
<span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">should_list_cmd</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">caller</span><span class="p">):</span>
<span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">cmd</span><span class="o">.</span><span class="n">auto_help_display_key</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s2">&quot;auto_help_display_key&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">cmd</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="n">key</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">cmd</span><span class="o">.</span><span class="n">auto_help_display_key</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s2">&quot;auto_help_display_key&quot;</span><span class="p">)</span>
<span class="k">else</span> <span class="n">cmd</span><span class="o">.</span><span class="n">key</span>
<span class="p">)</span>
<span class="n">hdict_cmd</span><span class="p">[</span><span class="n">cmd</span><span class="o">.</span><span class="n">help_category</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="p">[</span><span class="n">hdict_topic</span><span class="p">[</span><span class="n">topic</span><span class="o">.</span><span class="n">help_category</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">key</span><span class="p">)</span> <span class="k">for</span> <span class="n">topic</span> <span class="ow">in</span> <span class="n">all_topics</span><span class="p">]</span>
<span class="c1"># report back</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg_help</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">format_help_list</span><span class="p">(</span><span class="n">hdict_cmd</span><span class="p">,</span> <span class="n">hdict_topic</span><span class="p">))</span>
<span class="k">return</span>
<span class="c1"># Try to access a particular help entry or category</span>
<span class="n">entries</span> <span class="o">=</span> <span class="p">[</span><span class="n">cmd</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span> <span class="k">if</span> <span class="n">cmd</span><span class="p">]</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">HelpEntry</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">())</span> <span class="o">+</span> <span class="n">all_categories</span>
<span class="c1"># Try to access a particular command</span>
<span class="k">for</span> <span class="n">match_query</span> <span class="ow">in</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">query</span><span class="si">}</span><span class="s2">~1&quot;</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">query</span><span class="si">}</span><span class="s2">*&quot;</span><span class="p">]:</span>
<span class="c1"># We first do an exact word-match followed by a start-by query</span>
<span class="n">matches</span><span class="p">,</span> <span class="n">suggestions</span> <span class="o">=</span> <span class="n">help_search_with_index</span><span class="p">(</span>
<span class="n">match_query</span><span class="p">,</span> <span class="n">entries</span><span class="p">,</span> <span class="n">suggestion_maxnum</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">suggestion_maxnum</span>
<span class="c1"># build vocabulary of suggestions and rate them by string similarity.</span>
<span class="n">suggestions</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">suggestion_maxnum</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">vocabulary</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">[</span><span class="n">cmd</span><span class="o">.</span><span class="n">key</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span> <span class="k">if</span> <span class="n">cmd</span><span class="p">]</span>
<span class="o">+</span> <span class="p">[</span><span class="n">topic</span><span class="o">.</span><span class="n">key</span> <span class="k">for</span> <span class="n">topic</span> <span class="ow">in</span> <span class="n">all_topics</span><span class="p">]</span>
<span class="o">+</span> <span class="n">all_categories</span>
<span class="p">)</span>
<span class="p">[</span><span class="n">vocabulary</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">cmd</span><span class="o">.</span><span class="n">aliases</span><span class="p">)</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span><span class="p">]</span>
<span class="n">suggestions</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">sugg</span>
<span class="k">for</span> <span class="n">sugg</span> <span class="ow">in</span> <span class="n">string_suggestions</span><span class="p">(</span>
<span class="n">query</span><span class="p">,</span> <span class="nb">set</span><span class="p">(</span><span class="n">vocabulary</span><span class="p">),</span> <span class="n">cutoff</span><span class="o">=</span><span class="n">suggestion_cutoff</span><span class="p">,</span> <span class="n">maxnum</span><span class="o">=</span><span class="n">suggestion_maxnum</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">sugg</span> <span class="o">!=</span> <span class="n">query</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">suggestions</span><span class="p">:</span>
<span class="n">suggestions</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">sugg</span> <span class="k">for</span> <span class="n">sugg</span> <span class="ow">in</span> <span class="n">vocabulary</span> <span class="k">if</span> <span class="n">sugg</span> <span class="o">!=</span> <span class="n">query</span> <span class="ow">and</span> <span class="n">sugg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">if</span> <span class="n">matches</span><span class="p">:</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">matches</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">match</span><span class="p">,</span> <span class="n">HelpCategory</span><span class="p">):</span>
<span class="n">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_help_list</span><span class="p">(</span>
<span class="p">{</span>
<span class="n">match</span><span class="o">.</span><span class="n">key</span><span class="p">:</span> <span class="p">[</span>
<span class="n">cmd</span><span class="o">.</span><span class="n">key</span>
<span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span>
<span class="k">if</span> <span class="n">match</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">cmd</span><span class="o">.</span><span class="n">help_category</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="n">match</span><span class="o">.</span><span class="n">key</span><span class="p">:</span> <span class="p">[</span>
<span class="n">topic</span><span class="o">.</span><span class="n">key</span>
<span class="k">for</span> <span class="n">topic</span> <span class="ow">in</span> <span class="n">all_topics</span>
<span class="k">if</span> <span class="n">match</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">topic</span><span class="o">.</span><span class="n">help_category</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">match</span><span class="p">,</span> <span class="s2">&quot;evennia.commands.command.Command&quot;</span><span class="p">):</span>
<span class="n">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_help_entry</span><span class="p">(</span>
<span class="n">match</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="n">match</span><span class="o">.</span><span class="n">get_help</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">cmdset</span><span class="p">),</span>
<span class="n">aliases</span><span class="o">=</span><span class="n">match</span><span class="o">.</span><span class="n">aliases</span><span class="p">,</span>
<span class="n">suggested</span><span class="o">=</span><span class="n">suggestions</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_help_entry</span><span class="p">(</span>
<span class="n">match</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="n">match</span><span class="o">.</span><span class="n">entrytext</span><span class="p">,</span>
<span class="n">aliases</span><span class="o">=</span><span class="n">match</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span>
<span class="n">suggested</span><span class="o">=</span><span class="n">suggestions</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span>
<span class="p">)</span>
<span class="c1"># try an exact command auto-help match</span>
<span class="n">match</span> <span class="o">=</span> <span class="p">[</span><span class="n">cmd</span> <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span> <span class="k">if</span> <span class="n">cmd</span> <span class="o">==</span> <span class="n">query</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg_help</span><span class="p">(</span><span class="n">formatted</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">:</span>
<span class="c1"># try an inexact match with prefixes stripped from query and cmds</span>
<span class="n">_query</span> <span class="o">=</span> <span class="n">query</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="k">if</span> <span class="n">query</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">CMD_IGNORE_PREFIXES</span> <span class="k">else</span> <span class="n">query</span>
<span class="n">match</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">cmd</span>
<span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span>
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">cmd</span><span class="o">.</span><span class="n">_matchset</span>
<span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="n">_query</span> <span class="ow">or</span> <span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">CMD_IGNORE_PREFIXES</span> <span class="ow">and</span> <span class="n">m</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="o">==</span> <span class="n">_query</span>
<span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">match</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="n">match</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">cmd</span><span class="o">.</span><span class="n">auto_help_display_key</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s2">&quot;auto_help_display_key&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">cmd</span><span class="o">.</span><span class="n">key</span>
<span class="n">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_help_entry</span><span class="p">(</span>
<span class="n">key</span><span class="p">,</span> <span class="n">cmd</span><span class="o">.</span><span class="n">get_help</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">cmdset</span><span class="p">),</span> <span class="n">aliases</span><span class="o">=</span><span class="n">cmd</span><span class="o">.</span><span class="n">aliases</span><span class="p">,</span> <span class="n">suggested</span><span class="o">=</span><span class="n">suggestions</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg_help</span><span class="p">(</span><span class="n">formatted</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># try an exact database help entry match</span>
<span class="n">match</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">HelpEntry</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">find_topicmatch</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">exact</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">match</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_help_entry</span><span class="p">(</span>
<span class="n">match</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="n">match</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">entrytext</span><span class="p">,</span>
<span class="n">aliases</span><span class="o">=</span><span class="n">match</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span>
<span class="n">suggested</span><span class="o">=</span><span class="n">suggestions</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg_help</span><span class="p">(</span><span class="n">formatted</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># try to see if a category name was entered</span>
<span class="k">if</span> <span class="n">query</span> <span class="ow">in</span> <span class="n">all_categories</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg_help</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">format_help_list</span><span class="p">(</span>
<span class="p">{</span>
<span class="n">query</span><span class="p">:</span> <span class="p">[</span>
<span class="n">cmd</span><span class="o">.</span><span class="n">auto_help_display_key</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s2">&quot;auto_help_display_key&quot;</span><span class="p">)</span>
<span class="k">else</span> <span class="n">cmd</span><span class="o">.</span><span class="n">key</span>
<span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">all_cmds</span>
<span class="k">if</span> <span class="n">cmd</span><span class="o">.</span><span class="n">help_category</span> <span class="o">==</span> <span class="n">query</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="p">{</span><span class="n">query</span><span class="p">:</span> <span class="p">[</span><span class="n">topic</span><span class="o">.</span><span class="n">key</span> <span class="k">for</span> <span class="n">topic</span> <span class="ow">in</span> <span class="n">all_topics</span> <span class="k">if</span> <span class="n">topic</span><span class="o">.</span><span class="n">help_category</span> <span class="o">==</span> <span class="n">query</span><span class="p">]},</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="c1"># no exact matches found. Just give suggestions.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
@ -473,10 +429,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You have to define a topic!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">topicstrlist</span> <span class="o">=</span> <span class="n">topicstr</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="n">topicstr</span><span class="p">,</span> <span class="n">aliases</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">topicstrlist</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">topicstrlist</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">topicstr</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="p">[],</span>
<span class="p">)</span>
<span class="n">topicstr</span><span class="p">,</span> <span class="n">aliases</span> <span class="o">=</span> <span class="p">(</span><span class="n">topicstrlist</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">topicstrlist</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">topicstr</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="p">[])</span>
<span class="n">aliastxt</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;(aliases: </span><span class="si">%s</span><span class="s2">)&quot;</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">aliases</span><span class="p">))</span> <span class="k">if</span> <span class="n">aliases</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">old_entry</span> <span class="o">=</span> <span class="kc">None</span>
@ -505,7 +458,7 @@
<span class="n">helpentry</span> <span class="o">=</span> <span class="n">old_entry</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">helpentry</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_help_entry</span><span class="p">(</span>
<span class="n">topicstr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="n">lockstring</span><span class="p">,</span> <span class="n">aliases</span><span class="o">=</span><span class="n">aliases</span><span class="p">,</span>
<span class="n">topicstr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">locks</span><span class="o">=</span><span class="n">lockstring</span><span class="p">,</span> <span class="n">aliases</span><span class="o">=</span><span class="n">aliases</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_editing_help</span> <span class="o">=</span> <span class="n">helpentry</span>
@ -613,6 +566,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -631,7 +585,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.help</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.muxcommand</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -337,6 +336,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -355,7 +355,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.muxcommand</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.syscommands</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -220,6 +219,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -238,7 +238,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.syscommands</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.system</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -435,9 +434,7 @@
<span class="k">if</span> <span class="n">noecho</span><span class="p">:</span>
<span class="n">prompt</span> <span class="o">=</span> <span class="s2">&quot;...&quot;</span> <span class="k">if</span> <span class="n">console</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">else</span> <span class="n">main_prompt</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">line</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;&gt;&gt;&gt; </span><span class="si">{</span><span class="n">line</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">prompt</span> <span class="o">=</span> <span class="n">line</span> <span class="k">if</span> <span class="n">console</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">else</span> <span class="n">main_prompt</span>
<span class="n">prompt</span> <span class="o">=</span> <span class="n">line</span> <span class="k">if</span> <span class="n">console</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">line</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">main_prompt</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">except</span> <span class="ne">SystemExit</span><span class="p">:</span>
<span class="k">break</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|gClosing the Python console.|n&quot;</span><span class="p">)</span>
@ -998,7 +995,7 @@
<span class="s2">&quot;|wIn-Game time&quot;</span><span class="p">,</span>
<span class="s2">&quot;|wReal time x </span><span class="si">%g</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">gametime</span><span class="o">.</span><span class="n">TIMEFACTOR</span><span class="p">,</span>
<span class="n">align</span><span class="o">=</span><span class="s2">&quot;l&quot;</span><span class="p">,</span>
<span class="n">width</span><span class="o">=</span><span class="mi">78</span><span class="p">,</span>
<span class="n">width</span><span class="o">=</span><span class="mi">77</span><span class="p">,</span>
<span class="n">border_top</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">epochtxt</span> <span class="o">=</span> <span class="s2">&quot;Epoch (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;from settings&quot;</span> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">TIME_GAME_EPOCH</span> <span class="k">else</span> <span class="s2">&quot;server start&quot;</span><span class="p">)</span>
@ -1249,6 +1246,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1267,7 +1265,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.system</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -315,21 +314,8 @@
<div class="viewcode-block" id="TestHelp"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestHelp">[docs]</a><span class="k">class</span> <span class="nc">TestHelp</span><span class="p">(</span><span class="n">CommandTest</span><span class="p">):</span>
<div class="viewcode-block" id="TestHelp.setUp"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestHelp.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">setUp</span><span class="p">()</span>
<span class="c1"># we need to set up a logger here since lunr takes over the logger otherwise</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">ERROR</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestHelp.tearDown"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestHelp.tearDown">[docs]</a> <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">tearDown</span><span class="p">()</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="n">logging</span><span class="o">.</span><span class="n">disable</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">ERROR</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestHelp.test_help"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestHelp.test_help">[docs]</a> <span class="k">def</span> <span class="nf">test_help</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">call</span><span class="p">(</span><span class="n">help</span><span class="o">.</span><span class="n">CmdHelp</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;Admin&quot;</span><span class="p">,</span> <span class="n">cmdset</span><span class="o">=</span><span class="n">CharacterCmdSet</span><span class="p">())</span></div>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">help</span><span class="o">.</span><span class="n">CmdHelp</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;Command help entries&quot;</span><span class="p">,</span> <span class="n">cmdset</span><span class="o">=</span><span class="n">CharacterCmdSet</span><span class="p">())</span></div>
<div class="viewcode-block" id="TestHelp.test_set_help"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestHelp.test_set_help">[docs]</a> <span class="k">def</span> <span class="nf">test_set_help</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">call</span><span class="p">(</span>
@ -1026,8 +1012,11 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetHome</span><span class="p">(),</span> <span class="s2">&quot;Obj = Room2&quot;</span><span class="p">,</span> <span class="s2">&quot;Home location of Obj was set to Room&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestBuilding.test_list_cmdsets"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestBuilding.test_list_cmdsets">[docs]</a> <span class="k">def</span> <span class="nf">test_list_cmdsets</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">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdListCmdSets</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;&lt;CmdSetHandler&gt; stack:</span><span class="se">\n</span><span class="s2"> &lt;CmdSet DefaultCharacter, Union, perm, prio 0&gt;:&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdListCmdSets</span><span class="p">(),</span>
<span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;&lt;CmdSetHandler&gt; stack:</span><span class="se">\n</span><span class="s2"> &lt;CmdSet DefaultCharacter, Union, perm, prio 0&gt;:&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdListCmdSets</span><span class="p">(),</span> <span class="s2">&quot;NotFound&quot;</span><span class="p">,</span> <span class="s2">&quot;Could not find &#39;NotFound&#39;&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestBuilding.test_typeclass"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestBuilding.test_typeclass">[docs]</a> <span class="k">def</span> <span class="nf">test_typeclass</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -1665,6 +1654,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1683,7 +1673,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.unloggedin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -336,7 +335,6 @@
<span class="s2"> |wquit|n - abort the connection</span>
<span class="s2">First create an account e.g. with |wcreate Anna c67jHL8p|n</span>
<span class="s2">(If you have spaces in your name, use double quotes: |wcreate &quot;Anna the Barbarian&quot; c67jHL8p|n</span>
<span class="s2">Next you can connect to the game: |wconnect Anna c67jHL8p|n</span>
<span class="s2">You can use the |wlook|n command if you want to see the connect screen again.</span>
@ -564,6 +562,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -582,7 +581,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.commands.default.unloggedin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.admin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -190,6 +189,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -208,7 +208,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.admin</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.channelhandler</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -66,7 +65,7 @@
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">evennia.commands</span> <span class="kn">import</span> <span class="n">cmdset</span><span class="p">,</span> <span class="n">command</span>
<span class="kn">from</span> <span class="nn">evennia.commands</span> <span class="kn">import</span> <span class="n">cmdset</span>
<span class="kn">from</span> <span class="nn">evennia.utils.logger</span> <span class="kn">import</span> <span class="n">tail_log_file</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">class_from_module</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
@ -77,9 +76,9 @@
<span class="n">_CHANNEL_HANDLER_CLASS</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_CHANNEL_COMMAND_CLASS</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_CHANNELDB</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_COMMAND_DEFAULT_CLASS</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">)</span>
<div class="viewcode-block" id="ChannelCommand"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelCommand">[docs]</a><span class="k">class</span> <span class="nc">ChannelCommand</span><span class="p">(</span><span class="n">command</span><span class="o">.</span><span class="n">Command</span><span class="p">):</span>
<div class="viewcode-block" id="ChannelCommand"><a class="viewcode-back" href="../../../api/evennia.comms.channelhandler.html#evennia.comms.channelhandler.ChannelCommand">[docs]</a><span class="k">class</span> <span class="nc">ChannelCommand</span><span class="p">(</span><span class="n">_COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> {channelkey} channel</span>
@ -390,6 +389,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -408,7 +408,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.channelhandler</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.comms</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -889,6 +888,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -907,7 +907,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.comms</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.managers</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -482,6 +481,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -500,7 +500,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.managers</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.models</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -808,6 +807,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -826,7 +826,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.models</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -1,958 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.awsstorage.aws_s3_cdn &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<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 1.0-dev</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-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.awsstorage.aws_s3_cdn</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.awsstorage.aws_s3_cdn</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">AWS Storage System</span>
<span class="sd">The Right Honourable Reverend (trhr) 2020</span>
<span class="sd">ABOUT THIS PLUGIN:</span>
<span class="sd">This plugin migrates the Web-based portion of Evennia, namely images,</span>
<span class="sd">javascript, and other items located inside staticfiles into Amazon AWS (S3) for hosting.</span>
<span class="sd">Files hosted on S3 are &quot;in the cloud,&quot; and while your personal</span>
<span class="sd">server may be sufficient for serving multimedia to a minimal number of users,</span>
<span class="sd">the perfect use case for this plugin would be:</span>
<span class="sd">1) Servers supporting heavy web-based traffic (webclient, etc)</span>
<span class="sd">2) With a sizable number of users</span>
<span class="sd">3) Where the users are globally distributed</span>
<span class="sd">4) Where multimedia files are served to users as a part of gameplay</span>
<span class="sd">Bottom line - if you&#39;re sending an image to a player every time they traverse a</span>
<span class="sd">map, the bandwidth reduction will be substantial. If not, probably skip</span>
<span class="sd">this one.</span>
<span class="sd">Note that storing and serving files via S3 is not technically free outside of</span>
<span class="sd">Amazon&#39;s &quot;free tier&quot; offering, which you may or may not be eligible for;</span>
<span class="sd">evennia&#39;s base install currently requires 1.5MB of storage space on S3,</span>
<span class="sd">making the current total cost to install this plugin ~$0.0005 per year. If</span>
<span class="sd">you have substantial media assets and intend to serve them to many users,</span>
<span class="sd">caveat emptor on a total cost of ownership - check AWS&#39;s pricing structure.</span>
<span class="sd">See the ./README.md file for details and install instructions.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">ImproperlyConfigured</span><span class="p">,</span>
<span class="n">SuspiciousOperation</span><span class="p">,</span>
<span class="n">SuspiciousFileOperation</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span> <span class="k">as</span> <span class="n">ev_settings</span>
<span class="k">if</span> <span class="p">(</span>
<span class="ow">not</span> <span class="n">ev_settings</span><span class="o">.</span><span class="n">AWS_ACCESS_KEY_ID</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="n">ev_settings</span><span class="o">.</span><span class="n">AWS_SECRET_ACCESS_KEY</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="n">ev_settings</span><span class="o">.</span><span class="n">AWS_STORAGE_BUCKET_NAME</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="n">ev_settings</span><span class="o">.</span><span class="n">AWS_S3_REGION_NAME</span>
<span class="p">):</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="p">(</span>
<span class="s2">&quot;You must add AWS-specific settings&quot;</span>
<span class="s2">&quot;to mygame/server/conf/secret_settings.py to use this plugin.&quot;</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;mygame-evennia&quot;</span> <span class="o">==</span> <span class="n">ev_settings</span><span class="o">.</span><span class="n">AWS_STORAGE_BUCKET_NAME</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="p">(</span>
<span class="s2">&quot;You must customize your AWS_STORAGE_BUCKET_NAME&quot;</span>
<span class="s2">&quot;in mygame/server/conf/secret_settings.py;&quot;</span>
<span class="s2">&quot;it must be unique among ALL other S3 users&quot;</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">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="kn">import</span> <span class="nn">io</span>
<span class="kn">import</span> <span class="nn">mimetypes</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">posixpath</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">from</span> <span class="nn">gzip</span> <span class="kn">import</span> <span class="n">GzipFile</span>
<span class="kn">from</span> <span class="nn">tempfile</span> <span class="kn">import</span> <span class="n">SpooledTemporaryFile</span>
<span class="kn">from</span> <span class="nn">django.core.files.base</span> <span class="kn">import</span> <span class="n">File</span>
<span class="kn">from</span> <span class="nn">django.core.files.storage</span> <span class="kn">import</span> <span class="n">Storage</span>
<span class="kn">from</span> <span class="nn">django.utils.deconstruct</span> <span class="kn">import</span> <span class="n">deconstructible</span>
<span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="kn">import</span> <span class="n">filepath_to_uri</span><span class="p">,</span> <span class="n">force_bytes</span><span class="p">,</span> <span class="n">force_text</span><span class="p">,</span> <span class="n">smart_text</span>
<span class="kn">from</span> <span class="nn">django.utils.timezone</span> <span class="kn">import</span> <span class="n">is_naive</span><span class="p">,</span> <span class="n">make_naive</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">django.utils.six.moves.urllib</span> <span class="kn">import</span> <span class="n">parse</span> <span class="k">as</span> <span class="n">urlparse</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">urllib</span> <span class="kn">import</span> <span class="n">parse</span> <span class="k">as</span> <span class="n">urlparse</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">boto3.session</span>
<span class="kn">from</span> <span class="nn">boto3</span> <span class="kn">import</span> <span class="n">__version__</span> <span class="k">as</span> <span class="n">boto3_version</span>
<span class="kn">from</span> <span class="nn">botocore.client</span> <span class="kn">import</span> <span class="n">Config</span>
<span class="kn">from</span> <span class="nn">botocore.exceptions</span> <span class="kn">import</span> <span class="n">ClientError</span>
<span class="k">except</span> <span class="ne">ImportError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span><span class="s2">&quot;Couldn&#39;t load S3 bindings. </span><span class="si">%s</span><span class="s2"> Did you run &#39;pip install boto3?&#39;&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="n">boto3_version_info</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="nb">int</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">boto3_version</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)])</span>
<div class="viewcode-block" id="setting"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.setting">[docs]</a><span class="k">def</span> <span class="nf">setting</span><span class="p">(</span><span class="n">name</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function to get a Django setting by name. If setting doesn&#39;t exist</span>
<span class="sd"> it will return a default.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): A Django setting name</span>
<span class="sd"> Returns:</span>
<span class="sd"> The value of the setting variable by that name</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">ev_settings</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span></div>
<div class="viewcode-block" id="safe_join"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.safe_join">[docs]</a><span class="k">def</span> <span class="nf">safe_join</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="o">*</span><span class="n">paths</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function, a version of django.utils._os.safe_join for S3 paths.</span>
<span class="sd"> Joins one or more path components to the base path component</span>
<span class="sd"> intelligently. Returns a normalized version of the final path.</span>
<span class="sd"> The final path must be located inside of the base path component</span>
<span class="sd"> (otherwise a ValueError is raised). Paths outside the base path</span>
<span class="sd"> indicate a possible security sensitive operation.</span>
<span class="sd"> Args:</span>
<span class="sd"> base (str): A path string to the base of the staticfiles</span>
<span class="sd"> *paths (list): A list of paths as referenced from the base path</span>
<span class="sd"> Returns:</span>
<span class="sd"> final_path (str): A joined path, base + filepath</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">base_path</span> <span class="o">=</span> <span class="n">force_text</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
<span class="n">base_path</span> <span class="o">=</span> <span class="n">base_path</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="n">paths</span> <span class="o">=</span> <span class="p">[</span><span class="n">force_text</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">paths</span><span class="p">]</span>
<span class="n">final_path</span> <span class="o">=</span> <span class="n">base_path</span> <span class="o">+</span> <span class="s2">&quot;/&quot;</span>
<span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">paths</span><span class="p">:</span>
<span class="n">_final_path</span> <span class="o">=</span> <span class="n">posixpath</span><span class="o">.</span><span class="n">normpath</span><span class="p">(</span><span class="n">posixpath</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">final_path</span><span class="p">,</span> <span class="n">path</span><span class="p">))</span>
<span class="c1"># posixpath.normpath() strips the trailing /. Add it back.</span>
<span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">_final_path</span> <span class="o">+</span> <span class="s2">&quot;/&quot;</span> <span class="o">==</span> <span class="n">final_path</span><span class="p">:</span>
<span class="n">_final_path</span> <span class="o">+=</span> <span class="s2">&quot;/&quot;</span>
<span class="n">final_path</span> <span class="o">=</span> <span class="n">_final_path</span>
<span class="k">if</span> <span class="n">final_path</span> <span class="o">==</span> <span class="n">base_path</span><span class="p">:</span>
<span class="n">final_path</span> <span class="o">+=</span> <span class="s2">&quot;/&quot;</span>
<span class="c1"># Ensure final_path starts with base_path and that the next character after</span>
<span class="c1"># the base path is /.</span>
<span class="n">base_path_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">base_path</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">final_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">base_path</span><span class="p">)</span> <span class="ow">or</span> <span class="n">final_path</span><span class="p">[</span><span class="n">base_path_len</span><span class="p">]</span> <span class="o">!=</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;the joined path is located outside of the base path&quot;</span> <span class="s2">&quot; component&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">final_path</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="check_location"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.check_location">[docs]</a><span class="k">def</span> <span class="nf">check_location</span><span class="p">(</span><span class="n">storage</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function to make sure that the storage location is configured correctly.</span>
<span class="sd"> Args:</span>
<span class="sd"> storage (Storage): A Storage object (Django)</span>
<span class="sd"> Raises:</span>
<span class="sd"> ImproperlyConfigured: If the storage location is not configured correctly,</span>
<span class="sd"> this is raised.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">storage</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">):</span>
<span class="n">correct</span> <span class="o">=</span> <span class="n">storage</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">{}</span><span class="s2">.location cannot begin with a leading slash. Found &#39;</span><span class="si">{}</span><span class="s2">&#39;. Use &#39;</span><span class="si">{}</span><span class="s2">&#39; instead.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">storage</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">storage</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="n">correct</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="lookup_env"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.lookup_env">[docs]</a><span class="k">def</span> <span class="nf">lookup_env</span><span class="p">(</span><span class="n">names</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function for looking up names in env vars. Returns the first element found.</span>
<span class="sd"> Args:</span>
<span class="sd"> names (str): A list of environment variables</span>
<span class="sd"> Returns:</span>
<span class="sd"> value (str): The value of the found environment variable.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span></div>
<div class="viewcode-block" id="get_available_overwrite_name"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.get_available_overwrite_name">[docs]</a><span class="k">def</span> <span class="nf">get_available_overwrite_name</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">max_length</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function indicating files that will be overwritten during trunc.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the file</span>
<span class="sd"> max_length (int): The maximum length of a filename</span>
<span class="sd"> Returns:</span>
<span class="sd"> joined (path): A joined path including directory, file, and extension</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">max_length</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">max_length</span><span class="p">:</span>
<span class="k">return</span> <span class="n">name</span>
<span class="c1"># Adapted from Django</span>
<span class="n">dir_name</span><span class="p">,</span> <span class="n">file_name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">file_root</span><span class="p">,</span> <span class="n">file_ext</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span>
<span class="n">truncation</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">-</span> <span class="n">max_length</span>
<span class="n">file_root</span> <span class="o">=</span> <span class="n">file_root</span><span class="p">[:</span><span class="o">-</span><span class="n">truncation</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">file_root</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">SuspiciousFileOperation</span><span class="p">(</span>
<span class="s1">&#39;aws-s3-cdn tried to truncate away entire filename &quot;</span><span class="si">%s</span><span class="s1">&quot;. &#39;</span>
<span class="s2">&quot;Please make sure that the corresponding file field &quot;</span>
<span class="s1">&#39;allows sufficient &quot;max_length&quot;.&#39;</span> <span class="o">%</span> <span class="n">name</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dir_name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">{}{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">file_root</span><span class="p">,</span> <span class="n">file_ext</span><span class="p">))</span></div>
<div class="viewcode-block" id="S3Boto3StorageFile"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3StorageFile">[docs]</a><span class="nd">@deconstructible</span>
<span class="k">class</span> <span class="nc">S3Boto3StorageFile</span><span class="p">(</span><span class="n">File</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The default file object used by the S3Boto3Storage backend.</span>
<span class="sd"> This file implements file streaming using boto&#39;s multipart</span>
<span class="sd"> uploading functionality. The file can be opened in read or</span>
<span class="sd"> write mode.</span>
<span class="sd"> This class extends Django&#39;s File class. However, the contained</span>
<span class="sd"> data is only the data contained in the current buffer. So you</span>
<span class="sd"> should not access the contained file object directly. You should</span>
<span class="sd"> access the data via this class.</span>
<span class="sd"> Warning: This file *must* be closed using the close() method in</span>
<span class="sd"> order to properly write the file to S3. Be sure to close the file</span>
<span class="sd"> in your application.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">buffer_size</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_FILE_BUFFER_SIZE&quot;</span><span class="p">,</span> <span class="mi">5242880</span><span class="p">)</span>
<div class="viewcode-block" id="S3Boto3StorageFile.__init__"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3StorageFile.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="n">storage</span><span class="p">,</span> <span class="n">buffer_size</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initializes the File object.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the file</span>
<span class="sd"> mode (str): The access mode (&#39;r&#39; or &#39;w&#39;)</span>
<span class="sd"> storage (Storage): The Django Storage object</span>
<span class="sd"> buffer_size (int): The buffer size, for multipart uploads</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="s2">&quot;r&quot;</span> <span class="ow">in</span> <span class="n">mode</span> <span class="ow">and</span> <span class="s2">&quot;w&quot;</span> <span class="ow">in</span> <span class="n">mode</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Can&#39;t combine &#39;r&#39; and &#39;w&#39; in mode.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_storage</span> <span class="o">=</span> <span class="n">storage</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_storage</span><span class="o">.</span><span class="n">location</span><span class="p">)</span> <span class="p">:]</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_mode</span> <span class="o">=</span> <span class="n">mode</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_force_mode</span> <span class="o">=</span> <span class="p">(</span><span class="k">lambda</span> <span class="n">b</span><span class="p">:</span> <span class="n">b</span><span class="p">)</span> <span class="k">if</span> <span class="s2">&quot;b&quot;</span> <span class="ow">in</span> <span class="n">mode</span> <span class="k">else</span> <span class="n">force_text</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="p">(</span><span class="n">storage</span><span class="o">.</span><span class="n">_encode_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">if</span> <span class="s2">&quot;w&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">mode</span><span class="p">:</span>
<span class="c1"># Force early RAII-style exception if object does not exist</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">load</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_is_dirty</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_raw_bytes_written</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_file</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_multipart</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># 5 MB is the minimum part size (if there is more than one part).</span>
<span class="c1"># Amazon allows up to 10,000 parts. The default supports uploads</span>
<span class="c1"># up to roughly 50 GB. Increase the part size to accommodate</span>
<span class="c1"># for files larger than this.</span>
<span class="k">if</span> <span class="n">buffer_size</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">buffer_size</span> <span class="o">=</span> <span class="n">buffer_size</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_write_counter</span> <span class="o">=</span> <span class="mi">0</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper property to return filesize</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">content_length</span>
<span class="k">def</span> <span class="nf">_get_file</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function to manage zipping and temporary files</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_file</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_file</span> <span class="o">=</span> <span class="n">SpooledTemporaryFile</span><span class="p">(</span>
<span class="n">max_size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_storage</span><span class="o">.</span><span class="n">max_memory_size</span><span class="p">,</span>
<span class="n">suffix</span><span class="o">=</span><span class="s2">&quot;.S3Boto3StorageFile&quot;</span><span class="p">,</span>
<span class="nb">dir</span><span class="o">=</span><span class="n">setting</span><span class="p">(</span><span class="s2">&quot;FILE_UPLOAD_TEMP_DIR&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;r&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_is_dirty</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">download_fileobj</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_file</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_file</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storage</span><span class="o">.</span><span class="n">gzip</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">content_encoding</span> <span class="o">==</span> <span class="s2">&quot;gzip&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_file</span> <span class="o">=</span> <span class="n">GzipFile</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_mode</span><span class="p">,</span> <span class="n">fileobj</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_file</span><span class="p">,</span> <span class="n">mtime</span><span class="o">=</span><span class="mf">0.0</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_file</span>
<span class="k">def</span> <span class="nf">_set_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_file</span> <span class="o">=</span> <span class="n">value</span>
<span class="n">file</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_file</span><span class="p">,</span> <span class="n">_set_file</span><span class="p">)</span>
<div class="viewcode-block" id="S3Boto3StorageFile.read"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3StorageFile.read">[docs]</a> <span class="k">def</span> <span class="nf">read</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks if file is in read mode; then continues to boto3 operation</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="s2">&quot;r&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;File was not opened in read mode.&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_force_mode</span><span class="p">(</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span></div>
<div class="viewcode-block" id="S3Boto3StorageFile.readline"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3StorageFile.readline">[docs]</a> <span class="k">def</span> <span class="nf">readline</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks if file is in read mode; then continues to boto3 operation</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="s2">&quot;r&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;File was not opened in read mode.&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_force_mode</span><span class="p">(</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">readline</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span></div>
<div class="viewcode-block" id="S3Boto3StorageFile.write"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3StorageFile.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks if file is in write mode or needs multipart handling,</span>
<span class="sd"> then continues to boto3 operation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="s2">&quot;w&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;File was not opened in write mode.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_is_dirty</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_multipart</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_multipart</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">initiate_multipart_upload</span><span class="p">(</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_storage</span><span class="o">.</span><span class="n">_get_write_parameters</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">buffer_size</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer_file_size</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_flush_write_buffer</span><span class="p">()</span>
<span class="n">bstr</span> <span class="o">=</span> <span class="n">force_bytes</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_raw_bytes_written</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">bstr</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="n">write</span><span class="p">(</span><span class="n">bstr</span><span class="p">)</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">_buffer_file_size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">pos</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_END</span><span class="p">)</span>
<span class="n">length</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span>
<span class="k">return</span> <span class="n">length</span>
<span class="k">def</span> <span class="nf">_flush_write_buffer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Flushes the write buffer.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_buffer_file_size</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_write_counter</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">part</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_multipart</span><span class="o">.</span><span class="n">Part</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_write_counter</span><span class="p">)</span>
<span class="n">part</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">Body</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">truncate</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_create_empty_on_close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Attempt to create an empty file for this key when this File is closed if no bytes</span>
<span class="sd"> have been written and no object already exists on S3 for this key.</span>
<span class="sd"> This behavior is meant to mimic the behavior of Django&#39;s builtin FileSystemStorage,</span>
<span class="sd"> where files are always created after they are opened in write mode:</span>
<span class="sd"> f = storage.open(&quot;file.txt&quot;, mode=&quot;w&quot;)</span>
<span class="sd"> f.close()</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Raised if a 404 error occurs</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">assert</span> <span class="s2">&quot;w&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span>
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_bytes_written</span> <span class="o">==</span> <span class="mi">0</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Check if the object exists on the server; if so, don&#39;t do anything</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">load</span><span class="p">()</span>
<span class="k">except</span> <span class="n">ClientError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">if</span> <span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="p">[</span><span class="s2">&quot;ResponseMetadata&quot;</span><span class="p">][</span><span class="s2">&quot;HTTPStatusCode&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">Body</span><span class="o">=</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_storage</span><span class="o">.</span><span class="n">_get_write_parameters</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<div class="viewcode-block" id="S3Boto3StorageFile.close"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3StorageFile.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Manages file closing after multipart uploads</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_dirty</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_flush_write_buffer</span><span class="p">()</span>
<span class="n">parts</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="s2">&quot;ETag&quot;</span><span class="p">:</span> <span class="n">part</span><span class="o">.</span><span class="n">e_tag</span><span class="p">,</span> <span class="s2">&quot;PartNumber&quot;</span><span class="p">:</span> <span class="n">part</span><span class="o">.</span><span class="n">part_number</span><span class="p">}</span>
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_multipart</span><span class="o">.</span><span class="n">parts</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_multipart</span><span class="o">.</span><span class="n">complete</span><span class="p">(</span><span class="n">MultipartUpload</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;Parts&quot;</span><span class="p">:</span> <span class="n">parts</span><span class="p">})</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_multipart</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">_multipart</span><span class="o">.</span><span class="n">abort</span><span class="p">()</span>
<span class="k">if</span> <span class="s2">&quot;w&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_bytes_written</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_create_empty_on_close</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_file</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">_file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_file</span> <span class="o">=</span> <span class="kc">None</span></div></div>
<div class="viewcode-block" id="S3Boto3Storage"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage">[docs]</a><span class="nd">@deconstructible</span>
<span class="k">class</span> <span class="nc">S3Boto3Storage</span><span class="p">(</span><span class="n">Storage</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Amazon Simple Storage Service using Boto3</span>
<span class="sd"> This storage backend supports opening files in read or write</span>
<span class="sd"> mode and supports streaming(buffering) data in chunks to S3</span>
<span class="sd"> when writing.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">default_content_type</span> <span class="o">=</span> <span class="s2">&quot;application/octet-stream&quot;</span>
<span class="c1"># If config provided in init, signature_version and addressing_style settings/args are ignored.</span>
<span class="n">config</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># used for looking up the access and secret key from env vars</span>
<span class="n">access_key_names</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;AWS_S3_ACCESS_KEY_ID&quot;</span><span class="p">,</span> <span class="s2">&quot;AWS_ACCESS_KEY_ID&quot;</span><span class="p">]</span>
<span class="n">secret_key_names</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;AWS_S3_SECRET_ACCESS_KEY&quot;</span><span class="p">,</span> <span class="s2">&quot;AWS_SECRET_ACCESS_KEY&quot;</span><span class="p">]</span>
<span class="n">security_token_names</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;AWS_SESSION_TOKEN&quot;</span><span class="p">,</span> <span class="s2">&quot;AWS_SECURITY_TOKEN&quot;</span><span class="p">]</span>
<span class="n">security_token</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">access_key</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_ACCESS_KEY_ID&quot;</span><span class="p">,</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_ACCESS_KEY_ID&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
<span class="n">secret_key</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_SECRET_ACCESS_KEY&quot;</span><span class="p">,</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_SECRET_ACCESS_KEY&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
<span class="n">file_overwrite</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_FILE_OVERWRITE&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">object_parameters</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_OBJECT_PARAMETERS&quot;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">bucket_name</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_STORAGE_BUCKET_NAME&quot;</span><span class="p">)</span>
<span class="n">auto_create_bucket</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_AUTO_CREATE_BUCKET&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">default_acl</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_DEFAULT_ACL&quot;</span><span class="p">,</span> <span class="s2">&quot;public-read&quot;</span><span class="p">)</span>
<span class="n">bucket_acl</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_BUCKET_ACL&quot;</span><span class="p">,</span> <span class="n">default_acl</span><span class="p">)</span>
<span class="n">querystring_auth</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_QUERYSTRING_AUTH&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">querystring_expire</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_QUERYSTRING_EXPIRE&quot;</span><span class="p">,</span> <span class="mi">3600</span><span class="p">)</span>
<span class="n">signature_version</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_SIGNATURE_VERSION&quot;</span><span class="p">)</span>
<span class="n">reduced_redundancy</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_REDUCED_REDUNDANCY&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_LOCATION&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">encryption</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_ENCRYPTION&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">custom_domain</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_CUSTOM_DOMAIN&quot;</span><span class="p">)</span>
<span class="n">addressing_style</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_ADDRESSING_STYLE&quot;</span><span class="p">)</span>
<span class="n">secure_urls</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_SECURE_URLS&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">file_name_charset</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_FILE_NAME_CHARSET&quot;</span><span class="p">,</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">)</span>
<span class="n">gzip</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_IS_GZIPPED&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">preload_metadata</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_PRELOAD_METADATA&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">gzip_content_types</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span>
<span class="s2">&quot;GZIP_CONTENT_TYPES&quot;</span><span class="p">,</span>
<span class="p">(</span>
<span class="s2">&quot;text/css&quot;</span><span class="p">,</span>
<span class="s2">&quot;text/javascript&quot;</span><span class="p">,</span>
<span class="s2">&quot;application/javascript&quot;</span><span class="p">,</span>
<span class="s2">&quot;application/x-javascript&quot;</span><span class="p">,</span>
<span class="s2">&quot;image/svg+xml&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="n">url_protocol</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_URL_PROTOCOL&quot;</span><span class="p">,</span> <span class="s2">&quot;http:&quot;</span><span class="p">)</span>
<span class="n">endpoint_url</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_ENDPOINT_URL&quot;</span><span class="p">)</span>
<span class="n">proxies</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_PROXIES&quot;</span><span class="p">)</span>
<span class="n">region_name</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_REGION_NAME&quot;</span><span class="p">)</span>
<span class="n">use_ssl</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_USE_SSL&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">verify</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_VERIFY&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">max_memory_size</span> <span class="o">=</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;AWS_S3_MAX_MEMORY_SIZE&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<div class="viewcode-block" id="S3Boto3Storage.__init__"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">acl</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">bucket</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">settings</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check if some of the settings we&#39;ve provided as class attributes</span>
<span class="sd"> need to be overwritten with values passed in here.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="n">check_location</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Backward-compatibility: given the anteriority of the SECURE_URL setting</span>
<span class="c1"># we fall back to https if specified in order to avoid the construction</span>
<span class="c1"># of unsecure urls.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">secure_urls</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">url_protocol</span> <span class="o">=</span> <span class="s2">&quot;https:&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_entries</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_bucket</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_connections</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">local</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">access_key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">secret_key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_access_keys</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">security_token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_security_token</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">:</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="n">s3</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;addressing_style&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">addressing_style</span><span class="p">},</span>
<span class="n">signature_version</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">signature_version</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">boto3_version_info</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">):</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;proxies&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span>
<span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">Config</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">__getstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">state</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">state</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;_connections&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">state</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;_bucket&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">state</span>
<span class="k">def</span> <span class="nf">__setstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
<span class="n">state</span><span class="p">[</span><span class="s2">&quot;_connections&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">local</span><span class="p">()</span>
<span class="n">state</span><span class="p">[</span><span class="s2">&quot;_bucket&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span> <span class="o">=</span> <span class="n">state</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">connection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates the actual connection to S3</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">connection</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_connections</span><span class="p">,</span> <span class="s2">&quot;connection&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">connection</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">boto3</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">Session</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">resource</span><span class="p">(</span>
<span class="s2">&quot;s3&quot;</span><span class="p">,</span>
<span class="n">aws_access_key_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">access_key</span><span class="p">,</span>
<span class="n">aws_secret_access_key</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">secret_key</span><span class="p">,</span>
<span class="n">aws_session_token</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">security_token</span><span class="p">,</span>
<span class="n">region_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span>
<span class="n">use_ssl</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">use_ssl</span><span class="p">,</span>
<span class="n">endpoint_url</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">endpoint_url</span><span class="p">,</span>
<span class="n">config</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">,</span>
<span class="n">verify</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">verify</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">bucket</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the current bucket. If there is no current bucket object</span>
<span class="sd"> create it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bucket</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_bucket</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_or_create_bucket</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bucket_name</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bucket</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">entries</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the locally cached files for the bucket.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">preload_metadata</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entries</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_entries</span> <span class="o">=</span> <span class="p">{</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_decode_name</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">key</span><span class="p">):</span> <span class="n">entry</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">Prefix</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entries</span>
<span class="k">def</span> <span class="nf">_get_access_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Gets the access keys to use when accessing S3. If none is</span>
<span class="sd"> provided in the settings then get them from the environment</span>
<span class="sd"> variables.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">access_key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">access_key</span> <span class="ow">or</span> <span class="n">lookup_env</span><span class="p">(</span><span class="n">S3Boto3Storage</span><span class="o">.</span><span class="n">access_key_names</span><span class="p">)</span>
<span class="n">secret_key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">secret_key</span> <span class="ow">or</span> <span class="n">lookup_env</span><span class="p">(</span><span class="n">S3Boto3Storage</span><span class="o">.</span><span class="n">secret_key_names</span><span class="p">)</span>
<span class="k">return</span> <span class="n">access_key</span><span class="p">,</span> <span class="n">secret_key</span>
<span class="k">def</span> <span class="nf">_get_security_token</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Gets the security token to use when accessing S3. Get it from</span>
<span class="sd"> the environment variables.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">security_token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_token</span> <span class="ow">or</span> <span class="n">lookup_env</span><span class="p">(</span><span class="n">S3Boto3Storage</span><span class="o">.</span><span class="n">security_token_names</span><span class="p">)</span>
<span class="k">return</span> <span class="n">security_token</span>
<span class="k">def</span> <span class="nf">_get_or_create_bucket</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieves a bucket if it exists, otherwise creates it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">bucket</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">Bucket</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_create_bucket</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Directly call head_bucket instead of bucket.load() because head_bucket()</span>
<span class="c1"># fails on wrong region, while bucket.load() does not.</span>
<span class="n">bucket</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">head_bucket</span><span class="p">(</span><span class="n">Bucket</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ClientError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">if</span> <span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="p">[</span><span class="s2">&quot;ResponseMetadata&quot;</span><span class="p">][</span><span class="s2">&quot;HTTPStatusCode&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">301</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">&quot;Bucket </span><span class="si">%s</span><span class="s2"> exists, but in a different &quot;</span>
<span class="s2">&quot;region than we are connecting to. Set &quot;</span>
<span class="s2">&quot;the region to connect to by setting &quot;</span>
<span class="s2">&quot;AWS_S3_REGION_NAME to the correct region.&quot;</span> <span class="o">%</span> <span class="n">name</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="p">[</span><span class="s2">&quot;ResponseMetadata&quot;</span><span class="p">][</span><span class="s2">&quot;HTTPStatusCode&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
<span class="c1"># Notes: When using the us-east-1 Standard endpoint, you can create</span>
<span class="c1"># buckets in other regions. The same is not true when hitting region specific</span>
<span class="c1"># endpoints. However, when you create the bucket not in the same region, the</span>
<span class="c1"># connection will fail all future requests to the Bucket after the creation</span>
<span class="c1"># (301 Moved Permanently).</span>
<span class="c1">#</span>
<span class="c1"># For simplicity, we enforce in S3Boto3Storage that any auto-created</span>
<span class="c1"># bucket must match the region that the connection is for.</span>
<span class="c1">#</span>
<span class="c1"># Also note that Amazon specifically disallows &quot;us-east-1&quot; when passing bucket</span>
<span class="c1"># region names; LocationConstraint *must* be blank to create in US Standard.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bucket_acl</span><span class="p">:</span>
<span class="n">bucket_params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;ACL&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">bucket_acl</span><span class="p">}</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">bucket_params</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">region_name</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">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">region_name</span>
<span class="k">if</span> <span class="n">region_name</span> <span class="o">!=</span> <span class="s2">&quot;us-east-1&quot;</span><span class="p">:</span>
<span class="n">bucket_params</span><span class="p">[</span><span class="s2">&quot;CreateBucketConfiguration&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;LocationConstraint&quot;</span><span class="p">:</span> <span class="n">region_name</span>
<span class="p">}</span>
<span class="n">bucket</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="o">**</span><span class="n">bucket_params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">return</span> <span class="n">bucket</span>
<span class="k">def</span> <span class="nf">_clean_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Cleans the name so that Windows style paths work</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Normalize Windows style paths</span>
<span class="n">clean_name</span> <span class="o">=</span> <span class="n">posixpath</span><span class="o">.</span><span class="n">normpath</span><span class="p">(</span><span class="n">name</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">&quot;</span><span class="p">,</span> <span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="c1"># os.path.normpath() can strip trailing slashes so we implement</span>
<span class="c1"># a workaround here.</span>
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">clean_name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">):</span>
<span class="c1"># Add a trailing slash as it was stripped.</span>
<span class="n">clean_name</span> <span class="o">+=</span> <span class="s2">&quot;/&quot;</span>
<span class="k">return</span> <span class="n">clean_name</span>
<span class="k">def</span> <span class="nf">_normalize_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Normalizes the name so that paths like /path/to/ignored/../something.txt</span>
<span class="sd"> work. We check to make sure that the path pointed to is not outside</span>
<span class="sd"> the directory specified by the LOCATION setting.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">safe_join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">SuspiciousOperation</span><span class="p">(</span><span class="s2">&quot;Attempted access to &#39;</span><span class="si">%s</span><span class="s2">&#39; denied.&quot;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_encode_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="n">smart_text</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">file_name_charset</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_decode_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="n">force_text</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">file_name_charset</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_compress_content</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Gzip a given string content.&quot;&quot;&quot;</span>
<span class="n">content</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">zbuf</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">BytesIO</span><span class="p">()</span>
<span class="c1"># The GZIP header has a modification time attribute (see http://www.zlib.org/rfc-gzip.html)</span>
<span class="c1"># Each time a file is compressed it changes even if the other contents don&#39;t change</span>
<span class="c1"># For S3 this defeats detection of changes using MD5 sums on gzipped files</span>
<span class="c1"># Fixing the mtime at 0.0 at compression time avoids this problem</span>
<span class="n">zfile</span> <span class="o">=</span> <span class="n">GzipFile</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s2">&quot;wb&quot;</span><span class="p">,</span> <span class="n">fileobj</span><span class="o">=</span><span class="n">zbuf</span><span class="p">,</span> <span class="n">mtime</span><span class="o">=</span><span class="mf">0.0</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">zfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">force_bytes</span><span class="p">(</span><span class="n">content</span><span class="o">.</span><span class="n">read</span><span class="p">()))</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">zfile</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">zbuf</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="c1"># Boto 2 returned the InMemoryUploadedFile with the file pointer replaced,</span>
<span class="c1"># but Boto 3 seems to have issues with that. No need for fp.name in Boto3</span>
<span class="c1"># so just returning the BytesIO directly</span>
<span class="k">return</span> <span class="n">zbuf</span>
<span class="k">def</span> <span class="nf">_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;rb&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Opens the file, if it exists.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">S3Boto3StorageFile</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ClientError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">if</span> <span class="n">err</span><span class="o">.</span><span class="n">response</span><span class="p">[</span><span class="s2">&quot;ResponseMetadata&quot;</span><span class="p">][</span><span class="s2">&quot;HTTPStatusCode&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">404</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">&quot;File does not exist: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
<span class="k">raise</span> <span class="c1"># Let it bubble up if it was some other error</span>
<span class="k">return</span> <span class="n">f</span>
<span class="k">def</span> <span class="nf">_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Stitches and cleans multipart uploads; normalizes file paths.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">cleaned_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_name</span><span class="p">(</span><span class="n">cleaned_name</span><span class="p">)</span>
<span class="n">params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_write_parameters</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">gzip</span>
<span class="ow">and</span> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;ContentType&quot;</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">gzip_content_types</span>
<span class="ow">and</span> <span class="s2">&quot;ContentEncoding&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">params</span>
<span class="p">):</span>
<span class="n">content</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compress_content</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;ContentEncoding&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;gzip&quot;</span>
<span class="n">encoded_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encode_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="p">(</span><span class="n">encoded_name</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">preload_metadata</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_entries</span><span class="p">[</span><span class="n">encoded_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span>
<span class="n">content</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_SET</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">ExtraArgs</span><span class="o">=</span><span class="n">params</span><span class="p">)</span>
<span class="k">return</span> <span class="n">cleaned_name</span>
<div class="viewcode-block" id="S3Boto3Storage.delete"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.delete">[docs]</a> <span class="k">def</span> <span class="nf">delete</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Deletes a file from S3.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_encode_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entries</span><span class="p">:</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entries</span><span class="p">[</span><span class="n">name</span><span class="p">]</span></div>
<div class="viewcode-block" id="S3Boto3Storage.exists"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.exists">[docs]</a> <span class="k">def</span> <span class="nf">exists</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks if file exists.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">entries</span><span class="p">:</span>
<span class="k">return</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">entries</span>
<span class="k">try</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">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">head_object</span><span class="p">(</span><span class="n">Bucket</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">bucket_name</span><span class="p">,</span> <span class="n">Key</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="n">ClientError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="S3Boto3Storage.listdir"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.listdir">[docs]</a> <span class="k">def</span> <span class="nf">listdir</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Translational function to go from S3 file paths to the format</span>
<span class="sd"> Django&#39;s listdir expects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="c1"># The path needs to end with a slash, but if the root is empty, leave</span>
<span class="c1"># it.</span>
<span class="k">if</span> <span class="n">path</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">):</span>
<span class="n">path</span> <span class="o">+=</span> <span class="s2">&quot;/&quot;</span>
<span class="n">directories</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">files</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">paginator</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">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get_paginator</span><span class="p">(</span><span class="s2">&quot;list_objects&quot;</span><span class="p">)</span>
<span class="n">pages</span> <span class="o">=</span> <span class="n">paginator</span><span class="o">.</span><span class="n">paginate</span><span class="p">(</span><span class="n">Bucket</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">bucket_name</span><span class="p">,</span> <span class="n">Delimiter</span><span class="o">=</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">Prefix</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
<span class="k">for</span> <span class="n">page</span> <span class="ow">in</span> <span class="n">pages</span><span class="p">:</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">page</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;CommonPrefixes&quot;</span><span class="p">,</span> <span class="p">()):</span>
<span class="n">directories</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">posixpath</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">entry</span><span class="p">[</span><span class="s2">&quot;Prefix&quot;</span><span class="p">],</span> <span class="n">path</span><span class="p">))</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">page</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;Contents&quot;</span><span class="p">,</span> <span class="p">()):</span>
<span class="n">files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">posixpath</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">entry</span><span class="p">[</span><span class="s2">&quot;Key&quot;</span><span class="p">],</span> <span class="n">path</span><span class="p">))</span>
<span class="k">return</span> <span class="n">directories</span><span class="p">,</span> <span class="n">files</span></div>
<div class="viewcode-block" id="S3Boto3Storage.size"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.size">[docs]</a> <span class="k">def</span> <span class="nf">size</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Gets the filesize of a remote file.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">entries</span><span class="p">:</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">entries</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">entry</span><span class="p">:</span>
<span class="k">return</span> <span class="n">entry</span><span class="o">.</span><span class="n">size</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="s2">&quot;size&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="n">entry</span><span class="o">.</span><span class="n">content_length</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_encode_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span><span class="o">.</span><span class="n">content_length</span></div>
<span class="k">def</span> <span class="nf">_get_write_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">encryption</span><span class="p">:</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;ServerSideEncryption&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;AES256&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reduced_redundancy</span><span class="p">:</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;StorageClass&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;REDUCED_REDUNDANCY&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_acl</span><span class="p">:</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;ACL&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_acl</span>
<span class="n">_type</span><span class="p">,</span> <span class="n">encoding</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">content_type</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s2">&quot;content_type&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">content_type</span> <span class="o">=</span> <span class="n">content_type</span> <span class="ow">or</span> <span class="n">_type</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_content_type</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;ContentType&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_type</span>
<span class="k">if</span> <span class="n">encoding</span><span class="p">:</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;ContentEncoding&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">encoding</span>
<span class="n">params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_object_parameters</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">return</span> <span class="n">params</span>
<div class="viewcode-block" id="S3Boto3Storage.get_object_parameters"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.get_object_parameters">[docs]</a> <span class="k">def</span> <span class="nf">get_object_parameters</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns a dictionary that is passed to file upload. Override this</span>
<span class="sd"> method to adjust this on a per-object basis to set e.g ContentDisposition.</span>
<span class="sd"> By default, returns the value of AWS_S3_OBJECT_PARAMETERS.</span>
<span class="sd"> Setting ContentEncoding will prevent objects from being automatically gzipped.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">object_parameters</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span></div>
<div class="viewcode-block" id="S3Boto3Storage.get_modified_time"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.get_modified_time">[docs]</a> <span class="k">def</span> <span class="nf">get_modified_time</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns an (aware) datetime object containing the last modified time if</span>
<span class="sd"> USE_TZ is True, otherwise returns a naive datetime in the local timezone.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">entries</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="c1"># only call self.bucket.Object() if the key is not found</span>
<span class="c1"># in the preloaded metadata.</span>
<span class="k">if</span> <span class="n">entry</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">entry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_encode_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">if</span> <span class="n">setting</span><span class="p">(</span><span class="s2">&quot;USE_TZ&quot;</span><span class="p">):</span>
<span class="c1"># boto3 returns TZ aware timestamps</span>
<span class="k">return</span> <span class="n">entry</span><span class="o">.</span><span class="n">last_modified</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">make_naive</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">last_modified</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3Storage.modified_time"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.modified_time">[docs]</a> <span class="k">def</span> <span class="nf">modified_time</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="sd">&quot;&quot;&quot;Returns a naive datetime object containing the last modified time.</span>
<span class="sd"> If USE_TZ=False then get_modified_time will return a naive datetime</span>
<span class="sd"> so we just return that, else we have to localize and strip the tz</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">mtime</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_modified_time</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">mtime</span> <span class="k">if</span> <span class="n">is_naive</span><span class="p">(</span><span class="n">mtime</span><span class="p">)</span> <span class="k">else</span> <span class="n">make_naive</span><span class="p">(</span><span class="n">mtime</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_strip_signing_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Boto3 does not currently support generating URLs that are unsigned. Instead we</span>
<span class="sd"> take the signed URLs and strip any querystring params related to signing and expiration.</span>
<span class="sd"> Note that this may end up with URLs that are still invalid, especially if params are</span>
<span class="sd"> passed in that only work with signed URLs, e.g. response header params.</span>
<span class="sd"> The code attempts to strip all query parameters that match names of known parameters</span>
<span class="sd"> from v2 and v4 signatures, regardless of the actual signature version used.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">split_url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlsplit</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">parse_qsl</span><span class="p">(</span><span class="n">split_url</span><span class="o">.</span><span class="n">query</span><span class="p">,</span> <span class="n">keep_blank_values</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">blacklist</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;x-amz-algorithm&quot;</span><span class="p">,</span>
<span class="s2">&quot;x-amz-credential&quot;</span><span class="p">,</span>
<span class="s2">&quot;x-amz-date&quot;</span><span class="p">,</span>
<span class="s2">&quot;x-amz-expires&quot;</span><span class="p">,</span>
<span class="s2">&quot;x-amz-signedheaders&quot;</span><span class="p">,</span>
<span class="s2">&quot;x-amz-signature&quot;</span><span class="p">,</span>
<span class="s2">&quot;x-amz-security-token&quot;</span><span class="p">,</span>
<span class="s2">&quot;awsaccesskeyid&quot;</span><span class="p">,</span>
<span class="s2">&quot;expires&quot;</span><span class="p">,</span>
<span class="s2">&quot;signature&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">filtered_qs</span> <span class="o">=</span> <span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">qs</span> <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">blacklist</span><span class="p">)</span>
<span class="c1"># Note: Parameters that did not have a value in the original query string will have</span>
<span class="c1"># an &#39;=&#39; sign appended to it, e.g ?foo&amp;bar becomes ?foo=&amp;bar=</span>
<span class="n">joined_qs</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">keyval</span><span class="p">)</span> <span class="k">for</span> <span class="n">keyval</span> <span class="ow">in</span> <span class="n">filtered_qs</span><span class="p">)</span>
<span class="n">split_url</span> <span class="o">=</span> <span class="n">split_url</span><span class="o">.</span><span class="n">_replace</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="s2">&quot;&amp;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">joined_qs</span><span class="p">))</span>
<span class="k">return</span> <span class="n">split_url</span><span class="o">.</span><span class="n">geturl</span><span class="p">()</span>
<div class="viewcode-block" id="S3Boto3Storage.url"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.url">[docs]</a> <span class="k">def</span> <span class="nf">url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parameters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">expire</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the URL of a remotely-hosted file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Preserve the trailing slash after normalizing the path.</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_normalize_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">custom_domain</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">//</span><span class="si">{}</span><span class="s2">/</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url_protocol</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">custom_domain</span><span class="p">,</span> <span class="n">filepath_to_uri</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">if</span> <span class="n">expire</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">expire</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">querystring_expire</span>
<span class="n">params</span> <span class="o">=</span> <span class="n">parameters</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">parameters</span> <span class="k">else</span> <span class="p">{}</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;Bucket&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">name</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;Key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encode_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">generate_presigned_url</span><span class="p">(</span>
<span class="s2">&quot;get_object&quot;</span><span class="p">,</span> <span class="n">Params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span> <span class="n">ExpiresIn</span><span class="o">=</span><span class="n">expire</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">querystring_auth</span><span class="p">:</span>
<span class="k">return</span> <span class="n">url</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_strip_signing_parameters</span><span class="p">(</span><span class="n">url</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3Storage.get_available_name"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.aws_s3_cdn.html#evennia.contrib.awsstorage.aws_s3_cdn.S3Boto3Storage.get_available_name">[docs]</a> <span class="k">def</span> <span class="nf">get_available_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Overwrite existing file with the same name.&quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">file_overwrite</span><span class="p">:</span>
<span class="k">return</span> <span class="n">get_available_overwrite_name</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">max_length</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="n">get_available_name</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">max_length</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div 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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="aws_s3_cdn.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></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 1.0-dev</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-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.awsstorage.aws_s3_cdn</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -1,696 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.awsstorage.tests &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<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 1.0-dev</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-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.awsstorage.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.awsstorage.tests</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span> <span class="nn">unittest</span> <span class="kn">import</span> <span class="n">skipIf</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">override_settings</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ImproperlyConfigured</span>
<span class="kn">from</span> <span class="nn">django.core.files.base</span> <span class="kn">import</span> <span class="n">ContentFile</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>
<span class="kn">from</span> <span class="nn">django.utils.timezone</span> <span class="kn">import</span> <span class="n">is_aware</span><span class="p">,</span> <span class="n">utc</span>
<span class="kn">import</span> <span class="nn">datetime</span><span class="o">,</span> <span class="nn">gzip</span><span class="o">,</span> <span class="nn">pickle</span><span class="o">,</span> <span class="nn">threading</span>
<span class="kn">from</span> <span class="nn">botocore.exceptions</span> <span class="kn">import</span> <span class="n">ClientError</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.awsstorage</span> <span class="kn">import</span> <span class="n">aws_s3_cdn</span> <span class="k">as</span> <span class="n">s3boto3</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">django.utils.six.moves.urllib</span> <span class="kn">import</span> <span class="n">parse</span> <span class="k">as</span> <span class="n">urlparse</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">urllib</span> <span class="kn">import</span> <span class="n">parse</span> <span class="k">as</span> <span class="n">urlparse</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">unittest</span> <span class="kn">import</span> <span class="n">mock</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="c1"># Python 3.2 and below</span>
<span class="kn">import</span> <span class="nn">mock</span>
<div class="viewcode-block" id="S3Boto3TestCase"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3TestCase">[docs]</a><span class="k">class</span> <span class="nc">S3Boto3TestCase</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<div class="viewcode-block" id="S3Boto3TestCase.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3TestCase.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span> <span class="o">=</span> <span class="n">s3boto3</span><span class="o">.</span><span class="n">S3Boto3Storage</span><span class="p">(</span><span class="n">access_key</span><span class="o">=</span><span class="s2">&quot;foo&quot;</span><span class="p">,</span> <span class="n">secret_key</span><span class="o">=</span><span class="s2">&quot;bar&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span></div></div>
<div class="viewcode-block" id="S3Boto3StorageTests"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests">[docs]</a><span class="k">class</span> <span class="nc">S3Boto3StorageTests</span><span class="p">(</span><span class="n">S3Boto3TestCase</span><span class="p">):</span>
<div class="viewcode-block" id="S3Boto3StorageTests.test_clean_name"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_clean_name">[docs]</a> <span class="k">def</span> <span class="nf">test_clean_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the base case of _clean_name</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="s2">&quot;path/to/somewhere&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s2">&quot;path/to/somewhere&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_clean_name_normalize"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_clean_name_normalize">[docs]</a> <span class="k">def</span> <span class="nf">test_clean_name_normalize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the normalization of _clean_name</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="s2">&quot;path/to/../somewhere&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s2">&quot;path/somewhere&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_clean_name_trailing_slash"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_clean_name_trailing_slash">[docs]</a> <span class="k">def</span> <span class="nf">test_clean_name_trailing_slash</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the _clean_name when the path has a trailing slash</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="s2">&quot;path/to/somewhere/&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s2">&quot;path/to/somewhere/&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_clean_name_windows"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_clean_name_windows">[docs]</a> <span class="k">def</span> <span class="nf">test_clean_name_windows</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the _clean_name when the path has a trailing slash</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_clean_name</span><span class="p">(</span><span class="s2">&quot;path</span><span class="se">\\</span><span class="s2">to</span><span class="se">\\</span><span class="s2">somewhere&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s2">&quot;path/to/somewhere&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_pickle_with_bucket"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_pickle_with_bucket">[docs]</a> <span class="k">def</span> <span class="nf">test_pickle_with_bucket</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test that the storage can be pickled with a bucket attached</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Ensure the bucket has been used</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_bucket</span><span class="p">)</span>
<span class="c1"># Can&#39;t pickle MagicMock, but you can&#39;t pickle a real Bucket object either</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="p">)</span>
<span class="n">new_storage</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsInstance</span><span class="p">(</span><span class="n">new_storage</span><span class="o">.</span><span class="n">_connections</span><span class="p">,</span> <span class="n">threading</span><span class="o">.</span><span class="n">local</span><span class="p">)</span>
<span class="c1"># Put the mock connection back in</span>
<span class="n">new_storage</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">new_storage</span><span class="o">.</span><span class="n">_bucket</span><span class="p">)</span>
<span class="n">new_storage</span><span class="o">.</span><span class="n">bucket</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">new_storage</span><span class="o">.</span><span class="n">_bucket</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_pickle_without_bucket"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_pickle_without_bucket">[docs]</a> <span class="k">def</span> <span class="nf">test_pickle_without_bucket</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test that the storage can be pickled, without a bucket instance</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Can&#39;t pickle a threadlocal</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="p">)</span>
<span class="n">new_storage</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsInstance</span><span class="p">(</span><span class="n">new_storage</span><span class="o">.</span><span class="n">_connections</span><span class="p">,</span> <span class="n">threading</span><span class="o">.</span><span class="n">local</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_url_slashes"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_url_slashes">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_url_slashes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test URL generation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">custom_domain</span> <span class="o">=</span> <span class="s2">&quot;example.com&quot;</span>
<span class="c1"># We expect no leading slashes in the path,</span>
<span class="c1"># and trailing slashes should be preserved.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">),</span> <span class="s2">&quot;https://example.com/&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="s2">&quot;path&quot;</span><span class="p">),</span> <span class="s2">&quot;https://example.com/path&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="s2">&quot;path/&quot;</span><span class="p">),</span> <span class="s2">&quot;https://example.com/path/&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="s2">&quot;path/1&quot;</span><span class="p">),</span> <span class="s2">&quot;https://example.com/path/1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="s2">&quot;path/1/&quot;</span><span class="p">),</span> <span class="s2">&quot;https://example.com/path/1/&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_save"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_save">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_save</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test saving a file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_storage_save.txt&quot;</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">ContentFile</span><span class="p">(</span><span class="s2">&quot;new content&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">content</span><span class="p">,</span> <span class="n">ExtraArgs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;ContentType&quot;</span><span class="p">:</span> <span class="s2">&quot;text/plain&quot;</span><span class="p">,</span> <span class="s2">&quot;ACL&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span><span class="p">,}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_save_with_acl"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_save_with_acl">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_save_with_acl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test saving a file with user defined ACL.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_storage_save.txt&quot;</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">ContentFile</span><span class="p">(</span><span class="s2">&quot;new content&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span> <span class="o">=</span> <span class="s2">&quot;private&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">content</span><span class="p">,</span> <span class="n">ExtraArgs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;ContentType&quot;</span><span class="p">:</span> <span class="s2">&quot;text/plain&quot;</span><span class="p">,</span> <span class="s2">&quot;ACL&quot;</span><span class="p">:</span> <span class="s2">&quot;private&quot;</span><span class="p">,}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_content_type"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_content_type">[docs]</a> <span class="k">def</span> <span class="nf">test_content_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test saving a file with a None content type.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_image.jpg&quot;</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">ContentFile</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">)</span>
<span class="n">content</span><span class="o">.</span><span class="n">content_type</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">content</span><span class="p">,</span> <span class="n">ExtraArgs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;ContentType&quot;</span><span class="p">:</span> <span class="s2">&quot;image/jpeg&quot;</span><span class="p">,</span> <span class="s2">&quot;ACL&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span><span class="p">,}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_save_gzipped"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_save_gzipped">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_save_gzipped</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test saving a gzipped file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_storage_save.gz&quot;</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">ContentFile</span><span class="p">(</span><span class="s2">&quot;I am gzip&#39;d&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">content</span><span class="p">,</span>
<span class="n">ExtraArgs</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;ContentType&quot;</span><span class="p">:</span> <span class="s2">&quot;application/octet-stream&quot;</span><span class="p">,</span>
<span class="s2">&quot;ContentEncoding&quot;</span><span class="p">:</span> <span class="s2">&quot;gzip&quot;</span><span class="p">,</span>
<span class="s2">&quot;ACL&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_save_gzip"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_save_gzip">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_save_gzip</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test saving a file with gzip enabled.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">gzip</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_storage_save.css&quot;</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">ContentFile</span><span class="p">(</span><span class="s2">&quot;I should be gzip&#39;d&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">mock</span><span class="o">.</span><span class="n">ANY</span><span class="p">,</span>
<span class="n">ExtraArgs</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;ContentType&quot;</span><span class="p">:</span> <span class="s2">&quot;text/css&quot;</span><span class="p">,</span>
<span class="s2">&quot;ContentEncoding&quot;</span><span class="p">:</span> <span class="s2">&quot;gzip&quot;</span><span class="p">,</span>
<span class="s2">&quot;ACL&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">)</span>
<span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="o">.</span><span class="n">call_args</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">zfile</span> <span class="o">=</span> <span class="n">gzip</span><span class="o">.</span><span class="n">GzipFile</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s2">&quot;rb&quot;</span><span class="p">,</span> <span class="n">fileobj</span><span class="o">=</span><span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">zfile</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="sa">b</span><span class="s2">&quot;I should be gzip&#39;d&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_save_gzip_twice"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_save_gzip_twice">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_save_gzip_twice</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test saving the same file content twice with gzip enabled.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Given</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">gzip</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_storage_save.css&quot;</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">ContentFile</span><span class="p">(</span><span class="s2">&quot;I should be gzip&#39;d&quot;</span><span class="p">)</span>
<span class="c1"># When</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="s2">&quot;test_storage_save_2.css&quot;</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="c1"># Then</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">mock</span><span class="o">.</span><span class="n">ANY</span><span class="p">,</span>
<span class="n">ExtraArgs</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;ContentType&quot;</span><span class="p">:</span> <span class="s2">&quot;text/css&quot;</span><span class="p">,</span>
<span class="s2">&quot;ContentEncoding&quot;</span><span class="p">:</span> <span class="s2">&quot;gzip&quot;</span><span class="p">,</span>
<span class="s2">&quot;ACL&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">)</span>
<span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">upload_fileobj</span><span class="o">.</span><span class="n">call_args</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">zfile</span> <span class="o">=</span> <span class="n">gzip</span><span class="o">.</span><span class="n">GzipFile</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s2">&quot;rb&quot;</span><span class="p">,</span> <span class="n">fileobj</span><span class="o">=</span><span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">zfile</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="sa">b</span><span class="s2">&quot;I should be gzip&#39;d&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_compress_content_len"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_compress_content_len">[docs]</a> <span class="k">def</span> <span class="nf">test_compress_content_len</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test that file returned by _compress_content() is readable.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">gzip</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">ContentFile</span><span class="p">(</span><span class="s2">&quot;I should be gzip&#39;d&quot;</span><span class="p">)</span>
<span class="n">content</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_compress_content</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="o">.</span><span class="n">read</span><span class="p">())</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_open_write"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_open_write">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_open_write</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test opening a file in write mode</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_open_for_writïng.txt&quot;</span>
<span class="n">content</span> <span class="o">=</span> <span class="s2">&quot;new content&quot;</span>
<span class="c1"># Set the encryption flag used for multipart uploads</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">encryption</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">reduced_redundancy</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span> <span class="o">=</span> <span class="s2">&quot;public-read&quot;</span>
<span class="n">file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="c1"># Set the name of the mock object</span>
<span class="n">obj</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">name</span>
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">initiate_multipart_upload</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">ACL</span><span class="o">=</span><span class="s2">&quot;public-read&quot;</span><span class="p">,</span>
<span class="n">ContentType</span><span class="o">=</span><span class="s2">&quot;text/plain&quot;</span><span class="p">,</span>
<span class="n">ServerSideEncryption</span><span class="o">=</span><span class="s2">&quot;AES256&quot;</span><span class="p">,</span>
<span class="n">StorageClass</span><span class="o">=</span><span class="s2">&quot;REDUCED_REDUNDANCY&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Save the internal file before closing</span>
<span class="n">multipart</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">initiate_multipart_upload</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">multipart</span><span class="o">.</span><span class="n">parts</span><span class="o">.</span><span class="n">all</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="p">[</span><span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">e_tag</span><span class="o">=</span><span class="s2">&quot;123&quot;</span><span class="p">,</span> <span class="n">part_number</span><span class="o">=</span><span class="mi">1</span><span class="p">)]</span>
<span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">multipart</span><span class="o">.</span><span class="n">Part</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">part</span> <span class="o">=</span> <span class="n">multipart</span><span class="o">.</span><span class="n">Part</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">part</span><span class="o">.</span><span class="n">upload</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">Body</span><span class="o">=</span><span class="n">content</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">))</span>
<span class="n">multipart</span><span class="o">.</span><span class="n">complete</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span>
<span class="n">MultipartUpload</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;Parts&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;ETag&quot;</span><span class="p">:</span> <span class="s2">&quot;123&quot;</span><span class="p">,</span> <span class="s2">&quot;PartNumber&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}]}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_open_no_write"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_open_no_write">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_open_no_write</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test opening file in write mode and closing without writing.</span>
<span class="sd"> A file should be created as by obj.put(...).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_open_no_write.txt&quot;</span>
<span class="c1"># Set the encryption flag used for puts</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">encryption</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">reduced_redundancy</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span> <span class="o">=</span> <span class="s2">&quot;public-read&quot;</span>
<span class="n">file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">load</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">ClientError</span><span class="p">(</span>
<span class="p">{</span><span class="s2">&quot;Error&quot;</span><span class="p">:</span> <span class="p">{},</span> <span class="s2">&quot;ResponseMetadata&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;HTTPStatusCode&quot;</span><span class="p">:</span> <span class="mi">404</span><span class="p">}},</span> <span class="s2">&quot;head_bucket&quot;</span>
<span class="p">)</span>
<span class="c1"># Set the name of the mock object</span>
<span class="n">obj</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">name</span>
<span class="c1"># Save the internal file before closing</span>
<span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">load</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">put</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span>
<span class="n">ACL</span><span class="o">=</span><span class="s2">&quot;public-read&quot;</span><span class="p">,</span>
<span class="n">Body</span><span class="o">=</span><span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">ContentType</span><span class="o">=</span><span class="s2">&quot;text/plain&quot;</span><span class="p">,</span>
<span class="n">ServerSideEncryption</span><span class="o">=</span><span class="s2">&quot;AES256&quot;</span><span class="p">,</span>
<span class="n">StorageClass</span><span class="o">=</span><span class="s2">&quot;REDUCED_REDUNDANCY&quot;</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_open_no_overwrite_existing"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_open_no_overwrite_existing">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_open_no_overwrite_existing</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test opening an existing file in write mode and closing without writing.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_open_no_overwrite_existing.txt&quot;</span>
<span class="c1"># Set the encryption flag used for puts</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">encryption</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">reduced_redundancy</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span> <span class="o">=</span> <span class="s2">&quot;public-read&quot;</span>
<span class="n">file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="c1"># Set the name of the mock object</span>
<span class="n">obj</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">name</span>
<span class="c1"># Save the internal file before closing</span>
<span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">load</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">put</span><span class="o">.</span><span class="n">assert_not_called</span><span class="p">()</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_write_beyond_buffer_size"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_write_beyond_buffer_size">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_write_beyond_buffer_size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test writing content that exceeds the buffer size</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_open_for_writïng_beyond_buffer_size.txt&quot;</span>
<span class="c1"># Set the encryption flag used for multipart uploads</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">encryption</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">reduced_redundancy</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">default_acl</span> <span class="o">=</span> <span class="s2">&quot;public-read&quot;</span>
<span class="n">file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="c1"># Set the name of the mock object</span>
<span class="n">obj</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">name</span>
<span class="c1"># Initiate the multipart upload</span>
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">initiate_multipart_upload</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">ACL</span><span class="o">=</span><span class="s2">&quot;public-read&quot;</span><span class="p">,</span>
<span class="n">ContentType</span><span class="o">=</span><span class="s2">&quot;text/plain&quot;</span><span class="p">,</span>
<span class="n">ServerSideEncryption</span><span class="o">=</span><span class="s2">&quot;AES256&quot;</span><span class="p">,</span>
<span class="n">StorageClass</span><span class="o">=</span><span class="s2">&quot;REDUCED_REDUNDANCY&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">multipart</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">initiate_multipart_upload</span><span class="o">.</span><span class="n">return_value</span>
<span class="c1"># Write content at least twice as long as the buffer size</span>
<span class="n">written_content</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">counter</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">written_content</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">file</span><span class="o">.</span><span class="n">buffer_size</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="s2">&quot;hello, aws </span><span class="si">{counter}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">counter</span><span class="o">=</span><span class="n">counter</span><span class="p">)</span>
<span class="c1"># Write more than just a few bytes in each iteration to keep the</span>
<span class="c1"># test reasonably fast</span>
<span class="n">content</span> <span class="o">+=</span> <span class="s2">&quot;*&quot;</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">file</span><span class="o">.</span><span class="n">buffer_size</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="n">written_content</span> <span class="o">+=</span> <span class="n">content</span>
<span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># Save the internal file before closing</span>
<span class="n">multipart</span><span class="o">.</span><span class="n">parts</span><span class="o">.</span><span class="n">all</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">e_tag</span><span class="o">=</span><span class="s2">&quot;123&quot;</span><span class="p">,</span> <span class="n">part_number</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span>
<span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">e_tag</span><span class="o">=</span><span class="s2">&quot;456&quot;</span><span class="p">,</span> <span class="n">part_number</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
<span class="p">]</span>
<span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertListEqual</span><span class="p">(</span><span class="n">multipart</span><span class="o">.</span><span class="n">Part</span><span class="o">.</span><span class="n">call_args_list</span><span class="p">,</span> <span class="p">[</span><span class="n">mock</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">mock</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="mi">2</span><span class="p">)])</span>
<span class="n">part</span> <span class="o">=</span> <span class="n">multipart</span><span class="o">.</span><span class="n">Part</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">uploaded_content</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">args_list</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;Body&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">args_list</span> <span class="ow">in</span> <span class="n">part</span><span class="o">.</span><span class="n">upload</span><span class="o">.</span><span class="n">call_args_list</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">uploaded_content</span><span class="p">,</span> <span class="n">written_content</span><span class="p">)</span>
<span class="n">multipart</span><span class="o">.</span><span class="n">complete</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span>
<span class="n">MultipartUpload</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;Parts&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;ETag&quot;</span><span class="p">:</span> <span class="s2">&quot;123&quot;</span><span class="p">,</span> <span class="s2">&quot;PartNumber&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span> <span class="p">{</span><span class="s2">&quot;ETag&quot;</span><span class="p">:</span> <span class="s2">&quot;456&quot;</span><span class="p">,</span> <span class="s2">&quot;PartNumber&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">},]</span>
<span class="p">}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_auto_creating_bucket"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_auto_creating_bucket">[docs]</a> <span class="k">def</span> <span class="nf">test_auto_creating_bucket</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">storage</span><span class="o">.</span><span class="n">auto_create_bucket</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">Bucket</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">Bucket</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">Bucket</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">region_name</span> <span class="o">=</span> <span class="s2">&quot;sa-east-1&quot;</span>
<span class="n">Bucket</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">head_bucket</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">ClientError</span><span class="p">(</span>
<span class="p">{</span><span class="s2">&quot;Error&quot;</span><span class="p">:</span> <span class="p">{},</span> <span class="s2">&quot;ResponseMetadata&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;HTTPStatusCode&quot;</span><span class="p">:</span> <span class="mi">404</span><span class="p">}},</span> <span class="s2">&quot;head_bucket&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_get_or_create_bucket</span><span class="p">(</span><span class="s2">&quot;testbucketname&quot;</span><span class="p">)</span>
<span class="n">Bucket</span><span class="o">.</span><span class="n">create</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span>
<span class="n">ACL</span><span class="o">=</span><span class="s2">&quot;public-read&quot;</span><span class="p">,</span> <span class="n">CreateBucketConfiguration</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;LocationConstraint&quot;</span><span class="p">:</span> <span class="s2">&quot;sa-east-1&quot;</span><span class="p">,}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_auto_creating_bucket_with_acl"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_auto_creating_bucket_with_acl">[docs]</a> <span class="k">def</span> <span class="nf">test_auto_creating_bucket_with_acl</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">storage</span><span class="o">.</span><span class="n">auto_create_bucket</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket_acl</span> <span class="o">=</span> <span class="s2">&quot;public-read&quot;</span>
<span class="n">Bucket</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">Bucket</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">Bucket</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">region_name</span> <span class="o">=</span> <span class="s2">&quot;sa-east-1&quot;</span>
<span class="n">Bucket</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">head_bucket</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">ClientError</span><span class="p">(</span>
<span class="p">{</span><span class="s2">&quot;Error&quot;</span><span class="p">:</span> <span class="p">{},</span> <span class="s2">&quot;ResponseMetadata&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;HTTPStatusCode&quot;</span><span class="p">:</span> <span class="mi">404</span><span class="p">}},</span> <span class="s2">&quot;head_bucket&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_get_or_create_bucket</span><span class="p">(</span><span class="s2">&quot;testbucketname&quot;</span><span class="p">)</span>
<span class="n">Bucket</span><span class="o">.</span><span class="n">create</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span>
<span class="n">ACL</span><span class="o">=</span><span class="s2">&quot;public-read&quot;</span><span class="p">,</span> <span class="n">CreateBucketConfiguration</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;LocationConstraint&quot;</span><span class="p">:</span> <span class="s2">&quot;sa-east-1&quot;</span><span class="p">,}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_exists"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_exists">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_exists</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">assertTrue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="s2">&quot;file.txt&quot;</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">head_object</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">Bucket</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket_name</span><span class="p">,</span> <span class="n">Key</span><span class="o">=</span><span class="s2">&quot;file.txt&quot;</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_exists_false"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_exists_false">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_exists_false</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">storage</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">head_object</span><span class="o">.</span><span class="n">side_effect</span> <span class="o">=</span> <span class="n">ClientError</span><span class="p">(</span>
<span class="p">{</span><span class="s2">&quot;Error&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;Code&quot;</span><span class="p">:</span> <span class="s2">&quot;404&quot;</span><span class="p">,</span> <span class="s2">&quot;Message&quot;</span><span class="p">:</span> <span class="s2">&quot;Not Found&quot;</span><span class="p">}},</span> <span class="s2">&quot;HeadObject&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="s2">&quot;file.txt&quot;</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">head_object</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">Bucket</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket_name</span><span class="p">,</span> <span class="n">Key</span><span class="o">=</span><span class="s2">&quot;file.txt&quot;</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_exists_doesnt_create_bucket"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_exists_doesnt_create_bucket">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_exists_doesnt_create_bucket</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">with</span> <span class="n">mock</span><span class="o">.</span><span class="n">patch</span><span class="o">.</span><span class="n">object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="p">,</span> <span class="s2">&quot;_get_or_create_bucket&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">method</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="s2">&quot;file.txt&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">method</span><span class="o">.</span><span class="n">called</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_delete"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_delete">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_delete</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">storage</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s2">&quot;path/to/file.txt&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="s2">&quot;path/to/file.txt&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span><span class="o">.</span><span class="n">delete</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">()</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_listdir_base"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_listdir_base">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_listdir_base</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Files:</span>
<span class="c1"># some/path/1.txt</span>
<span class="c1"># 2.txt</span>
<span class="c1"># other/path/3.txt</span>
<span class="c1"># 4.txt</span>
<span class="n">pages</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;CommonPrefixes&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;Prefix&quot;</span><span class="p">:</span> <span class="s2">&quot;some&quot;</span><span class="p">},</span> <span class="p">{</span><span class="s2">&quot;Prefix&quot;</span><span class="p">:</span> <span class="s2">&quot;other&quot;</span><span class="p">},],</span>
<span class="s2">&quot;Contents&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;Key&quot;</span><span class="p">:</span> <span class="s2">&quot;2.txt&quot;</span><span class="p">},</span> <span class="p">{</span><span class="s2">&quot;Key&quot;</span><span class="p">:</span> <span class="s2">&quot;4.txt&quot;</span><span class="p">},],</span>
<span class="p">},</span>
<span class="p">]</span>
<span class="n">paginator</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="n">paginator</span><span class="o">.</span><span class="n">paginate</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">pages</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get_paginator</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">paginator</span>
<span class="n">dirs</span><span class="p">,</span> <span class="n">files</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">paginator</span><span class="o">.</span><span class="n">paginate</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">Bucket</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">Delimiter</span><span class="o">=</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">Prefix</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">dirs</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;some&quot;</span><span class="p">,</span> <span class="s2">&quot;other&quot;</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">files</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;2.txt&quot;</span><span class="p">,</span> <span class="s2">&quot;4.txt&quot;</span><span class="p">])</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_listdir_subdir"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_listdir_subdir">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_listdir_subdir</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Files:</span>
<span class="c1"># some/path/1.txt</span>
<span class="c1"># some/2.txt</span>
<span class="n">pages</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="s2">&quot;CommonPrefixes&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;Prefix&quot;</span><span class="p">:</span> <span class="s2">&quot;some/path&quot;</span><span class="p">},],</span> <span class="s2">&quot;Contents&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;Key&quot;</span><span class="p">:</span> <span class="s2">&quot;some/2.txt&quot;</span><span class="p">},],},</span>
<span class="p">]</span>
<span class="n">paginator</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="n">paginator</span><span class="o">.</span><span class="n">paginate</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">pages</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get_paginator</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">paginator</span>
<span class="n">dirs</span><span class="p">,</span> <span class="n">files</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="s2">&quot;some/&quot;</span><span class="p">)</span>
<span class="n">paginator</span><span class="o">.</span><span class="n">paginate</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">Bucket</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">Delimiter</span><span class="o">=</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">Prefix</span><span class="o">=</span><span class="s2">&quot;some/&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">dirs</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;path&quot;</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">files</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;2.txt&quot;</span><span class="p">])</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_size"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_size">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">content_length</span> <span class="o">=</span> <span class="mi">4098</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;file.txt&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="n">obj</span><span class="o">.</span><span class="n">content_length</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_mtime"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_mtime">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_mtime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Test both USE_TZ cases</span>
<span class="k">for</span> <span class="n">use_tz</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">(</span><span class="n">USE_TZ</span><span class="o">=</span><span class="n">use_tz</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_test_storage_mtime</span><span class="p">(</span><span class="n">use_tz</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_test_storage_mtime</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_tz</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">last_modified</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">utc</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;file.txt&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span>
<span class="n">is_aware</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">modified_time</span><span class="p">(</span><span class="n">name</span><span class="p">)),</span>
<span class="s2">&quot;Naive datetime object expected from modified_time()&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIs</span><span class="p">(</span>
<span class="n">settings</span><span class="o">.</span><span class="n">USE_TZ</span><span class="p">,</span>
<span class="n">is_aware</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_modified_time</span><span class="p">(</span><span class="n">name</span><span class="p">)),</span>
<span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> datetime object expected from get_modified_time() when USE_TZ=</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="p">(</span><span class="s2">&quot;Naive&quot;</span><span class="p">,</span> <span class="s2">&quot;Aware&quot;</span><span class="p">)[</span><span class="n">settings</span><span class="o">.</span><span class="n">USE_TZ</span><span class="p">],</span> <span class="n">settings</span><span class="o">.</span><span class="n">USE_TZ</span>
<span class="p">),</span>
<span class="p">)</span>
<div class="viewcode-block" id="S3Boto3StorageTests.test_storage_url"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_storage_url">[docs]</a> <span class="k">def</span> <span class="nf">test_storage_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;test_storage_size.txt&quot;</span>
<span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;http://aws.amazon.com/</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">generate_presigned_url</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="n">url</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;bucket&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="n">url</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">generate_presigned_url</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="s2">&quot;get_object&quot;</span><span class="p">,</span>
<span class="n">Params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;Bucket&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;Key&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">},</span>
<span class="n">ExpiresIn</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">querystring_expire</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">custom_expire</span> <span class="o">=</span> <span class="mi">123</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">expire</span><span class="o">=</span><span class="n">custom_expire</span><span class="p">),</span> <span class="n">url</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">generate_presigned_url</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="s2">&quot;get_object&quot;</span><span class="p">,</span>
<span class="n">Params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;Bucket&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;Key&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">},</span>
<span class="n">ExpiresIn</span><span class="o">=</span><span class="n">custom_expire</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_generated_url_is_encoded"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_generated_url_is_encoded">[docs]</a> <span class="k">def</span> <span class="nf">test_generated_url_is_encoded</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">storage</span><span class="o">.</span><span class="n">custom_domain</span> <span class="o">=</span> <span class="s2">&quot;mock.cloudfront.net&quot;</span>
<span class="n">filename</span> <span class="o">=</span> <span class="s2">&quot;whacky &amp; filename.mp4&quot;</span>
<span class="n">url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">parsed_url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">parsed_url</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s2">&quot;/whacky</span><span class="si">%20%</span><span class="s2">26</span><span class="si">%20f</span><span class="s2">ilename.mp4&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">meta</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">generate_presigned_url</span><span class="o">.</span><span class="n">called</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_special_characters"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_special_characters">[docs]</a> <span class="k">def</span> <span class="nf">test_special_characters</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">storage</span><span class="o">.</span><span class="n">custom_domain</span> <span class="o">=</span> <span class="s2">&quot;mock.cloudfront.net&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;ãlöhâ.jpg&quot;</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">ContentFile</span><span class="p">(</span><span class="s2">&quot;new content&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">url</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">parsed_url</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">parsed_url</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s2">&quot;/%C3%A3l%C3%B6h%C3%A2.jpg&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_strip_signing_parameters"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_strip_signing_parameters">[docs]</a> <span class="k">def</span> <span class="nf">test_strip_signing_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">expected</span> <span class="o">=</span> <span class="s2">&quot;http://bucket.s3-aws-region.amazonaws.com/foo/bar&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_strip_signing_parameters</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">?X-Amz-Date=12345678&amp;X-Amz-Signature=Signature&quot;</span> <span class="o">%</span> <span class="n">expected</span>
<span class="p">),</span>
<span class="n">expected</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">_strip_signing_parameters</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">?expires=12345678&amp;signature=Signature&quot;</span> <span class="o">%</span> <span class="n">expected</span>
<span class="p">),</span>
<span class="n">expected</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_connection_threading"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_connection_threading">[docs]</a> <span class="nd">@skipIf</span><span class="p">(</span><span class="n">threading</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;Test requires threading&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">test_connection_threading</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">connections</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">thread_storage_connection</span><span class="p">():</span>
<span class="n">connections</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">connection</span><span class="p">)</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">thread_storage_connection</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="n">t</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
<span class="c1"># Connection for each thread needs to be unique</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNot</span><span class="p">(</span><span class="n">connections</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">connections</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_location_leading_slash"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_location_leading_slash">[docs]</a> <span class="k">def</span> <span class="nf">test_location_leading_slash</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;S3Boto3Storage.location cannot begin with a leading slash. &quot;</span>
<span class="s2">&quot;Found &#39;/&#39;. Use &#39;&#39; instead.&quot;</span>
<span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">ImproperlyConfigured</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">):</span>
<span class="n">s3boto3</span><span class="o">.</span><span class="n">S3Boto3Storage</span><span class="p">(</span><span class="n">location</span><span class="o">=</span><span class="s2">&quot;/&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_override_class_variable"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_override_class_variable">[docs]</a> <span class="k">def</span> <span class="nf">test_override_class_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">MyStorage1</span><span class="p">(</span><span class="n">s3boto3</span><span class="o">.</span><span class="n">S3Boto3Storage</span><span class="p">):</span>
<span class="n">location</span> <span class="o">=</span> <span class="s2">&quot;foo1&quot;</span>
<span class="n">storage</span> <span class="o">=</span> <span class="n">MyStorage1</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">storage</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="s2">&quot;foo1&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">MyStorage2</span><span class="p">(</span><span class="n">s3boto3</span><span class="o">.</span><span class="n">S3Boto3Storage</span><span class="p">):</span>
<span class="n">location</span> <span class="o">=</span> <span class="s2">&quot;foo2&quot;</span>
<span class="n">storage</span> <span class="o">=</span> <span class="n">MyStorage2</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">storage</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="s2">&quot;foo2&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="S3Boto3StorageTests.test_override_init_argument"><a class="viewcode-back" href="../../../../api/evennia.contrib.awsstorage.tests.html#evennia.contrib.awsstorage.tests.S3Boto3StorageTests.test_override_init_argument">[docs]</a> <span class="k">def</span> <span class="nf">test_override_init_argument</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">storage</span> <span class="o">=</span> <span class="n">s3boto3</span><span class="o">.</span><span class="n">S3Boto3Storage</span><span class="p">(</span><span class="n">location</span><span class="o">=</span><span class="s2">&quot;foo1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">storage</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="s2">&quot;foo1&quot;</span><span class="p">)</span>
<span class="n">storage</span> <span class="o">=</span> <span class="n">s3boto3</span><span class="o">.</span><span class="n">S3Boto3Storage</span><span class="p">(</span><span class="n">location</span><span class="o">=</span><span class="s2">&quot;foo2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">storage</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="s2">&quot;foo2&quot;</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div 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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="tests.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></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 1.0-dev</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-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.awsstorage.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.barter</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -964,6 +963,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -982,7 +982,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.barter</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.building_menu</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -1334,6 +1333,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1352,7 +1352,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.building_menu</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.chargen</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -261,6 +260,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -279,7 +279,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.chargen</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.clothing</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -811,6 +810,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -829,7 +829,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.clothing</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

File diff suppressed because it is too large Load diff

View file

@ -1,397 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.crafting.example_recipes &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<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 1.0-dev</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-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.crafting.example_recipes</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.crafting.example_recipes</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">How to make a sword - example crafting tree for the crafting system.</span>
<span class="sd">See the `SwordSmithingBaseRecipe` in this module for an example of extendng the</span>
<span class="sd">recipe with a mocked &#39;skill&#39; system (just random chance in our case). The skill</span>
<span class="sd">system used is game-specific but likely to be needed for most &#39;real&#39; crafting</span>
<span class="sd">systems.</span>
<span class="sd">Note that &#39;tools&#39; are references to the tools used - they don&#39;t need to be in</span>
<span class="sd">the inventory of the crafter. So when &#39;blast furnace&#39; is given below, it is a</span>
<span class="sd">reference to a blast furnace used, not suggesting the crafter is carrying it</span>
<span class="sd">around with them.</span>
<span class="sd">## Sword crafting tree</span>
<span class="sd">::</span>
<span class="sd"> # base materials (consumables)</span>
<span class="sd"> iron ore, ash, sand, coal, oak wood, water, fur</span>
<span class="sd"> # base tools (marked with [T] for clarity and assumed to already exist)</span>
<span class="sd"> blast furnace[T], furnace[T], crucible[T], anvil[T],</span>
<span class="sd"> hammer[T], knife[T], cauldron[T]</span>
<span class="sd"> # recipes for making a sword</span>
<span class="sd"> pig iron = iron ore + 2xcoal + blast furnace[T]</span>
<span class="sd"> crucible_steel = pig iron + ash + sand + 2xcoal + crucible[T]</span>
<span class="sd"> sword blade = crucible steel + hammer[T] + anvil[T] + furnace[T]</span>
<span class="sd"> sword pommel = crucible steel + hammer[T] + anvil[T] + furnace[T]</span>
<span class="sd"> sword guard = crucible steel + hammer[T] + anvil[T] + furnace[T]</span>
<span class="sd"> rawhide = fur + knife[T]</span>
<span class="sd"> oak bark + cleaned oak wood = oak wood + knife[T]</span>
<span class="sd"> leather = rawhide + oak bark + water + cauldron[T]</span>
<span class="sd"> sword handle = cleaned oak wood + knife[T]</span>
<span class="sd"> sword = sword blade + sword guard + sword pommel</span>
<span class="sd"> + sword handle + leather + knife[T] + hammer[T] + furnace[T]</span>
<span class="sd">----</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">random</span>
<span class="kn">from</span> <span class="nn">.crafting</span> <span class="kn">import</span> <span class="n">CraftingRecipe</span>
<div class="viewcode-block" id="PigIronRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.PigIronRecipe">[docs]</a><span class="k">class</span> <span class="nc">PigIronRecipe</span><span class="p">(</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Pig iron is a high-carbon result of melting iron in a blast furnace.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;pig iron&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;blast furnace&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;iron ore&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Pig Iron ingot&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;An ingot of crude pig iron.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;pig iron&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="CrucibleSteelRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.CrucibleSteelRecipe">[docs]</a><span class="k">class</span> <span class="nc">CrucibleSteelRecipe</span><span class="p">(</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Mixing pig iron with impurities like ash and sand and melting it in a</span>
<span class="sd"> crucible produces a medieval level of steel (like damascus steel).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;crucible steel&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;crucible&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;pig iron&quot;</span><span class="p">,</span> <span class="s2">&quot;ash&quot;</span><span class="p">,</span> <span class="s2">&quot;sand&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Crucible steel ingot&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;An ingot of multi-colored crucible steel.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span></div>
<span class="k">class</span> <span class="nc">_SwordSmithingBaseRecipe</span><span class="p">(</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A parent for all metallurgy sword-creation recipes. Those have a chance to</span>
<span class="sd"> failure but since steel is not lost in the process you can always try</span>
<span class="sd"> again.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">success_message</span> <span class="o">=</span> <span class="s2">&quot;Your smithing work bears fruit and you craft </span><span class="si">{outputs}</span><span class="s2">!&quot;</span>
<span class="n">failed_message</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;You work and work but you are not happy with the result. You need to start over.&quot;</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">do_craft</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Making a sword blade takes skill. Here we emulate this by introducing a</span>
<span class="sd"> random chance of failure (in a real game this could be a skill check</span>
<span class="sd"> against a skill found on `self.crafter`). In this case you can always</span>
<span class="sd"> start over since steel is not lost but can be re-smelted again for</span>
<span class="sd"> another try.</span>
<span class="sd"> Args:</span>
<span class="sd"> validated_inputs (list): all consumables/tools being used.</span>
<span class="sd"> **kwargs: any extra kwargs passed during crafting.</span>
<span class="sd"> Returns:</span>
<span class="sd"> any: The result of the craft, or None if a failure.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Depending on if we return a crafting result from this</span>
<span class="sd"> method or not, `success_message` or `failure_message`</span>
<span class="sd"> will be echoed to the crafter.</span>
<span class="sd"> (for more control we could also message directly and raise</span>
<span class="sd"> crafting.CraftingError to abort craft process on failure).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mf">0.8</span><span class="p">:</span>
<span class="c1"># 80% chance of success. This will spawn the sword and show</span>
<span class="c1"># success-message.</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">do_craft</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="c1"># fail and show failed message</span>
<span class="k">return</span> <span class="kc">None</span>
<div class="viewcode-block" id="SwordBladeRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.SwordBladeRecipe">[docs]</a><span class="k">class</span> <span class="nc">SwordBladeRecipe</span><span class="p">(</span><span class="n">_SwordSmithingBaseRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A [sword]blade requires hammering the steel out into shape using heat and</span>
<span class="sd"> force. This also includes the tang, which is the base for the hilt (the</span>
<span class="sd"> part of the sword you hold on to).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;sword blade&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;hammer&quot;</span><span class="p">,</span> <span class="s2">&quot;anvil&quot;</span><span class="p">,</span> <span class="s2">&quot;furnace&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Sword blade&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A long blade that may one day become a sword.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;sword blade&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="SwordPommelRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.SwordPommelRecipe">[docs]</a><span class="k">class</span> <span class="nc">SwordPommelRecipe</span><span class="p">(</span><span class="n">_SwordSmithingBaseRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The pommel is the &#39;button&#39; or &#39;ball&#39; etc the end of the sword hilt, holding</span>
<span class="sd"> it together.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;sword pommel&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;hammer&quot;</span><span class="p">,</span> <span class="s2">&quot;anvil&quot;</span><span class="p">,</span> <span class="s2">&quot;furnace&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Sword pommel&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;The pommel for a future sword.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;sword pommel&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="SwordGuardRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.SwordGuardRecipe">[docs]</a><span class="k">class</span> <span class="nc">SwordGuardRecipe</span><span class="p">(</span><span class="n">_SwordSmithingBaseRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The guard stops the hand from accidentally sliding off the hilt onto the</span>
<span class="sd"> sword&#39;s blade and also protects the hand when parrying.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;sword guard&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;hammer&quot;</span><span class="p">,</span> <span class="s2">&quot;anvil&quot;</span><span class="p">,</span> <span class="s2">&quot;furnace&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Sword guard&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;The cross-guard for a future sword.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;sword guard&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="RawhideRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.RawhideRecipe">[docs]</a><span class="k">class</span> <span class="nc">RawhideRecipe</span><span class="p">(</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Rawhide is animal skin cleaned and stripped of hair.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;rawhide&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;knife&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;fur&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Rawhide&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Animal skin, cleaned and with hair removed.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;rawhide&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="OakBarkRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.OakBarkRecipe">[docs]</a><span class="k">class</span> <span class="nc">OakBarkRecipe</span><span class="p">(</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The actual thing needed for tanning leather is Tannin, but we skip</span>
<span class="sd"> the step of refining tannin from the bark and use the bark as-is.</span>
<span class="sd"> This produces two outputs - the bark and the cleaned wood.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;oak bark&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;knife&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;oak wood&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Oak bark&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Bark of oak, stripped from the core wood.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;oak bark&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Oak Wood (cleaned)&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Oakwood core, stripped of bark.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;cleaned oak wood&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">},</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="LeatherRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.LeatherRecipe">[docs]</a><span class="k">class</span> <span class="nc">LeatherRecipe</span><span class="p">(</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Leather is produced by tanning rawhide in a process traditionally involving</span>
<span class="sd"> the chemical Tannin. Here we abbreviate this process a bit. Maybe a</span>
<span class="sd"> &#39;tanning rack&#39; tool should be required too ...</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;leather&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;cauldron&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;rawhide&quot;</span><span class="p">,</span> <span class="s2">&quot;oak bark&quot;</span><span class="p">,</span> <span class="s2">&quot;water&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Piece of Leather&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A piece of leather.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;leather&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="SwordHandleRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.SwordHandleRecipe">[docs]</a><span class="k">class</span> <span class="nc">SwordHandleRecipe</span><span class="p">(</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The handle is the part of the hilt between the guard and the pommel where</span>
<span class="sd"> you hold the sword. It consists of wooden pieces around the steel tang. It</span>
<span class="sd"> is wrapped in leather, but that will be added at the end.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;sword handle&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;knife&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;cleaned oak wood&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Sword handle&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Two pieces of wood to be be fitted onto a sword&#39;s tang as its handle.&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;sword handle&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="SwordRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.example_recipes.html#evennia.contrib.crafting.example_recipes.SwordRecipe">[docs]</a><span class="k">class</span> <span class="nc">SwordRecipe</span><span class="p">(</span><span class="n">_SwordSmithingBaseRecipe</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A finished sword consists of a Blade ending in a non-sharp part called the</span>
<span class="sd"> Tang. The cross Guard is put over the tang against the edge of the blade.</span>
<span class="sd"> The Handle is put over the tang to give something easier to hold. The</span>
<span class="sd"> Pommel locks everything in place. The handle is wrapped in leather</span>
<span class="sd"> strips for better grip.</span>
<span class="sd"> This covers only a single &#39;sword&#39; type.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;sword&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;hammer&quot;</span><span class="p">,</span> <span class="s2">&quot;furnace&quot;</span><span class="p">,</span> <span class="s2">&quot;knife&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;sword blade&quot;</span><span class="p">,</span> <span class="s2">&quot;sword guard&quot;</span><span class="p">,</span> <span class="s2">&quot;sword pommel&quot;</span><span class="p">,</span> <span class="s2">&quot;sword handle&quot;</span><span class="p">,</span> <span class="s2">&quot;leather&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Sword&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A bladed weapon.&quot;</span><span class="p">,</span>
<span class="c1"># setting the tag as well - who knows if one can make something from this too!</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;sword&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="c1"># obviously there would be other properties of a &#39;sword&#39; added here</span>
<span class="c1"># too, depending on how combat works in the your game!</span>
<span class="p">]</span>
<span class="c1"># this requires more precision</span>
<span class="n">exact_consumable_order</span> <span class="o">=</span> <span class="kc">True</span></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div 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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="example_recipes.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></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 1.0-dev</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-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.crafting.example_recipes</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -1,783 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.crafting.tests &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<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 1.0-dev</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-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.crafting.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.crafting.tests</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Unit tests for the crafting system contrib.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">unittest</span> <span class="kn">import</span> <span class="n">mock</span>
<span class="kn">from</span> <span class="nn">anything</span> <span class="kn">import</span> <span class="n">Something</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">override_settings</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ObjectDoesNotExist</span>
<span class="kn">from</span> <span class="nn">evennia.commands.default.tests</span> <span class="kn">import</span> <span class="n">CommandTest</span>
<span class="kn">from</span> <span class="nn">evennia.utils.test_resources</span> <span class="kn">import</span> <span class="n">TestCase</span><span class="p">,</span> <span class="n">EvenniaTest</span>
<span class="kn">from</span> <span class="nn">evennia.utils.create</span> <span class="kn">import</span> <span class="n">create_object</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">crafting</span><span class="p">,</span> <span class="n">example_recipes</span>
<div class="viewcode-block" id="TestCraftUtils"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftUtils">[docs]</a><span class="k">class</span> <span class="nc">TestCraftUtils</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test helper utils for crafting.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">maxDiff</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="TestCraftUtils.test_load_recipes"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftUtils.test_load_recipes">[docs]</a> <span class="nd">@override_settings</span><span class="p">(</span><span class="n">CRAFT_RECIPE_MODULES</span><span class="o">=</span><span class="p">[])</span>
<span class="k">def</span> <span class="nf">test_load_recipes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;This should only load the example module now&quot;&quot;&quot;</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">_load_recipes</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">_RECIPE_CLASSES</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;crucible steel&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">CrucibleSteelRecipe</span><span class="p">,</span>
<span class="s2">&quot;leather&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">LeatherRecipe</span><span class="p">,</span>
<span class="s2">&quot;oak bark&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">OakBarkRecipe</span><span class="p">,</span>
<span class="s2">&quot;pig iron&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">PigIronRecipe</span><span class="p">,</span>
<span class="s2">&quot;rawhide&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">RawhideRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword blade&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordBladeRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword guard&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordGuardRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword handle&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordHandleRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword pommel&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordPommelRecipe</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">)</span></div></div>
<span class="k">class</span> <span class="nc">_TestMaterial</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">def</span> <span class="fm">__repr__</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">name</span>
<div class="viewcode-block" id="TestCraftingRecipeBase"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase">[docs]</a><span class="k">class</span> <span class="nc">TestCraftingRecipeBase</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the parent recipe class.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TestCraftingRecipeBase.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inp1</span> <span class="o">=</span> <span class="n">_TestMaterial</span><span class="p">(</span><span class="s2">&quot;test1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inp2</span> <span class="o">=</span> <span class="n">_TestMaterial</span><span class="p">(</span><span class="s2">&quot;test2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inp3</span> <span class="o">=</span> <span class="n">_TestMaterial</span><span class="p">(</span><span class="s2">&quot;test3&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;kw1&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;kw2&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span> <span class="o">=</span> <span class="n">crafting</span><span class="o">.</span><span class="n">CraftingRecipeBase</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp3</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_msg"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_msg">[docs]</a> <span class="k">def</span> <span class="nf">test_msg</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test messaging to crafter&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;message&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="s2">&quot;message&quot;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">})</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_pre_craft"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_pre_craft">[docs]</a> <span class="k">def</span> <span class="nf">test_pre_craft</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test validating hook&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">pre_craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">validated_inputs</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inp1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp3</span><span class="p">))</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_pre_craft_fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_pre_craft_fail">[docs]</a> <span class="k">def</span> <span class="nf">test_pre_craft_fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Should rase error if validation fails&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">allow_craft</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">crafting</span><span class="o">.</span><span class="n">CraftingValidationError</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">pre_craft</span><span class="p">()</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_craft_hook__succeed"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_craft_hook__succeed">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_hook__succeed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test craft hook, the main access method.&quot;&quot;&quot;</span>
<span class="n">expected_result</span> <span class="o">=</span> <span class="n">_TestMaterial</span><span class="p">(</span><span class="s2">&quot;test_result&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">do_craft</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">expected_result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">allow_craft</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="c1"># check result</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">expected_result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">do_craft</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">kw1</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">kw2</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># since allow_reuse is False, this usage should now be turned off</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">allow_craft</span><span class="p">)</span>
<span class="c1"># trying to re-run again should fail since rerun is False</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">crafting</span><span class="o">.</span><span class="n">CraftingError</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_craft_hook__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_craft_hook__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_hook__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test failing the call&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">do_craft</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="c1"># trigger exception</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">crafting</span><span class="o">.</span><span class="n">CraftingError</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">(</span><span class="n">raise_exception</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># reset and try again without exception</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">allow_craft</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span></div></div>
<span class="k">class</span> <span class="nc">_MockRecipe</span><span class="p">(</span><span class="n">crafting</span><span class="o">.</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;testrecipe&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;tool1&quot;</span><span class="p">,</span> <span class="s2">&quot;tool2&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;cons1&quot;</span><span class="p">,</span> <span class="s2">&quot;cons2&quot;</span><span class="p">,</span> <span class="s2">&quot;cons3&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Result1&quot;</span><span class="p">,</span>
<span class="s2">&quot;prototype_key&quot;</span><span class="p">:</span> <span class="s2">&quot;resultprot&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;result1&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span>
<div class="viewcode-block" id="TestCraftingRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe">[docs]</a><span class="nd">@override_settings</span><span class="p">(</span><span class="n">CRAFT_RECIPE_MODULES</span><span class="o">=</span><span class="p">[])</span>
<span class="k">class</span> <span class="nc">TestCraftingRecipe</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the CraftingRecipe class with one recipe</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">maxDiff</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="TestCraftingRecipe.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tool1</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;tool1&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;tool1&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tool2</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;tool2&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;tool2&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons1</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons1&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons1&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons2</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons2&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons2&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons3</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons3&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons3&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.tearDown"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.tearDown">[docs]</a> <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">except</span> <span class="n">ObjectDoesNotExist</span><span class="p">:</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_error_format"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_error_format">[docs]</a> <span class="k">def</span> <span class="nf">test_error_format</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test the automatic error formatter &quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span>
<span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{missing}</span><span class="s2">,</span><span class="si">{tools}</span><span class="s2">,</span><span class="si">{consumables}</span><span class="s2">,</span><span class="si">{inputs}</span><span class="s2">,</span><span class="si">{outputs}</span><span class="s2">&quot;</span> <span class="s2">&quot;</span><span class="si">{i0}</span><span class="s2">,</span><span class="si">{i1}</span><span class="s2">,</span><span class="si">{o0}</span><span class="s2">&quot;</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;missing&quot;</span><span class="p">:</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span>
<span class="s2">&quot;tools&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;bar&quot;</span><span class="p">,</span> <span class="s2">&quot;bar2&quot;</span><span class="p">,</span> <span class="s2">&quot;bar3&quot;</span><span class="p">],</span>
<span class="s2">&quot;consumables&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;cons1&quot;</span><span class="p">,</span> <span class="s2">&quot;cons2&quot;</span><span class="p">],</span>
<span class="p">}</span>
<span class="n">expected</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;missing&quot;</span><span class="p">:</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span>
<span class="s2">&quot;i0&quot;</span><span class="p">:</span> <span class="s2">&quot;cons1&quot;</span><span class="p">,</span>
<span class="s2">&quot;i1&quot;</span><span class="p">:</span> <span class="s2">&quot;cons2&quot;</span><span class="p">,</span>
<span class="s2">&quot;i2&quot;</span><span class="p">:</span> <span class="s2">&quot;cons3&quot;</span><span class="p">,</span>
<span class="s2">&quot;o0&quot;</span><span class="p">:</span> <span class="s2">&quot;Result1&quot;</span><span class="p">,</span>
<span class="s2">&quot;tools&quot;</span><span class="p">:</span> <span class="s2">&quot;bar, bar2 and bar3&quot;</span><span class="p">,</span>
<span class="s2">&quot;consumables&quot;</span><span class="p">:</span> <span class="s2">&quot;cons1 and cons2&quot;</span><span class="p">,</span>
<span class="s2">&quot;inputs&quot;</span><span class="p">:</span> <span class="s2">&quot;cons1, cons2 and cons3&quot;</span><span class="p">,</span>
<span class="s2">&quot;outputs&quot;</span><span class="p">:</span> <span class="s2">&quot;Result1&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">_format_message</span><span class="p">(</span><span class="n">msg</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">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">expected</span><span class="p">))</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft__success"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft__success">[docs]</a> <span class="k">def</span> <span class="nf">test_craft__success</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test to create a result from the recipe&quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span>
<span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="s2">&quot;Result1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span> <span class="p">[</span><span class="s2">&quot;result1&quot;</span><span class="p">,</span> <span class="s2">&quot;resultprot&quot;</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">}</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are gone</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_seed__succcess"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_seed__succcess">[docs]</a> <span class="k">def</span> <span class="nf">test_seed__succcess</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test seed helper classmethod&quot;&quot;&quot;</span>
<span class="c1"># needed for other dbs to pass seed</span>
<span class="n">homeroom</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;HomeRoom&quot;</span><span class="p">,</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># call classmethod directly</span>
<span class="k">with</span> <span class="n">override_settings</span><span class="p">(</span><span class="n">DEFAULT_HOME</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;#</span><span class="si">{</span><span class="n">homeroom</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="n">tools</span><span class="p">,</span> <span class="n">consumables</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="o">.</span><span class="n">seed</span><span class="p">()</span>
<span class="c1"># this should be a normal successful crafting</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">tools</span> <span class="o">+</span> <span class="n">consumables</span><span class="p">))</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="s2">&quot;Result1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span> <span class="p">[</span><span class="s2">&quot;result1&quot;</span><span class="p">,</span> <span class="s2">&quot;resultprot&quot;</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">}</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are gone</span>
<span class="k">for</span> <span class="n">cons</span> <span class="ow">in</span> <span class="n">consumables</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">cons</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="k">for</span> <span class="n">tool</span> <span class="ow">in</span> <span class="n">tools</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">tool</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_missing_tool__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_missing_tool__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_missing_tool__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail craft by missing tool2&quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_tool_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;tool2&quot;</span><span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_missing_cons__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_missing_cons__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_missing_cons__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail craft by missing cons3&quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_consumable_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;cons3&quot;</span><span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_missing_cons__always_consume__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_missing_cons__always_consume__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_missing_cons__always_consume__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail craft by missing cons3, with always-consume flag&quot;&quot;&quot;</span>
<span class="n">cons4</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons4&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons4&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="n">cons4</span><span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">consume_on_fail</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_consumable_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;cons3&quot;</span><span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are deleted even though we failed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># the extra should also be gone</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">cons4</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># but cons3 should be fine since it was not included</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain as normal</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_wrong_tool__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_wrong_tool__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_wrong_tool__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail craft by including a wrong tool&quot;&quot;&quot;</span>
<span class="n">wrong</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;wrong&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;wrongtool&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="n">wrong</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_tool_excess_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">excess</span><span class="o">=</span><span class="n">wrong</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_tool_excess__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_tool_excess__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_tool_excess__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail by too many consumables&quot;&quot;&quot;</span>
<span class="c1"># note that this is a valid tag!</span>
<span class="n">tool3</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;tool3&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;tool2&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="n">tool3</span>
<span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_tool_excess_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">excess</span><span class="o">=</span><span class="n">tool3</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">tool3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_cons_excess__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_cons_excess__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_cons_excess__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail by too many consumables&quot;&quot;&quot;</span>
<span class="c1"># note that this is a valid tag!</span>
<span class="n">cons4</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons4&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons3&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="n">cons4</span>
<span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_consumable_excess_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">excess</span><span class="o">=</span><span class="n">cons4</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">cons4</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_tool_excess__sucess"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_tool_excess__sucess">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_tool_excess__sucess</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Allow too many consumables&quot;&quot;&quot;</span>
<span class="n">tool3</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;tool3&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;tool2&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="n">tool3</span>
<span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">exact_tools</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">}</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are gone</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_cons_excess__sucess"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_cons_excess__sucess">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_cons_excess__sucess</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Allow too many consumables&quot;&quot;&quot;</span>
<span class="n">cons4</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons4&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons3&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="n">cons4</span>
<span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">exact_consumables</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">}</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are gone</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_tool_order__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_tool_order__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_tool_order__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Strict tool-order recipe fail &quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span>
<span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">exact_tool_order</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_tool_order_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_cons_order__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_cons_order__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_cons_order__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Strict tool-order recipe fail &quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span>
<span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">exact_consumable_order</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_consumable_order_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="TestCraftSword"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftSword">[docs]</a><span class="k">class</span> <span class="nc">TestCraftSword</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the `craft` function by crafting the example sword.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TestCraftSword.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftSword.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span></div>
<div class="viewcode-block" id="TestCraftSword.test_craft_sword"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftSword.test_craft_sword">[docs]</a> <span class="nd">@override_settings</span><span class="p">(</span><span class="n">CRAFT_RECIPE_MODULES</span><span class="o">=</span><span class="p">[],</span> <span class="n">DEFAULT_HOME</span><span class="o">=</span><span class="s2">&quot;#999999&quot;</span><span class="p">)</span>
<span class="nd">@mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.contrib.crafting.example_recipes.random&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">test_craft_sword</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mockrandom</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Craft example sword. For the test, every crafting works.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># make sure every craft succeeds</span>
<span class="n">mockrandom</span><span class="o">.</span><span class="n">random</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_co</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">tagkey</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">tagcat</span> <span class="o">=</span> <span class="s2">&quot;crafting_tool&quot;</span> <span class="k">if</span> <span class="n">is_tool</span> <span class="k">else</span> <span class="s2">&quot;crafting_material&quot;</span>
<span class="k">return</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="n">tagkey</span><span class="p">,</span> <span class="n">tagcat</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_craft</span><span class="p">(</span><span class="n">recipe_name</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;shortcut to shorten and return only one element&quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">crafting</span><span class="o">.</span><span class="n">craft</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="n">recipe_name</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">,</span> <span class="n">raise_exception</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">result</span>
<span class="c1"># generate base materials</span>
<span class="n">iron_ore1</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Iron ore ingot&quot;</span><span class="p">,</span> <span class="s2">&quot;iron ore&quot;</span><span class="p">)</span>
<span class="n">iron_ore2</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Iron ore ingot&quot;</span><span class="p">,</span> <span class="s2">&quot;iron ore&quot;</span><span class="p">)</span>
<span class="n">iron_ore3</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Iron ore ingot&quot;</span><span class="p">,</span> <span class="s2">&quot;iron ore&quot;</span><span class="p">)</span>
<span class="n">ash1</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of Ash&quot;</span><span class="p">,</span> <span class="s2">&quot;ash&quot;</span><span class="p">)</span>
<span class="n">ash2</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of Ash&quot;</span><span class="p">,</span> <span class="s2">&quot;ash&quot;</span><span class="p">)</span>
<span class="n">ash3</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of Ash&quot;</span><span class="p">,</span> <span class="s2">&quot;ash&quot;</span><span class="p">)</span>
<span class="n">sand1</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of sand&quot;</span><span class="p">,</span> <span class="s2">&quot;sand&quot;</span><span class="p">)</span>
<span class="n">sand2</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of sand&quot;</span><span class="p">,</span> <span class="s2">&quot;sand&quot;</span><span class="p">)</span>
<span class="n">sand3</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of sand&quot;</span><span class="p">,</span> <span class="s2">&quot;sand&quot;</span><span class="p">)</span>
<span class="n">coal01</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal02</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal03</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal04</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal05</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal06</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal07</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal08</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal09</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal10</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal11</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal12</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">oak_wood</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of oak wood&quot;</span><span class="p">,</span> <span class="s2">&quot;oak wood&quot;</span><span class="p">)</span>
<span class="n">water</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Bucket of water&quot;</span><span class="p">,</span> <span class="s2">&quot;water&quot;</span><span class="p">)</span>
<span class="n">fur</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Bundle of Animal fur&quot;</span><span class="p">,</span> <span class="s2">&quot;fur&quot;</span><span class="p">)</span>
<span class="c1"># tools</span>
<span class="n">blast_furnace</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Blast furnace&quot;</span><span class="p">,</span> <span class="s2">&quot;blast furnace&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">furnace</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Smithing furnace&quot;</span><span class="p">,</span> <span class="s2">&quot;furnace&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">crucible</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Smelting crucible&quot;</span><span class="p">,</span> <span class="s2">&quot;crucible&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">anvil</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Smithing anvil&quot;</span><span class="p">,</span> <span class="s2">&quot;anvil&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">hammer</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Smithing hammer&quot;</span><span class="p">,</span> <span class="s2">&quot;hammer&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">knife</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Working knife&quot;</span><span class="p">,</span> <span class="s2">&quot;knife&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">cauldron</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Cauldron&quot;</span><span class="p">,</span> <span class="s2">&quot;cauldron&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># making pig iron</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">iron_ore1</span><span class="p">,</span> <span class="n">coal01</span><span class="p">,</span> <span class="n">coal02</span><span class="p">,</span> <span class="n">blast_furnace</span><span class="p">]</span>
<span class="n">pig_iron1</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;pig iron&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">iron_ore2</span><span class="p">,</span> <span class="n">coal03</span><span class="p">,</span> <span class="n">coal04</span><span class="p">,</span> <span class="n">blast_furnace</span><span class="p">]</span>
<span class="n">pig_iron2</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;pig iron&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">iron_ore3</span><span class="p">,</span> <span class="n">coal05</span><span class="p">,</span> <span class="n">coal06</span><span class="p">,</span> <span class="n">blast_furnace</span><span class="p">]</span>
<span class="n">pig_iron3</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;pig iron&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># making crucible steel</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">pig_iron1</span><span class="p">,</span> <span class="n">ash1</span><span class="p">,</span> <span class="n">sand1</span><span class="p">,</span> <span class="n">coal07</span><span class="p">,</span> <span class="n">coal08</span><span class="p">,</span> <span class="n">crucible</span><span class="p">]</span>
<span class="n">crucible_steel1</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">pig_iron2</span><span class="p">,</span> <span class="n">ash2</span><span class="p">,</span> <span class="n">sand2</span><span class="p">,</span> <span class="n">coal09</span><span class="p">,</span> <span class="n">coal10</span><span class="p">,</span> <span class="n">crucible</span><span class="p">]</span>
<span class="n">crucible_steel2</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">pig_iron3</span><span class="p">,</span> <span class="n">ash3</span><span class="p">,</span> <span class="n">sand3</span><span class="p">,</span> <span class="n">coal11</span><span class="p">,</span> <span class="n">coal12</span><span class="p">,</span> <span class="n">crucible</span><span class="p">]</span>
<span class="n">crucible_steel3</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># smithing</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">crucible_steel1</span><span class="p">,</span> <span class="n">hammer</span><span class="p">,</span> <span class="n">anvil</span><span class="p">,</span> <span class="n">furnace</span><span class="p">]</span>
<span class="n">sword_blade</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword blade&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">crucible_steel2</span><span class="p">,</span> <span class="n">hammer</span><span class="p">,</span> <span class="n">anvil</span><span class="p">,</span> <span class="n">furnace</span><span class="p">]</span>
<span class="n">sword_pommel</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword pommel&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">crucible_steel3</span><span class="p">,</span> <span class="n">hammer</span><span class="p">,</span> <span class="n">anvil</span><span class="p">,</span> <span class="n">furnace</span><span class="p">]</span>
<span class="n">sword_guard</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword guard&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># stripping fur</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">fur</span><span class="p">,</span> <span class="n">knife</span><span class="p">]</span>
<span class="n">rawhide</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;rawhide&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># making bark (tannin) and cleaned wood</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">oak_wood</span><span class="p">,</span> <span class="n">knife</span><span class="p">]</span>
<span class="n">oak_bark</span><span class="p">,</span> <span class="n">cleaned_oak_wood</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;oak bark&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># leathermaking</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">rawhide</span><span class="p">,</span> <span class="n">oak_bark</span><span class="p">,</span> <span class="n">water</span><span class="p">,</span> <span class="n">cauldron</span><span class="p">]</span>
<span class="n">leather</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;leather&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># sword handle</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">cleaned_oak_wood</span><span class="p">,</span> <span class="n">knife</span><span class="p">]</span>
<span class="n">sword_handle</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword handle&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># sword (order matters)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">sword_blade</span><span class="p">,</span>
<span class="n">sword_guard</span><span class="p">,</span>
<span class="n">sword_pommel</span><span class="p">,</span>
<span class="n">sword_handle</span><span class="p">,</span>
<span class="n">leather</span><span class="p">,</span>
<span class="n">knife</span><span class="p">,</span>
<span class="n">hammer</span><span class="p">,</span>
<span class="n">furnace</span><span class="p">,</span>
<span class="p">]</span>
<span class="n">sword</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">sword</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="s2">&quot;Sword&quot;</span><span class="p">)</span>
<span class="c1"># make sure all materials and intermediaries are deleted</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">iron_ore1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">iron_ore2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">iron_ore3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">ash1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">ash2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">ash3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sand1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sand2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sand3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal01</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal02</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal03</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal04</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal05</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal06</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal07</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal08</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal09</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal10</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal11</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal12</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">oak_wood</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">water</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">fur</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">pig_iron1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">pig_iron2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">pig_iron3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">crucible_steel1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">crucible_steel2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">crucible_steel3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sword_blade</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sword_pommel</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sword_guard</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">rawhide</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">oak_bark</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">leather</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sword_handle</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure all tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">blast_furnace</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">furnace</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">crucible</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">anvil</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">hammer</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">knife</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">cauldron</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="TestCraftCommand"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand">[docs]</a><span class="nd">@mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.contrib.crafting.crafting._load_recipes&quot;</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">())</span>
<span class="nd">@mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.contrib.crafting.crafting._RECIPE_CLASSES&quot;</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;testrecipe&quot;</span><span class="p">:</span> <span class="n">_MockRecipe</span><span class="p">})</span>
<span class="nd">@override_settings</span><span class="p">(</span><span class="n">CRAFT_RECIPE_MODULES</span><span class="o">=</span><span class="p">[],</span> <span class="n">DEFAULT_HOME</span><span class="o">=</span><span class="s2">&quot;#999999&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">TestCraftCommand</span><span class="p">(</span><span class="n">CommandTest</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test the crafting command&quot;&quot;&quot;</span>
<div class="viewcode-block" id="TestCraftCommand.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">setUp</span><span class="p">()</span>
<span class="n">tools</span><span class="p">,</span> <span class="n">consumables</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span>
<span class="n">tool_kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">},</span> <span class="n">consumable_kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftCommand.test_craft__success"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand.test_craft__success">[docs]</a> <span class="k">def</span> <span class="nf">test_craft__success</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">&quot;Successfully craft using command&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">CmdCraft</span><span class="p">(),</span>
<span class="s2">&quot;testrecipe from cons1, cons2, cons3 using tool1, tool2&quot;</span><span class="p">,</span>
<span class="n">_MockRecipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftCommand.test_craft__notools__failure"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand.test_craft__notools__failure">[docs]</a> <span class="k">def</span> <span class="nf">test_craft__notools__failure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">&quot;Craft fail no tools&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">CmdCraft</span><span class="p">(),</span>
<span class="s2">&quot;testrecipe from cons1, cons2, cons3&quot;</span><span class="p">,</span>
<span class="n">_MockRecipe</span><span class="o">.</span><span class="n">error_tool_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;tool1&quot;</span><span class="p">),</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftCommand.test_craft__nocons__failure"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand.test_craft__nocons__failure">[docs]</a> <span class="k">def</span> <span class="nf">test_craft__nocons__failure</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">call</span><span class="p">(</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">CmdCraft</span><span class="p">(),</span>
<span class="s2">&quot;testrecipe using tool1, tool2&quot;</span><span class="p">,</span>
<span class="n">_MockRecipe</span><span class="o">.</span><span class="n">error_consumable_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;cons1&quot;</span><span class="p">),</span>
<span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div 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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="tests.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></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 1.0-dev</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-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.crafting.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.custom_gametime</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -376,6 +375,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -394,7 +394,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.custom_gametime</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.dice</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -329,6 +328,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -347,7 +347,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.dice</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.email_login</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -430,6 +429,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -448,7 +448,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.email_login</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.commands</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -848,6 +847,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -866,7 +866,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.commands</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.menu</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -421,6 +420,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -439,7 +439,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.menu</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.objects</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -1148,6 +1147,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1166,7 +1166,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.objects</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.room</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -307,6 +306,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -325,7 +325,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.room</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.state</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -375,6 +374,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -393,7 +393,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.state</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -216,11 +215,12 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;What do you want to say?&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;Hello!&quot;</span><span class="p">,</span> <span class="s2">&quot;You say: Hello!&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;What do you want to whisper?&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;whisper&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;Hi.&quot;</span><span class="p">,</span> <span class="s2">&quot;You whisper: (Hi.)&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;whisper&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;Hi.&quot;</span><span class="p">,</span> <span class="s2">&quot;You whisper: Hi.&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;whisper&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;Hi.&quot;</span><span class="p">,</span> <span class="s2">&quot;You whisper: Hi.&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;whisper&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;HELLO!&quot;</span><span class="p">,</span> <span class="s2">&quot;You shout: HELLO!&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;shout&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;Hello&quot;</span><span class="p">,</span> <span class="s2">&quot;You say: Hello&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;say&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;Hello&quot;</span><span class="p">,</span> <span class="s2">&quot;You shout: HELLO&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;shout&quot;</span><span class="p">)</span></div>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;Hello to obj&quot;</span><span class="p">,</span> <span class="s2">&quot;You say: Hello&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;say&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">CmdSpeak</span><span class="p">(),</span> <span class="s2">&quot;Hello to obj&quot;</span><span class="p">,</span> <span class="s2">&quot;You shout: Hello&quot;</span><span class="p">,</span> <span class="n">cmdstring</span><span class="o">=</span><span class="s2">&quot;shout&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestEvscaperoomCommands.test_emote"><a class="viewcode-back" href="../../../../api/evennia.contrib.evscaperoom.tests.html#evennia.contrib.evscaperoom.tests.TestEvscaperoomCommands.test_emote">[docs]</a> <span class="k">def</span> <span class="nf">test_emote</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">call</span><span class="p">(</span>
@ -313,7 +313,7 @@
<span class="n">dirname</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">),</span> <span class="s2">&quot;states&quot;</span><span class="p">)</span>
<span class="n">states</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">imp</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="n">ispackage</span> <span class="ow">in</span> <span class="n">pkgutil</span><span class="o">.</span><span class="n">walk_packages</span><span class="p">(</span>
<span class="n">path</span><span class="o">=</span><span class="p">[</span><span class="n">dirname</span><span class="p">],</span> <span class="n">prefix</span><span class="o">=</span><span class="s2">&quot;evennia.contrib.evscaperoom.states.&quot;</span>
<span class="n">path</span><span class="o">=</span><span class="p">[</span><span class="n">dirname</span><span class="p">],</span> <span class="n">prefix</span><span class="o">=</span><span class="s2">&quot;evscaperoom.states.&quot;</span>
<span class="p">):</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">mod_import</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
<span class="n">states</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
@ -372,6 +372,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -390,7 +391,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.utils</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -262,6 +261,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -280,7 +280,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.evscaperoom.utils</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.extended_room</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -660,6 +659,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -678,7 +678,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.extended_room</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.fieldfill</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -783,6 +782,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -801,7 +801,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.fieldfill</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.gendersub</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -224,6 +223,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -242,7 +242,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.gendersub</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.health_bar</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -187,6 +186,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -205,7 +205,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.health_bar</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.callbackhandler</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -292,6 +291,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -310,7 +310,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.callbackhandler</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.commands</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -650,6 +649,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -668,7 +668,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.commands</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.eventfuncs</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -158,6 +157,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -176,7 +176,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.eventfuncs</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.scripts</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -735,6 +734,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -753,7 +753,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.scripts</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -610,6 +609,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -628,7 +628,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.typeclasses</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -986,6 +985,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1004,7 +1004,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.typeclasses</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.utils</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -330,6 +329,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -348,7 +348,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.ingame_python.utils</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.mail</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -426,6 +425,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -444,7 +444,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.mail</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.mapbuilder</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -569,6 +568,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -587,7 +587,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.mapbuilder</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.menu_login</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -321,6 +320,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -339,7 +339,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.menu_login</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.multidescer</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -337,6 +336,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -355,7 +355,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.multidescer</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.puzzles</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -881,6 +880,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -899,7 +899,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.puzzles</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.random_string_generator</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -421,6 +420,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -439,7 +439,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.random_string_generator</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.rplanguage</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -102,46 +101,21 @@
<span class="sd"> Below is an example of &quot;elvish&quot;, using &quot;rounder&quot; vowels and sounds:</span>
<span class="sd"> ```python</span>
<span class="sd"> # vowel/consonant grammar possibilities</span>
<span class="sd"> grammar = (&quot;v vv vvc vcc vvcc cvvc vccv vvccv vcvccv vcvcvcc vvccvvcc &quot;</span>
<span class="sd"> &quot;vcvvccvvc cvcvvcvvcc vcvcvvccvcvv&quot;)</span>
<span class="sd"> # all not in this group is considered a consonant</span>
<span class="sd"> phonemes = &quot;oi oh ee ae aa eh ah ao aw ay er ey ow ia ih iy &quot; \</span>
<span class="sd"> &quot;oy ua uh uw y p b t d f v t dh s z sh zh ch jh k &quot; \</span>
<span class="sd"> &quot;ng g m n l r w&quot;,</span>
<span class="sd"> vowels = &quot;eaoiuy&quot;</span>
<span class="sd"> # you need a representative of all of the minimal grammars here, so if a</span>
<span class="sd"> # grammar v exists, there must be atleast one phoneme available with only</span>
<span class="sd"> # one vowel in it</span>
<span class="sd"> phonemes = (&quot;oi oh ee ae aa eh ah ao aw ay er ey ow ia ih iy &quot;</span>
<span class="sd"> &quot;oy ua uh uw y p b t d f v t dh s z sh zh ch jh k &quot;</span>
<span class="sd"> &quot;ng g m n l r w&quot;)</span>
<span class="sd"> # how much the translation varies in length compared to the original. 0 is</span>
<span class="sd"> # smallest, higher values give ever bigger randomness (including removing</span>
<span class="sd"> # short words entirely)</span>
<span class="sd"> grammar = &quot;v vv vvc vcc vvcc cvvc vccv vvccv vcvccv vcvcvcc vvccvvcc &quot; \</span>
<span class="sd"> &quot;vcvvccvvc cvcvvcvvcc vcvcvvccvcvv&quot;,</span>
<span class="sd"> word_length_variance = 1</span>
<span class="sd"> # if a proper noun (word starting with capitalized letter) should be</span>
<span class="sd"> # translated or not. If not (default) it means e.g. names will remain</span>
<span class="sd"> # unchanged across languages.</span>
<span class="sd"> noun_translate = False</span>
<span class="sd"> # all proper nouns (words starting with a capital letter not at the beginning</span>
<span class="sd"> # of a sentence) can have either a postfix or -prefix added at all times</span>
<span class="sd"> noun_postfix = &quot;&#39;la&quot;</span>
<span class="sd"> # words in dict will always be translated this way. The &#39;auto_translations&#39;</span>
<span class="sd"> # is instead a list or filename to file with words to use to help build a</span>
<span class="sd"> # bigger dictionary by creating random translations of each word in the</span>
<span class="sd"> # list *once* and saving the result for subsequent use.</span>
<span class="sd"> manual_translations = {&quot;the&quot;:&quot;y&#39;e&quot;, &quot;we&quot;:&quot;uyi&quot;, &quot;she&quot;:&quot;semi&quot;, &quot;he&quot;:&quot;emi&quot;,</span>
<span class="sd"> &quot;you&quot;: &quot;do&quot;, &#39;me&#39;:&#39;mi&#39;,&#39;i&#39;:&#39;me&#39;, &#39;be&#39;:&quot;hy&#39;e&quot;, &#39;and&#39;:&#39;y&#39;}</span>
<span class="sd"> rplanguage.add_language(key=&quot;elvish&quot;, phonemes=phonemes, grammar=grammar,</span>
<span class="sd"> word_length_variance=word_length_variance,</span>
<span class="sd"> noun_translate=noun_translate,</span>
<span class="sd"> noun_postfix=noun_postfix, vowels=vowels,</span>
<span class="sd"> manual_translations=manual_translations,</span>
<span class="sd"> manual_translations=manual_translations</span>
<span class="sd"> auto_translations=&quot;my_word_file.txt&quot;)</span>
<span class="sd"> ```</span>
@ -184,8 +158,7 @@
<span class="n">_RE_FLAGS</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span> <span class="o">+</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span> <span class="o">+</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span> <span class="o">+</span> <span class="n">re</span><span class="o">.</span><span class="n">UNICODE</span>
<span class="n">_RE_GRAMMAR</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;vv|cc|v|c&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
<span class="n">_RE_WORD</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;\w+&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
<span class="c1"># superfluous chars, except ` ... `</span>
<span class="n">_RE_EXTRA_CHARS</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;\s+(?!... )(?=\W)|[,.?;](?!.. )(?=[,?;]|\s+[,.?;])&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
<span class="n">_RE_EXTRA_CHARS</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;\s+(?=\W)|[,.?;](?=[,.?;]|\s+[,.?;])&quot;</span><span class="p">,</span> <span class="n">_RE_FLAGS</span><span class="p">)</span>
<div class="viewcode-block" id="LanguageError"><a class="viewcode-back" href="../../../api/evennia.contrib.rplanguage.html#evennia.contrib.rplanguage.LanguageError">[docs]</a><span class="k">class</span> <span class="nc">LanguageError</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">):</span>
@ -266,13 +239,9 @@
<span class="sd"> 0 means a minimal variance, higher variance may mean words</span>
<span class="sd"> have wildly varying length; this strongly affects how the</span>
<span class="sd"> language &quot;looks&quot;.</span>
<span class="sd"> noun_translate (bool, optional): If a proper noun should be translated or</span>
<span class="sd"> not. By default they will not, allowing for e.g. the names of characters</span>
<span class="sd"> to be understandable. A &#39;noun&#39; is identified as a capitalized word</span>
<span class="sd"> *not at the start of a sentence*. This simple metric means that names</span>
<span class="sd"> starting a sentence always will be translated (- but hey, maybe</span>
<span class="sd"> the fantasy language just never uses a noun at the beginning of</span>
<span class="sd"> sentences, who knows?)</span>
<span class="sd"> noun_translate (bool, optional): If a proper noun, identified as a</span>
<span class="sd"> capitalized word, should be translated or not. By default they</span>
<span class="sd"> will not, allowing for e.g. the names of characters to be understandable.</span>
<span class="sd"> noun_prefix (str, optional): A prefix to go before every noun</span>
<span class="sd"> in this language (if any).</span>
<span class="sd"> noun_postfix (str, optuonal): A postfix to go after every noun</span>
@ -317,7 +286,7 @@
<span class="c1"># {&quot;vv&quot;: [&quot;ea&quot;, &quot;oh&quot;, ...], ...}</span>
<span class="n">grammar2phonemes</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="k">for</span> <span class="n">phoneme</span> <span class="ow">in</span> <span class="n">phonemes</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\W&quot;</span><span class="p">,</span> <span class="n">phoneme</span><span class="p">):</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">&quot;\W&quot;</span><span class="p">,</span> <span class="n">phoneme</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">LanguageError</span><span class="p">(</span><span class="s2">&quot;The phoneme &#39;</span><span class="si">%s</span><span class="s2">&#39; contains an invalid character&quot;</span> <span class="o">%</span> <span class="n">phoneme</span><span class="p">)</span>
<span class="n">gram</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="s2">&quot;v&quot;</span> <span class="k">if</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">vowels</span> <span class="k">else</span> <span class="s2">&quot;c&quot;</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">phoneme</span><span class="p">])</span>
<span class="n">grammar2phonemes</span><span class="p">[</span><span class="n">gram</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">phoneme</span><span class="p">)</span>
@ -325,7 +294,7 @@
<span class="c1"># allowed grammar are grouped by length</span>
<span class="n">gramdict</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="k">for</span> <span class="n">gram</span> <span class="ow">in</span> <span class="n">grammar</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\W|(!=[cv])&quot;</span><span class="p">,</span> <span class="n">gram</span><span class="p">):</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">&quot;\W|(!=[cv])&quot;</span><span class="p">,</span> <span class="n">gram</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">LanguageError</span><span class="p">(</span>
<span class="s2">&quot;The grammar &#39;</span><span class="si">%s</span><span class="s2">&#39; is invalid (only &#39;c&#39; and &#39;v&#39; are allowed)&quot;</span> <span class="o">%</span> <span class="n">gram</span>
<span class="p">)</span>
@ -352,13 +321,7 @@
<span class="c1"># use the corresponding length</span>
<span class="n">structure</span> <span class="o">=</span> <span class="n">choice</span><span class="p">(</span><span class="n">grammar</span><span class="p">[</span><span class="n">wlen</span><span class="p">])</span>
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">_RE_GRAMMAR</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">structure</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">new_word</span> <span class="o">+=</span> <span class="n">choice</span><span class="p">(</span><span class="n">grammar2phonemes</span><span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">()])</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">IndexError</span><span class="p">(</span>
<span class="s2">&quot;Could not find a matching phoneme for the grammar &quot;</span>
<span class="sa">f</span><span class="s2">&quot;&#39;</span><span class="si">{</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span><span class="si">}</span><span class="s2">&#39;. Make there is at least one phoneme matching this &quot;</span>
<span class="s2">&quot;combination of consonants and vowels.&quot;</span><span class="p">)</span>
<span class="n">new_word</span> <span class="o">+=</span> <span class="n">choice</span><span class="p">(</span><span class="n">grammar2phonemes</span><span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">()])</span>
<span class="n">translation</span><span class="p">[</span><span class="n">word</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">new_word</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">if</span> <span class="n">manual_translations</span><span class="p">:</span>
@ -397,11 +360,6 @@
<span class="n">word</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
<span class="n">lword</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="c1"># find out what preceeded this word</span>
<span class="n">wpos</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="n">preceeding</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">string</span><span class="p">[:</span><span class="n">wpos</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">start_sentence</span> <span class="o">=</span> <span class="n">preceeding</span><span class="o">.</span><span class="n">endswith</span><span class="p">((</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="s2">&quot;!&quot;</span><span class="p">,</span> <span class="s2">&quot;?&quot;</span><span class="p">))</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">preceeding</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">level</span><span class="p">:</span>
<span class="c1"># below level. Don&#39;t translate</span>
<span class="n">new_word</span> <span class="o">=</span> <span class="n">word</span>
@ -411,6 +369,11 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_word</span><span class="p">:</span>
<span class="c1"># no dictionary translation. Generate one</span>
<span class="c1"># find out what preceeded this word</span>
<span class="n">wpos</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="n">preceeding</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">string</span><span class="p">[:</span><span class="n">wpos</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">start_sentence</span> <span class="o">=</span> <span class="n">preceeding</span><span class="o">.</span><span class="n">endswith</span><span class="p">((</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="s2">&quot;!&quot;</span><span class="p">,</span> <span class="s2">&quot;?&quot;</span><span class="p">))</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">preceeding</span>
<span class="c1"># make up translation on the fly. Length can</span>
<span class="c1"># vary from un-translated word.</span>
<span class="n">wlen</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span>
@ -445,30 +408,24 @@
<span class="k">break</span>
<span class="k">if</span> <span class="n">word</span><span class="o">.</span><span class="n">istitle</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">start_sentence</span><span class="p">:</span>
<span class="c1"># this is a noun. We miss nouns at the start of</span>
<span class="c1"># sentences this way, but it&#39;s as good as we can get</span>
<span class="c1"># with this simple analysis. Maybe the fantasy language</span>
<span class="c1"># just don&#39;t consider nouns at the beginning of</span>
<span class="c1"># sentences, who knows?</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;noun_translate&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="c1"># don&#39;t translate what we identify as proper nouns (names)</span>
<span class="n">new_word</span> <span class="o">=</span> <span class="n">word</span>
<span class="n">title_word</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">start_sentence</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;noun_translate&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="c1"># don&#39;t translate what we identify as proper nouns (names)</span>
<span class="n">title_word</span> <span class="o">=</span> <span class="n">word</span>
<span class="k">elif</span> <span class="n">new_word</span><span class="p">:</span>
<span class="n">title_word</span> <span class="o">=</span> <span class="n">new_word</span>
<span class="c1"># add noun prefix and/or postfix</span>
<span class="n">new_word</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{prefix}{word}{postfix}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">prefix</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="p">[</span><span class="s2">&quot;noun_prefix&quot;</span><span class="p">],</span>
<span class="n">word</span><span class="o">=</span><span class="n">new_word</span><span class="o">.</span><span class="n">capitalize</span><span class="p">(),</span>
<span class="n">postfix</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="p">[</span><span class="s2">&quot;noun_postfix&quot;</span><span class="p">],</span>
<span class="k">if</span> <span class="n">title_word</span><span class="p">:</span>
<span class="c1"># Regardless of if we translate or not, we will add the custom prefix/postfixes</span>
<span class="n">new_word</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="p">[</span><span class="s2">&quot;noun_prefix&quot;</span><span class="p">],</span>
<span class="n">title_word</span><span class="o">.</span><span class="n">capitalize</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">language</span><span class="p">[</span><span class="s2">&quot;noun_postfix&quot;</span><span class="p">],</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">word</span><span class="o">.</span><span class="n">isupper</span><span class="p">():</span>
<span class="c1"># keep LOUD words loud also when translated</span>
<span class="n">new_word</span> <span class="o">=</span> <span class="n">new_word</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">if</span> <span class="n">start_sentence</span><span class="p">:</span>
<span class="n">new_word</span> <span class="o">=</span> <span class="n">new_word</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span>
<span class="k">return</span> <span class="n">new_word</span>
<div class="viewcode-block" id="LanguageHandler.translate"><a class="viewcode-back" href="../../../api/evennia.contrib.rplanguage.html#evennia.contrib.rplanguage.LanguageHandler.translate">[docs]</a> <span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">language</span><span class="o">=</span><span class="s2">&quot;default&quot;</span><span class="p">):</span>
@ -575,18 +532,19 @@
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">_LANGUAGE_HANDLER</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;language_storage&quot;</span><span class="p">,</span> <span class="p">{}))</span></div>
<span class="c1"># -----------------------------------------------------------------------------</span>
<span class="c1"># ------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># Whisper obscuration</span>
<span class="c1">#</span>
<span class="c1"># This obsucration table is designed by obscuring certain vowels first,</span>
<span class="c1"># following by consonants that tend to be more audible over long distances,</span>
<span class="c1"># like s. Finally it does non-auditory replacements, like exclamation marks and</span>
<span class="c1"># capitalized letters (assumed to be spoken louder) that may still give a user</span>
<span class="c1"># some idea of the sentence structure. Then the word lengths are also</span>
<span class="c1"># obfuscated and finally the whisper length itself.</span>
<span class="c1"># This obsucration table is designed by obscuring certain</span>
<span class="c1"># vowels first, following by consonants that tend to be</span>
<span class="c1"># more audible over long distances, like s. Finally it</span>
<span class="c1"># does non-auditory replacements, like exclamation marks</span>
<span class="c1"># and capitalized letters (assumed to be spoken louder) that may still</span>
<span class="c1"># give a user some idea of the sentence structure. Then the word</span>
<span class="c1"># lengths are also obfuscated and finally the whisper # length itself.</span>
<span class="c1">#</span>
<span class="c1"># ------------------------------------------------------------------------------</span>
<span class="c1"># ------------------------------------------------------------</span>
<span class="n">_RE_WHISPER_OBSCURE</span> <span class="o">=</span> <span class="p">[</span>
@ -653,6 +611,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -671,7 +630,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.rplanguage</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.rpsystem</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -325,8 +324,7 @@
<span class="sd"> the markers and a tuple (langname, saytext), where</span>
<span class="sd"> langname can be None.</span>
<span class="sd"> Raises:</span>
<span class="sd"> evennia.contrib.rpsystem.LanguageError: If an invalid language was</span>
<span class="sd"> specified.</span>
<span class="sd"> rplanguage.LanguageError: If an invalid language was specified.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Note that no errors are raised if the wrong language identifier</span>
@ -1692,6 +1690,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1710,7 +1709,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.rpsystem</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.security.auditing.outputs</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -127,6 +126,7 @@
<li><a href="../../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -145,7 +145,6 @@
<li class="nav-item nav-item-2"><a href="../../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.security.auditing.outputs</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.security.auditing.server</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -316,6 +315,7 @@
<li><a href="../../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -334,7 +334,6 @@
<li class="nav-item nav-item-2"><a href="../../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.security.auditing.server</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.security.auditing.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -181,6 +180,7 @@
<li><a href="../../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -199,7 +199,6 @@
<li class="nav-item nav-item-2"><a href="../../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.security.auditing.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.simpledoor</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -239,6 +238,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -257,7 +257,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.simpledoor</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.slow_exit</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -211,6 +210,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -229,7 +229,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.slow_exit</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.talking_npc</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -200,6 +199,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -218,7 +218,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.talking_npc</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tree_select</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -644,6 +643,7 @@
<li><a href="../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -662,7 +662,6 @@
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tree_select</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_basic</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -847,6 +846,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -865,7 +865,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_basic</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_equip</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -1205,6 +1204,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1223,7 +1223,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_equip</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_items</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -1524,6 +1523,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1542,7 +1542,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_items</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_magic</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -1446,6 +1445,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1464,7 +1464,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_magic</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_range</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -684,6 +683,7 @@
<span class="sd"> Args:</span>
<span class="sd"> to_init (object): Object to initialize range field for.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> anchor_obj (object): Object to copy range values from, or None for a random object.</span>
<span class="sd"> add_distance (int): Distance to put between to_init object and anchor object.</span>
@ -1502,6 +1502,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1520,7 +1521,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.turnbattle.tb_range</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.bodyfunctions</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -133,6 +132,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -151,7 +151,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.bodyfunctions</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.cmdset_red_button</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -402,6 +401,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -420,7 +420,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.cmdset_red_button</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -1,157 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.tutorial_examples.mirror &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<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 1.0-dev</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-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.mirror</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.tutorial_examples.mirror</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">TutorialMirror</span>
<span class="sd">A simple mirror object to experiment with.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">DefaultObject</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">is_iter</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">logger</span>
<div class="viewcode-block" id="TutorialMirror"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_examples.mirror.html#evennia.contrib.tutorial_examples.mirror.TutorialMirror">[docs]</a><span class="k">class</span> <span class="nc">TutorialMirror</span><span class="p">(</span><span class="n">DefaultObject</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A simple mirror object that</span>
<span class="sd"> - echoes back the description of the object looking at it</span>
<span class="sd"> - echoes back whatever is being sent to its .msg - to the</span>
<span class="sd"> sender, if given, otherwise to the location of the mirror.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TutorialMirror.return_appearance"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_examples.mirror.html#evennia.contrib.tutorial_examples.mirror.TutorialMirror.return_appearance">[docs]</a> <span class="k">def</span> <span class="nf">return_appearance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">looker</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This formats the description of this object. Called by the &#39;look&#39; command.</span>
<span class="sd"> Args:</span>
<span class="sd"> looker (Object): Object doing the looking.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">):</span>
<span class="c1"># avoid infinite recursion by having two mirrors look at each other</span>
<span class="k">return</span> <span class="s2">&quot;The image of yourself stretches into infinity.&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2"> shows your reflection:</span><span class="se">\n</span><span class="si">{</span><span class="n">looker</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="si">}</span><span class="s2">&quot;</span></div>
<div class="viewcode-block" id="TutorialMirror.msg"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_examples.mirror.html#evennia.contrib.tutorial_examples.mirror.TutorialMirror.msg">[docs]</a> <span class="k">def</span> <span class="nf">msg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">from_obj</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Simply override .msg to echo back to the messenger or to the current</span>
<span class="sd"> location.</span>
<span class="sd"> Args:</span>
<span class="sd"> text (str or tuple, optional): The message to send. This</span>
<span class="sd"> is treated internally like any send-command, so its</span>
<span class="sd"> value can be a tuple if sending multiple arguments to</span>
<span class="sd"> the `text` oob command.</span>
<span class="sd"> from_obj (obj or iterable)</span>
<span class="sd"> given, at_msg_send will be called. This value will be</span>
<span class="sd"> passed on to the protocol. If iterable, will execute hook</span>
<span class="sd"> on all entities in it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">text</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">&quot;&lt;silence&gt;&quot;</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="k">else</span> <span class="n">text</span>
<span class="k">if</span> <span class="n">from_obj</span><span class="p">:</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">from_obj</span><span class="p">):</span>
<span class="n">obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s1"> echoes back to you:</span><span class="se">\n</span><span class="s1">&quot;</span><span class="si">{</span><span class="n">text</span><span class="si">}</span><span class="s1">&quot;.&#39;</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">msg_contents</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s1"> echoes back:</span><span class="se">\n</span><span class="s1">&quot;</span><span class="si">{</span><span class="n">text</span><span class="si">}</span><span class="s1">&quot;.&#39;</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># no from_obj and no location, just log</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">.msg was called without from_obj and .location is None.&quot;</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div 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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="mirror.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></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 1.0-dev</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-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.mirror</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.red_button</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -234,6 +233,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -252,7 +252,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.red_button</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.red_button_scripts</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -352,6 +351,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -370,7 +370,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.red_button_scripts</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -138,6 +137,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -156,7 +156,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_examples.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_world.intro_menu</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -474,9 +473,8 @@
<span class="s2">and the main window.</span>
<span class="s2">- Use |y&lt;Return&gt;|n (or click the arrow on the right) to send your input.</span>
<span class="s2">- Use |yCtrl + &lt;up/down-arrow&gt;|n to step back and forth in your command-history.</span>
<span class="s2">- Use |yCtrl + &lt;Return&gt;|n to add a new line to your input without sending.</span>
<span class="s2">(Cmd instead of Ctrl-key on Macs)</span>
<span class="s2">- Use |yShift + &lt;up/down-arrow&gt;|n to step back and forth in your command-history.</span>
<span class="s2">- Use |yShift + &lt;Return&gt;|n to add a new line to your input without sending.</span>
<span class="s2">There is also some |wextra|n info to learn about customizing the webclient.</span>
@ -849,6 +847,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -867,7 +866,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_world.intro_menu</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_world.mob</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -111,7 +110,7 @@
<span class="sd"> stationary (idling) until attacked.</span>
<span class="sd"> aggressive: if set, will attack Characters in</span>
<span class="sd"> the same room using whatever Weapon it</span>
<span class="sd"> carries (see tutorial_world.objects.TutorialWeapon).</span>
<span class="sd"> carries (see tutorial_world.objects.Weapon).</span>
<span class="sd"> if unset, the mob will never engage in combat</span>
<span class="sd"> no matter what.</span>
<span class="sd"> hunting: if set, the mob will pursue enemies trying</span>
@ -210,9 +209,9 @@
<span class="sd"> be &quot;ticked&quot;.</span>
<span class="sd"> Args:</span>
<span class="sd"> interval (int or None): The number of seconds</span>
<span class="sd"> interval (int): The number of seconds</span>
<span class="sd"> between ticks</span>
<span class="sd"> hook_key (str or None): The name of the method</span>
<span class="sd"> hook_key (str): The name of the method</span>
<span class="sd"> (on this mob) to call every interval</span>
<span class="sd"> seconds.</span>
<span class="sd"> stop (bool, optional): Just stop the</span>
@ -414,11 +413,16 @@
<span class="k">return</span>
<span class="c1"># we use the same attack commands as defined in</span>
<span class="c1"># tutorial_world.objects.TutorialWeapon, assuming that</span>
<span class="c1"># tutorial_world.objects.Weapon, assuming that</span>
<span class="c1"># the mob is given a Weapon to attack with.</span>
<span class="n">attack_cmd</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">((</span><span class="s2">&quot;thrust&quot;</span><span class="p">,</span> <span class="s2">&quot;pierce&quot;</span><span class="p">,</span> <span class="s2">&quot;stab&quot;</span><span class="p">,</span> <span class="s2">&quot;slash&quot;</span><span class="p">,</span> <span class="s2">&quot;chop&quot;</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">attack_cmd</span><span class="p">,</span> <span class="n">target</span><span class="p">))</span>
<span class="k">if</span> <span class="n">target</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">health</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># This is not an attackable target</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_err</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2"> found </span><span class="si">{</span><span class="n">target</span><span class="si">}</span><span class="s2"> had an `health` attribute of `None`.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># analyze the current state</span>
<span class="k">if</span> <span class="n">target</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># we reduced the target to &lt;= 0 health. Move them to the</span>
@ -503,6 +507,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -521,7 +526,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_world.mob</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

View file

@ -31,7 +31,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_world.objects</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
@ -56,8 +55,8 @@
<span class="sd">Obelisk</span>
<span class="sd">LightSource</span>
<span class="sd">CrumblingWall</span>
<span class="sd">TutorialWeapon</span>
<span class="sd">TutorialWeaponRack</span>
<span class="sd">Weapon</span>
<span class="sd">WeaponRack</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -833,7 +832,7 @@
<span class="c1"># -------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># TutorialWeapon - object type</span>
<span class="c1"># Weapon - object type</span>
<span class="c1">#</span>
<span class="c1"># A weapon is necessary in order to fight in the tutorial</span>
<span class="c1"># world. A weapon (which here is assumed to be a bladed</span>
@ -973,7 +972,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdAttack</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="TutorialWeapon"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.TutorialWeapon">[docs]</a><span class="k">class</span> <span class="nc">TutorialWeapon</span><span class="p">(</span><span class="n">TutorialObject</span><span class="p">):</span>
<div class="viewcode-block" id="Weapon"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.Weapon">[docs]</a><span class="k">class</span> <span class="nc">Weapon</span><span class="p">(</span><span class="n">TutorialObject</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This defines a bladed weapon.</span>
@ -985,7 +984,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TutorialWeapon.at_object_creation"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.TutorialWeapon.at_object_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_object_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Weapon.at_object_creation"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.Weapon.at_object_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_object_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Called at first creation of the object&quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">at_object_creation</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">hit</span> <span class="o">=</span> <span class="mf">0.4</span> <span class="c1"># hit chance</span>
@ -994,7 +993,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">magic</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add_default</span><span class="p">(</span><span class="n">CmdSetWeapon</span><span class="p">,</span> <span class="n">permanent</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="TutorialWeapon.reset"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.TutorialWeapon.reset">[docs]</a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Weapon.reset"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.Weapon.reset">[docs]</a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> When reset, the weapon is simply deleted, unless it has a place</span>
<span class="sd"> to return to.</span>
@ -1024,7 +1023,7 @@
<span class="n">WEAPON_PROTOTYPES</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;weapon&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;typeclass&quot;</span><span class="p">:</span> <span class="s2">&quot;evennia.contrib.tutorial_world.objects.TutorialWeapon&quot;</span><span class="p">,</span>
<span class="s2">&quot;typeclass&quot;</span><span class="p">:</span> <span class="s2">&quot;evennia.contrib.tutorial_world.objects.Weapon&quot;</span><span class="p">,</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Weapon&quot;</span><span class="p">,</span>
<span class="s2">&quot;hit&quot;</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
<span class="s2">&quot;parry&quot;</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
@ -1169,7 +1168,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdGetWeapon</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="TutorialWeaponRack"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.TutorialWeaponRack">[docs]</a><span class="k">class</span> <span class="nc">TutorialWeaponRack</span><span class="p">(</span><span class="n">TutorialObject</span><span class="p">):</span>
<div class="viewcode-block" id="WeaponRack"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.WeaponRack">[docs]</a><span class="k">class</span> <span class="nc">WeaponRack</span><span class="p">(</span><span class="n">TutorialObject</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This object represents a weapon store. When people use the</span>
<span class="sd"> &quot;get weapon&quot; command on this rack, it will produce one</span>
@ -1186,7 +1185,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TutorialWeaponRack.at_object_creation"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.TutorialWeaponRack.at_object_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_object_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="WeaponRack.at_object_creation"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.WeaponRack.at_object_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_object_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> called at creation</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -1200,12 +1199,13 @@
<span class="sd"> |wstab/thrust/pierce &lt;target&gt;|n - poke at the enemy. More damage but harder to hit.</span>
<span class="sd"> |wslash/chop/bash &lt;target&gt;|n - swipe at the enemy. Less damage but easier to hit.</span>
<span class="sd"> |wdefend/parry|n - protect yourself and make yourself harder to hit.)</span>
<span class="sd"> &quot;&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">no_more_weapons_msg</span> <span class="o">=</span> <span class="s2">&quot;you find nothing else of use.&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">available_weapons</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;knife&quot;</span><span class="p">,</span> <span class="s2">&quot;dagger&quot;</span><span class="p">,</span> <span class="s2">&quot;sword&quot;</span><span class="p">,</span> <span class="s2">&quot;club&quot;</span><span class="p">]</span></div>
<div class="viewcode-block" id="TutorialWeaponRack.produce_weapon"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.TutorialWeaponRack.produce_weapon">[docs]</a> <span class="k">def</span> <span class="nf">produce_weapon</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">caller</span><span class="p">):</span>
<div class="viewcode-block" id="WeaponRack.produce_weapon"><a class="viewcode-back" href="../../../../api/evennia.contrib.tutorial_world.objects.html#evennia.contrib.tutorial_world.objects.WeaponRack.produce_weapon">[docs]</a> <span class="k">def</span> <span class="nf">produce_weapon</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">caller</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This will produce a new weapon from the rack,</span>
<span class="sd"> assuming the caller hasn&#39;t already gotten one. When</span>
@ -1251,6 +1251,7 @@
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
@ -1269,7 +1270,6 @@
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.tutorial_world.objects</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.

Some files were not shown because too many files have changed in this diff Show more