Updated HTML docs

This commit is contained in:
Griatch 2021-03-27 23:55:23 +01:00
parent db734562d5
commit 500734d214
100 changed files with 6800 additions and 2763 deletions

View file

@ -49,7 +49,7 @@
<span class="kn">from</span> <span class="nn">evennia.objects.models</span> <span class="kn">import</span> <span class="n">ObjectDB</span>
<span class="kn">from</span> <span class="nn">evennia.locks.lockhandler</span> <span class="kn">import</span> <span class="n">LockException</span>
<span class="kn">from</span> <span class="nn">evennia.commands.cmdhandler</span> <span class="kn">import</span> <span class="n">get_and_merge_cmdsets</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">utils</span><span class="p">,</span> <span class="n">search</span><span class="p">,</span> <span class="n">logger</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">utils</span><span class="p">,</span> <span class="n">search</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">funcparser</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">inherits_from</span><span class="p">,</span>
<span class="n">class_from_module</span><span class="p">,</span>
@ -64,10 +64,11 @@
<span class="kn">from</span> <span class="nn">evennia.utils.evmore</span> <span class="kn">import</span> <span class="n">EvMore</span>
<span class="kn">from</span> <span class="nn">evennia.prototypes</span> <span class="kn">import</span> <span class="n">spawner</span><span class="p">,</span> <span class="n">prototypes</span> <span class="k">as</span> <span class="n">protlib</span><span class="p">,</span> <span class="n">menus</span> <span class="k">as</span> <span class="n">olc_menus</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">ansi_raw</span>
<span class="kn">from</span> <span class="nn">evennia.utils.inlinefuncs</span> <span class="kn">import</span> <span class="n">raw</span> <span class="k">as</span> <span class="n">inlinefunc_raw</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">_FUNCPARSER</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># limit symbol import for API</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;ObjManipCommand&quot;</span><span class="p">,</span>
@ -2164,7 +2165,8 @@
<span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;prototype&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">modified</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">batch_update_objects_with_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="p">[</span><span class="n">obj</span><span class="p">])</span>
<span class="n">modified</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">batch_update_objects_with_prototype</span><span class="p">(</span>
<span class="n">prototype</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="p">[</span><span class="n">obj</span><span class="p">],</span> <span class="n">caller</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">)</span>
<span class="n">prototype_success</span> <span class="o">=</span> <span class="n">modified</span> <span class="o">&gt;</span> <span class="mi">0</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype_success</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Prototype </span><span class="si">%s</span><span class="s2"> failed to apply.&quot;</span> <span class="o">%</span> <span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">])</span>
@ -2422,12 +2424,16 @@
<span class="sd"> value (any): Attribute value.</span>
<span class="sd"> Returns:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_FUNCPARSER</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_FUNCPARSER</span><span class="p">:</span>
<span class="n">_FUNCPARSER</span> <span class="o">=</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">FuncParser</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">FUNCPARSER_OUTGOING_MESSAGES_MODULES</span><span class="p">)</span>
<span class="k">if</span> <span class="n">attr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;No such attribute was found.&quot;</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">to_str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">crop</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">crop</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">inlinefunc_raw</span><span class="p">(</span><span class="n">ansi_raw</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">_FUNCPARSER</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">ansi_raw</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">escape</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">category</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">attr</span><span class="si">}</span><span class="s2">[</span><span class="si">{</span><span class="n">category</span><span class="si">}</span><span class="s2">] = </span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">else</span><span class="p">:</span>
@ -3500,7 +3506,7 @@
<span class="s2">&quot;Python structures are allowed. </span><span class="se">\n</span><span class="s2">Make sure to use correct &quot;</span>
<span class="s2">&quot;Python syntax. Remember especially to put quotes around all &quot;</span>
<span class="s2">&quot;strings inside lists and dicts.|n For more advanced uses, embed &quot;</span>
<span class="s2">&quot;inlinefuncs in the strings.&quot;</span>
<span class="s2">&quot;funcparser callables ($funcs) in the strings.&quot;</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Expected </span><span class="si">{}</span><span class="s2">, got </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">expect</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">prototype</span><span class="p">))</span>
@ -3596,7 +3602,7 @@
<span class="k">return</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">n_updated</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">batch_update_objects_with_prototype</span><span class="p">(</span>
<span class="n">prototype</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="n">existing_objects</span>
<span class="n">prototype</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="n">existing_objects</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
@ -3848,7 +3854,7 @@
<span class="c1"># proceed to spawning</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">spawner</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">prototype</span><span class="p">):</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">spawner</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</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="s2">&quot;Spawned </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;location&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">noloc</span><span class="p">:</span>
<span class="c1"># we don&#39;t hardcode the location in the prototype (unless the user</span>

View file

@ -737,27 +737,27 @@
<span class="s2">After playing through the tutorial-world quest, if you aim to make a game with</span>
<span class="s2">Evennia you are wise to take a look at the |wEvennia documentation|n at</span>
<span class="s2"> |yhttps://github.com/evennia/evennia/wiki|n</span>
<span class="s2"> |yhttps://www.evennia.com/docs/latest|n</span>
<span class="s2">- You can start by trying to build some stuff by following the |wBuilder quick-start|n:</span>
<span class="s2"> |yhttps://github.com/evennia/evennia/wiki/Building-Quickstart|n</span>
<span class="s2"> |yhttps://www.evennia.com/docs/latest/Building-Quickstart|n</span>
<span class="s2">- The tutorial-world may or may not be your cup of tea, but it does show off</span>
<span class="s2"> several |wuseful tools|n of Evennia. You may want to check out how it works:</span>
<span class="s2"> |yhttps://github.com/evennia/evennia/wiki/Tutorial-World-Introduction|n</span>
<span class="s2"> |yhttps://www.evennia.com/docs/latest/Tutorial-World-Introduction|n</span>
<span class="s2">- You can then continue looking through the |wTutorials|n and pick one that</span>
<span class="s2"> fits your level of understanding.</span>
<span class="s2"> |yhttps://github.com/evennia/evennia/wiki/Tutorials|n</span>
<span class="s2"> |yhttps://www.evennia.com/docs/latest/Tutorials|n</span>
<span class="s2">- Make sure to |wjoin our forum|n and connect to our |wsupport chat|n! The</span>
<span class="s2"> Evennia community is very active and friendly and no question is too simple.</span>
<span class="s2"> You will often quickly get help. You can everything you need linked from</span>
<span class="s2"> |yhttp://www.evennia.com|n</span>
<span class="s2"> |yhttps://www.evennia.com|n</span>
<span class="s2"># ---------------------------------------------------------------------------------</span>

View file

@ -62,6 +62,7 @@
<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</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.cmdsethandler</span> <span class="kn">import</span> <span class="n">CmdSetHandler</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">funcparser</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">create</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">search</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">logger</span>
@ -89,6 +90,12 @@
<span class="c1"># the sessid_max is based on the length of the db_sessid csv field (excluding commas)</span>
<span class="n">_SESSID_MAX</span> <span class="o">=</span> <span class="mi">16</span> <span class="k">if</span> <span class="n">_MULTISESSION_MODE</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="k">else</span> <span class="mi">1</span>
<span class="n">_MSG_CONTENTS_PARSER</span> <span class="o">=</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">FuncParser</span><span class="p">(</span>
<span class="p">{</span><span class="s2">&quot;you&quot;</span><span class="p">:</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_you</span><span class="p">,</span>
<span class="s2">&quot;You&quot;</span><span class="p">:</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_You</span><span class="p">,</span>
<span class="s2">&quot;conj&quot;</span><span class="p">:</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_conjugate</span>
<span class="p">})</span>
<div class="viewcode-block" id="ObjectSessionHandler"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler">[docs]</a><span class="k">class</span> <span class="nc">ObjectSessionHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -759,64 +766,94 @@
<span class="sd"> text (str or tuple): Message to send. If a tuple, this should be</span>
<span class="sd"> on the valid OOB outmessage form `(message, {kwargs})`,</span>
<span class="sd"> where kwargs are optional data passed to the `text`</span>
<span class="sd"> outputfunc.</span>
<span class="sd"> outputfunc. The message will be parsed for `{key}` formatting and</span>
<span class="sd"> `$You/$you()/$You(key)` and `$conj(verb)` inline function callables.</span>
<span class="sd"> The `key` is taken from the `mapping` kwarg {&quot;key&quot;: object, ...}`.</span>
<span class="sd"> The `mapping[key].get_display_name(looker=recipient)` will be called</span>
<span class="sd"> for that key for every recipient of the string.</span>
<span class="sd"> exclude (list, optional): A list of objects not to send to.</span>
<span class="sd"> from_obj (Object, optional): An object designated as the</span>
<span class="sd"> &quot;sender&quot; of the message. See `DefaultObject.msg()` for</span>
<span class="sd"> more info.</span>
<span class="sd"> mapping (dict, optional): A mapping of formatting keys</span>
<span class="sd"> `{&quot;key&quot;:&lt;object&gt;, &quot;key2&quot;:&lt;object2&gt;,...}. The keys</span>
<span class="sd"> must match `{key}` markers in the `text` if this is a string or</span>
<span class="sd"> in the internal `message` if `text` is a tuple. These</span>
<span class="sd"> formatting statements will be</span>
<span class="sd"> replaced by the return of `&lt;object&gt;.get_display_name(looker)`</span>
<span class="sd"> for every looker in contents that receives the</span>
<span class="sd"> message. This allows for every object to potentially</span>
<span class="sd"> get its own customized string.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> Keyword arguments will be passed on to `obj.msg()` for all</span>
<span class="sd"> messaged objects.</span>
<span class="sd"> `{&quot;key&quot;:&lt;object&gt;, &quot;key2&quot;:&lt;object2&gt;,...}.</span>
<span class="sd"> The keys must either match `{key}` or `$You(key)/$you(key)` markers</span>
<span class="sd"> in the `text` string. If `&lt;object&gt;` doesn&#39;t have a `get_display_name`</span>
<span class="sd"> method, it will be returned as a string. If not set, a key `you` will</span>
<span class="sd"> be auto-added to point to `from_obj` if given, otherwise to `self`.</span>
<span class="sd"> **kwargs: Keyword arguments will be passed on to `obj.msg()` for all</span>
<span class="sd"> messaged objects.</span>
<span class="sd"> Notes:</span>
<span class="sd"> The `mapping` argument is required if `message` contains</span>
<span class="sd"> {}-style format syntax. The keys of `mapping` should match</span>
<span class="sd"> named format tokens, and its values will have their</span>
<span class="sd"> `get_display_name()` function called for each object in</span>
<span class="sd"> the room before substitution. If an item in the mapping does</span>
<span class="sd"> not have `get_display_name()`, its string value will be used.</span>
<span class="sd"> For &#39;actor-stance&#39; reporting (You say/Name says), use the</span>
<span class="sd"> `$You()/$you()/$You(key)` and `$conj(verb)` (verb-conjugation)</span>
<span class="sd"> inline callables. This will use the respective `get_display_name()`</span>
<span class="sd"> for all onlookers except for `from_obj or self`, which will become</span>
<span class="sd"> &#39;You/you&#39;. If you use `$You/you(key)`, the key must be in `mapping`.</span>
<span class="sd"> Example:</span>
<span class="sd"> Say Char is a Character object and Npc is an NPC object:</span>
<span class="sd"> For &#39;director-stance&#39; reporting (Name says/Name says), use {key}</span>
<span class="sd"> syntax directly. For both `{key}` and `You/you(key)`,</span>
<span class="sd"> `mapping[key].get_display_name(looker=recipient)` may be called</span>
<span class="sd"> depending on who the recipient is.</span>
<span class="sd"> char.location.msg_contents(</span>
<span class="sd"> &quot;{attacker} kicks {defender}&quot;,</span>
<span class="sd"> mapping=dict(attacker=char, defender=npc), exclude=(char, npc))</span>
<span class="sd"> Examples:</span>
<span class="sd"> This will result in everyone in the room seeing &#39;Char kicks NPC&#39;</span>
<span class="sd"> where everyone may potentially see different results for Char and Npc</span>
<span class="sd"> depending on the results of `char.get_display_name(looker)` and</span>
<span class="sd"> `npc.get_display_name(looker)` for each particular onlooker</span>
<span class="sd"> Let&#39;s assume</span>
<span class="sd"> - `player1.key -&gt; &quot;Player1&quot;`,</span>
<span class="sd"> `player1.get_display_name(looker=player2) -&gt; &quot;The First girl&quot;`</span>
<span class="sd"> - `player2.key -&gt; &quot;Player2&quot;`,</span>
<span class="sd"> `player2.get_display_name(looker=player1) -&gt; &quot;The Second girl&quot;`</span>
<span class="sd"> Actor-stance:</span>
<span class="sd"> ::</span>
<span class="sd"> char.location.msg_contents(</span>
<span class="sd"> &quot;$You() $conj(attack) $you(defender).&quot;,</span>
<span class="sd"> mapping={&quot;defender&quot;: player2})</span>
<span class="sd"> - player1 will see `You attack The Second girl.`</span>
<span class="sd"> - player2 will see &#39;The First girl attacks you.&#39;</span>
<span class="sd"> Director-stance:</span>
<span class="sd"> ::</span>
<span class="sd"> char.location.msg_contents(</span>
<span class="sd"> &quot;{attacker} attacks {defender}.&quot;,</span>
<span class="sd"> mapping={&quot;attacker:player1, &quot;defender&quot;:player2})</span>
<span class="sd"> - player1 will see: &#39;Player1 attacks The Second girl.&#39;</span>
<span class="sd"> - player2 will see: &#39;The First girl attacks Player2&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># we also accept an outcommand on the form (message, {kwargs})</span>
<span class="n">is_outcmd</span> <span class="o">=</span> <span class="n">text</span> <span class="ow">and</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="n">inmessage</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_outcmd</span> <span class="k">else</span> <span class="n">text</span>
<span class="n">outkwargs</span> <span class="o">=</span> <span class="n">text</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">is_outcmd</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">text</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">mapping</span> <span class="o">=</span> <span class="n">mapping</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">you</span> <span class="o">=</span> <span class="n">from_obj</span> <span class="ow">or</span> <span class="bp">self</span>
<span class="k">if</span> <span class="s1">&#39;you&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">mapping</span><span class="p">:</span>
<span class="n">mapping</span><span class="p">[</span><span class="n">you</span><span class="p">]</span> <span class="o">=</span> <span class="n">you</span>
<span class="n">contents</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span>
<span class="k">if</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">exclude</span><span class="p">)</span>
<span class="n">contents</span> <span class="o">=</span> <span class="p">[</span><span class="n">obj</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">contents</span> <span class="k">if</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">]</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">contents</span><span class="p">:</span>
<span class="k">if</span> <span class="n">mapping</span><span class="p">:</span>
<span class="n">substitutions</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">t</span><span class="p">:</span> <span class="n">sub</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sub</span><span class="p">,</span> <span class="s2">&quot;get_display_name&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">sub</span><span class="p">)</span>
<span class="k">for</span> <span class="n">t</span><span class="p">,</span> <span class="n">sub</span> <span class="ow">in</span> <span class="n">mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">}</span>
<span class="n">outmessage</span> <span class="o">=</span> <span class="n">inmessage</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">substitutions</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">outmessage</span> <span class="o">=</span> <span class="n">inmessage</span>
<span class="n">obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="p">(</span><span class="n">outmessage</span><span class="p">,</span> <span class="n">outkwargs</span><span class="p">),</span> <span class="n">from_obj</span><span class="o">=</span><span class="n">from_obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">contents</span><span class="p">:</span>
<span class="c1"># actor-stance replacements</span>
<span class="n">inmessage</span> <span class="o">=</span> <span class="n">_MSG_CONTENTS_PARSER</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span>
<span class="n">inmessage</span><span class="p">,</span> <span class="n">raise_errors</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">return_string</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">caller</span><span class="o">=</span><span class="n">you</span><span class="p">,</span> <span class="n">receiver</span><span class="o">=</span><span class="n">receiver</span><span class="p">,</span> <span class="n">mapping</span><span class="o">=</span><span class="n">mapping</span><span class="p">)</span>
<span class="c1"># director-stance replacements</span>
<span class="n">outmessage</span> <span class="o">=</span> <span class="n">inmessage</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="n">obj</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="n">receiver</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;get_display_name&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()})</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="p">(</span><span class="n">outmessage</span><span class="p">,</span> <span class="n">outkwargs</span><span class="p">),</span> <span class="n">from_obj</span><span class="o">=</span><span class="n">from_obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.move_to"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.move_to">[docs]</a> <span class="k">def</span> <span class="nf">move_to</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>

View file

@ -219,9 +219,7 @@
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;test_parse&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot; Simulating prototype-func parsing ...&quot;</span><span class="p">)</span>
<span class="n">err</span><span class="p">,</span> <span class="n">parsed_value</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">protfunc_parser</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">testing</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot; |yPython `literal_eval` warning: </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">err</span><span class="p">))</span>
<span class="n">parsed_value</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">protfunc_parser</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">testing</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">prototype</span><span class="o">=</span><span class="n">prototype</span><span class="p">)</span>
<span class="k">if</span> <span class="n">parsed_value</span> <span class="o">!=</span> <span class="n">value</span><span class="p">:</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot; |g(Example-)value when parsed (</span><span class="si">{}</span><span class="s2">):|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="nb">type</span><span class="p">(</span><span class="n">parsed_value</span><span class="p">),</span> <span class="n">parsed_value</span><span class="p">)</span>
@ -306,7 +304,7 @@
<span class="k">def</span> <span class="nf">_format_protfuncs</span><span class="p">():</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">sorted_funcs</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">func</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">func</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">protlib</span><span class="o">.</span><span class="n">PROT_FUNCS</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">tup</span><span class="p">:</span> <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">func</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">func</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">protlib</span><span class="o">.</span><span class="n">FUNC_PARSER</span><span class="o">.</span><span class="n">callables</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">tup</span><span class="p">:</span> <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="p">]</span>
<span class="k">for</span> <span class="n">protfunc_name</span><span class="p">,</span> <span class="n">protfunc</span> <span class="ow">in</span> <span class="n">sorted_funcs</span><span class="p">:</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
@ -2157,7 +2155,8 @@
<span class="n">objects</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;objects&quot;</span><span class="p">]</span>
<span class="n">back_node</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;back_node&quot;</span><span class="p">]</span>
<span class="n">diff</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;diff&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">num_changed</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">batch_update_objects_with_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">diff</span><span class="o">=</span><span class="n">diff</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="n">objects</span><span class="p">)</span>
<span class="n">num_changed</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">batch_update_objects_with_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">diff</span><span class="o">=</span><span class="n">diff</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="n">objects</span><span class="p">,</span>
<span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;|g</span><span class="si">{num}</span><span class="s2"> objects were updated successfully.|n&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">num</span><span class="o">=</span><span class="n">num_changed</span><span class="p">))</span>
<span class="k">return</span> <span class="n">back_node</span>
@ -2525,7 +2524,7 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;location&quot;</span><span class="p">):</span>
<span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">caller</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">spawner</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">&quot;|gNew instance|n </span><span class="si">{key}</span><span class="s2"> (</span><span class="si">{dbref}</span><span class="s2">) |gspawned at location |n</span><span class="si">{loc}</span><span class="s2">|n|g.|n&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>

View file

@ -41,35 +41,30 @@
<h1>Source code for evennia.prototypes.protfuncs</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Protfuncs are function-strings embedded in a prototype and allows for a builder to create a</span>
<span class="sd">prototype with custom logics without having access to Python. The Protfunc is parsed using the</span>
<span class="sd">inlinefunc parser but is fired at the moment the spawning happens, using the creating object&#39;s</span>
<span class="sd">session as input.</span>
<span class="sd">Protfuncs are FuncParser-callables that can be embedded in a prototype to</span>
<span class="sd">provide custom logic without having access to Python. The protfunc is parsed at</span>
<span class="sd">the time of spawning, using the creating object&#39;s session as input. If the</span>
<span class="sd">protfunc returns a non-string, this is what will be added to the prototype.</span>
<span class="sd">In the prototype dict, the protfunc is specified as a string inside the prototype, e.g.:</span>
<span class="sd"> { ...</span>
<span class="sd"> &quot;key&quot;: &quot;$funcname(arg1, arg2, ...)&quot;</span>
<span class="sd"> &quot;key&quot;: &quot;$funcname(args, kwargs)&quot;</span>
<span class="sd"> ... }</span>
<span class="sd">and multiple functions can be nested (no keyword args are supported). The result will be used as the</span>
<span class="sd">value for that prototype key for that individual spawn.</span>
<span class="sd">Available protfuncs are callables in one of the modules of `settings.PROT_FUNC_MODULES`. They</span>
<span class="sd">are specified as functions</span>
<span class="sd">Available protfuncs are either all callables in one of the modules of `settings.PROT_FUNC_MODULES`</span>
<span class="sd">or all callables added to a dict FUNCPARSER_CALLABLES in such a module.</span>
<span class="sd"> def funcname (*args, **kwargs)</span>
<span class="sd">where *args are the arguments given in the prototype, and **kwargs are inserted by Evennia:</span>
<span class="sd">At spawn-time the spawner passes the following extra kwargs into each callable (in addition to</span>
<span class="sd">what is added in the call itself):</span>
<span class="sd"> - session (Session): The Session of the entity spawning using this prototype.</span>
<span class="sd"> - prototype (dict): The dict this protfunc is a part of.</span>
<span class="sd"> - current_key (str): The active key this value belongs to in the prototype.</span>
<span class="sd"> - testing (bool): This is set if this function is called as part of the prototype validation; if</span>
<span class="sd"> set, the protfunc should take care not to perform any persistent actions, such as operate on</span>
<span class="sd"> objects or add things to the database.</span>
<span class="sd">Any traceback raised by this function will be handled at the time of spawning and abort the spawn</span>
<span class="sd">before any object is created/updated. It must otherwise return the value to store for the specified</span>
@ -77,315 +72,35 @@
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">ast</span> <span class="kn">import</span> <span class="n">literal_eval</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span> <span class="k">as</span> <span class="n">base_randint</span><span class="p">,</span> <span class="n">random</span> <span class="k">as</span> <span class="n">base_random</span><span class="p">,</span> <span class="n">choice</span> <span class="k">as</span> <span class="n">base_choice</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">search</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">justify</span> <span class="k">as</span> <span class="n">base_justify</span><span class="p">,</span> <span class="n">is_iter</span><span class="p">,</span> <span class="n">to_str</span>
<span class="n">_PROTLIB</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_RE_DBREF</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;\#[0-9]+&quot;</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">funcparser</span>
<span class="c1"># default protfuncs</span>
<div class="viewcode-block" id="random"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.random">[docs]</a><span class="k">def</span> <span class="nf">random</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 class="viewcode-block" id="protfunc_callable_protkey"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.protfunc_callable_protkey">[docs]</a><span class="k">def</span> <span class="nf">protfunc_callable_protkey</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"> Usage: $random()</span>
<span class="sd"> Returns a random value in the interval [0, 1)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">base_random</span><span class="p">()</span></div>
<div class="viewcode-block" id="randint"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.randint">[docs]</a><span class="k">def</span> <span class="nf">randint</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"> Usage: $randint(start, end)</span>
<span class="sd"> Returns random integer in interval [start, end]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;$randint needs two arguments - start and end.&quot;</span><span class="p">)</span>
<span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">int</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">return</span> <span class="n">base_randint</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span></div>
<div class="viewcode-block" id="left_justify"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.left_justify">[docs]</a><span class="k">def</span> <span class="nf">left_justify</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"> Usage: $left_justify(&lt;text&gt;)</span>
<span class="sd"> Returns &lt;text&gt; left-justified.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="k">return</span> <span class="n">base_justify</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</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="k">return</span> <span class="s2">&quot;&quot;</span></div>
<div class="viewcode-block" id="right_justify"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.right_justify">[docs]</a><span class="k">def</span> <span class="nf">right_justify</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"> Usage: $right_justify(&lt;text&gt;)</span>
<span class="sd"> Returns &lt;text&gt; right-justified across screen width.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="k">return</span> <span class="n">base_justify</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">align</span><span class="o">=</span><span class="s2">&quot;r&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span></div>
<div class="viewcode-block" id="center_justify"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.center_justify">[docs]</a><span class="k">def</span> <span class="nf">center_justify</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"> Usage: $center_justify(&lt;text&gt;)</span>
<span class="sd"> Returns &lt;text&gt; centered in screen width.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="k">return</span> <span class="n">base_justify</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">align</span><span class="o">=</span><span class="s2">&quot;c&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span></div>
<div class="viewcode-block" id="choice"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.choice">[docs]</a><span class="k">def</span> <span class="nf">choice</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"> Usage: $choice(val, val, val, ...)</span>
<span class="sd"> Returns one of the values randomly</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="k">return</span> <span class="n">base_choice</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span></div>
<div class="viewcode-block" id="full_justify"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.full_justify">[docs]</a><span class="k">def</span> <span class="nf">full_justify</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"> Usage: $full_justify(&lt;text&gt;)</span>
<span class="sd"> Returns &lt;text&gt; filling up screen width by adding extra space.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="k">return</span> <span class="n">base_justify</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">align</span><span class="o">=</span><span class="s2">&quot;f&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span></div>
<div class="viewcode-block" id="protkey"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.protkey">[docs]</a><span class="k">def</span> <span class="nf">protkey</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"> Usage: $protkey(&lt;key&gt;)</span>
<span class="sd"> Usage: $protkey(keyname)</span>
<span class="sd"> Returns the value of another key in this prototoype. Will raise an error if</span>
<span class="sd"> the key is not found in this prototype.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;prototype&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">prototype</span><span class="p">[</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()]</span></div>
<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="s2">&quot;&quot;</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype&quot;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">prot_value</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_eval</span><span class="p">(</span><span class="n">prot_value</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">except</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">ParsingError</span><span class="p">:</span>
<span class="k">return</span> <span class="n">prot_value</span></div>
<div class="viewcode-block" id="add"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.add">[docs]</a><span class="k">def</span> <span class="nf">add</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"> Usage: $add(val1, val2)</span>
<span class="sd"> Returns the result of val1 + val2. Values must be</span>
<span class="sd"> valid simple Python structures possible to add,</span>
<span class="sd"> such as numbers, lists etc.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">val1</span><span class="p">,</span> <span class="n">val2</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">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="c1"># try to convert to python structures, otherwise, keep as strings</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val1</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">val1</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val2</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">val2</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">return</span> <span class="n">val1</span> <span class="o">+</span> <span class="n">val2</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;$add requires two arguments.&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="sub"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.sub">[docs]</a><span class="k">def</span> <span class="nf">sub</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"> Usage: $del(val1, val2)</span>
<span class="sd"> Returns the value of val1 - val2. Values must be</span>
<span class="sd"> valid simple Python structures possible to</span>
<span class="sd"> subtract.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">val1</span><span class="p">,</span> <span class="n">val2</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">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="c1"># try to convert to python structures, otherwise, keep as strings</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val1</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">val1</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val2</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">val2</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">return</span> <span class="n">val1</span> <span class="o">-</span> <span class="n">val2</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;$sub requires two arguments.&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="mult"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.mult">[docs]</a><span class="k">def</span> <span class="nf">mult</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"> Usage: $mul(val1, val2)</span>
<span class="sd"> Returns the value of val1 * val2. The values must be</span>
<span class="sd"> valid simple Python structures possible to</span>
<span class="sd"> multiply, like strings and/or numbers.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">val1</span><span class="p">,</span> <span class="n">val2</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">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="c1"># try to convert to python structures, otherwise, keep as strings</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val1</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">val1</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val2</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">val2</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">return</span> <span class="n">val1</span> <span class="o">*</span> <span class="n">val2</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;$mul requires two arguments.&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="div"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.div">[docs]</a><span class="k">def</span> <span class="nf">div</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"> Usage: $div(val1, val2)</span>
<span class="sd"> Returns the value of val1 / val2. Values must be numbers and</span>
<span class="sd"> the result is always a float.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">val1</span><span class="p">,</span> <span class="n">val2</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">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="c1"># try to convert to python structures, otherwise, keep as strings</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val1</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">val1</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val2</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">val2</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">return</span> <span class="n">val1</span> <span class="o">/</span> <span class="nb">float</span><span class="p">(</span><span class="n">val2</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;$mult requires two arguments.&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="toint"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.toint">[docs]</a><span class="k">def</span> <span class="nf">toint</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"> Usage: $toint(&lt;number&gt;)</span>
<span class="sd"> Returns &lt;number&gt; as an integer.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">literal_eval</span><span class="p">(</span><span class="n">val</span><span class="o">.</span><span class="n">strip</span><span class="p">()))</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;$toint requires one argument.&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="eval"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.eval">[docs]</a><span class="k">def</span> <span class="nf">eval</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"> Usage $eval(&lt;expression&gt;)</span>
<span class="sd"> Returns evaluation of a simple Python expression. The string may *only* consist of the following</span>
<span class="sd"> Python literal structures: strings, numbers, tuples, lists, dicts, booleans,</span>
<span class="sd"> and None. The strings can also contain #dbrefs. Escape embedded protfuncs as $$protfunc(..)</span>
<span class="sd"> - those will then be evaluated *after* $eval.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_PROTLIB</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_PROTLIB</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.prototypes</span> <span class="kn">import</span> <span class="n">prototypes</span> <span class="k">as</span> <span class="n">_PROTLIB</span>
<span class="n">string</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</span><span class="p">)</span>
<span class="n">struct</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">struct</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="c1"># we must shield the string, otherwise it will be merged as a string and future</span>
<span class="c1"># literal_evas will pick up e.g. &#39;2&#39; as something that should be converted to a number</span>
<span class="n">struct</span> <span class="o">=</span> <span class="s1">&#39;&quot;</span><span class="si">{}</span><span class="s1">&quot;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">struct</span><span class="p">)</span>
<span class="c1"># convert any #dbrefs to objects (also in nested structures)</span>
<span class="n">struct</span> <span class="o">=</span> <span class="n">_PROTLIB</span><span class="o">.</span><span class="n">value_to_obj_or_any</span><span class="p">(</span><span class="n">struct</span><span class="p">)</span>
<span class="k">return</span> <span class="n">struct</span></div>
<span class="k">def</span> <span class="nf">_obj_search</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="s2">&quot;Helper function to search for an object&quot;</span>
<span class="n">query</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</span><span class="p">)</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;session&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">return_list</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;return_list&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">account</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">session</span><span class="p">:</span>
<span class="n">account</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">account</span>
<span class="n">targets</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_object</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
<span class="k">if</span> <span class="n">return_list</span><span class="p">:</span>
<span class="n">retlist</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="k">for</span> <span class="n">target</span> <span class="ow">in</span> <span class="n">targets</span><span class="p">:</span>
<span class="k">if</span> <span class="n">target</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">):</span>
<span class="n">retlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">retlist</span> <span class="o">=</span> <span class="n">targets</span>
<span class="k">return</span> <span class="n">retlist</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># single-match</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">targets</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;$obj: Query &#39;</span><span class="si">{}</span><span class="s2">&#39; gave no matches.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</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">targets</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;$obj: Query &#39;</span><span class="si">{query}</span><span class="s2">&#39; gave </span><span class="si">{nmatches}</span><span class="s2"> matches. Limit your &quot;</span>
<span class="s2">&quot;query or use $objlist instead.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="n">query</span><span class="p">,</span> <span class="n">nmatches</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">targets</span><span class="p">))</span>
<span class="p">)</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">targets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;$obj: Obj </span><span class="si">{target}</span><span class="s2">(#</span><span class="si">{dbref}</span><span class="s2"> cannot be added - &quot;</span>
<span class="s2">&quot;Account </span><span class="si">{account}</span><span class="s2"> does not have &#39;control&#39; access.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">target</span><span class="o">=</span><span class="n">target</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">dbref</span><span class="o">=</span><span class="n">target</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="n">account</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">target</span>
<div class="viewcode-block" id="obj"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.obj">[docs]</a><span class="k">def</span> <span class="nf">obj</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"> Usage $obj(&lt;query&gt;)</span>
<span class="sd"> Returns one Object searched globally by key, alias or #dbref. Error if more than one.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">_obj_search</span><span class="p">(</span><span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">return</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">obj</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">)</span></div>
<div class="viewcode-block" id="objlist"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.objlist">[docs]</a><span class="k">def</span> <span class="nf">objlist</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"> Usage $objlist(&lt;query&gt;)</span>
<span class="sd"> Returns list with one or more Objects searched globally by key, alias or #dbref.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</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">obj</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">_obj_search</span><span class="p">(</span><span class="n">return_list</span><span class="o">=</span><span class="kc">True</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="dbref"><a class="viewcode-back" href="../../../api/evennia.prototypes.protfuncs.html#evennia.prototypes.protfuncs.dbref">[docs]</a><span class="k">def</span> <span class="nf">dbref</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"> Usage $dbref(&lt;#dbref&gt;)</span>
<span class="sd"> Validate that a #dbref input is valid.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">_RE_DBREF</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;$dbref requires a valid #dbref argument.&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span></div>
<span class="c1"># this is picked up by FuncParser</span>
<span class="n">FUNCPARSER_CALLABLES</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;protkey&quot;</span><span class="p">:</span> <span class="n">protfunc_callable_protkey</span><span class="p">,</span>
<span class="o">**</span><span class="n">funcparser</span><span class="o">.</span><span class="n">FUNCPARSER_CALLABLES</span><span class="p">,</span>
<span class="o">**</span><span class="n">funcparser</span><span class="o">.</span><span class="n">SEARCHING_CALLABLES</span><span class="p">,</span>
<span class="p">}</span>
</pre></div>
<div class="clearer"></div>

View file

@ -72,7 +72,8 @@
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.locks.lockhandler</span> <span class="kn">import</span> <span class="n">validate_lockstring</span><span class="p">,</span> <span class="n">check_lockstring</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">logger</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">inlinefuncs</span><span class="p">,</span> <span class="n">dbserialize</span>
<span class="kn">from</span> <span class="nn">evennia.utils.funcparser</span> <span class="kn">import</span> <span class="n">FuncParser</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">dbserialize</span>
<span class="kn">from</span> <span class="nn">evennia.utils.evtable</span> <span class="kn">import</span> <span class="n">EvTable</span>
@ -100,11 +101,14 @@
<span class="p">)</span>
<span class="n">PROTOTYPE_TAG_CATEGORY</span> <span class="o">=</span> <span class="s2">&quot;from_prototype&quot;</span>
<span class="n">_PROTOTYPE_TAG_META_CATEGORY</span> <span class="o">=</span> <span class="s2">&quot;db_prototype&quot;</span>
<span class="n">PROT_FUNCS</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">_PROTOTYPE_FALLBACK_LOCK</span> <span class="o">=</span> <span class="s2">&quot;spawn:all();edit:all()&quot;</span>
<span class="c1"># the protfunc parser</span>
<span class="n">FUNC_PARSER</span> <span class="o">=</span> <span class="n">FuncParser</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">PROT_FUNC_MODULES</span><span class="p">)</span>
<div class="viewcode-block" id="PermissionError"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.PermissionError">[docs]</a><span class="k">class</span> <span class="nc">PermissionError</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">):</span>
<span class="k">pass</span></div>
@ -751,18 +755,7 @@
<span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;prototype_locks&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">prototype_locks</span></div>
<span class="c1"># Protfunc parsing (in-prototype functions)</span>
<span class="k">for</span> <span class="n">mod</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">PROT_FUNC_MODULES</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">callables</span> <span class="o">=</span> <span class="n">callables_from_module</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
<span class="n">PROT_FUNCS</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">callables</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
<span class="k">raise</span>
<div class="viewcode-block" id="protfunc_parser"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.protfunc_parser">[docs]</a><span class="k">def</span> <span class="nf">protfunc_parser</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">available_functions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">testing</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">stacktrace</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<div class="viewcode-block" id="protfunc_parser"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.protfunc_parser">[docs]</a><span class="k">def</span> <span class="nf">protfunc_parser</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">available_functions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">testing</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">stacktrace</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">caller</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"> Parse a prototype value string for a protfunc and process it.</span>
@ -774,45 +767,27 @@
<span class="sd"> protfuncs, all other types are returned as-is.</span>
<span class="sd"> available_functions (dict, optional): Mapping of name:protfunction to use for this parsing.</span>
<span class="sd"> If not set, use default sources.</span>
<span class="sd"> testing (bool, optional): Passed to protfunc. If in a testing mode, some protfuncs may</span>
<span class="sd"> behave differently.</span>
<span class="sd"> stacktrace (bool, optional): If set, print the stack parsing process of the protfunc-parser.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> session (Session): Passed to protfunc. Session of the entity spawning the prototype.</span>
<span class="sd"> protototype (dict): Passed to protfunc. The dict this protfunc is a part of.</span>
<span class="sd"> current_key(str): Passed to protfunc. The key in the prototype that will hold this value.</span>
<span class="sd"> caller (Object or Account): This is necessary for certain protfuncs that perform object</span>
<span class="sd"> searches and have to check permissions.</span>
<span class="sd"> any (any): Passed on to the protfunc.</span>
<span class="sd"> Returns:</span>
<span class="sd"> testresult (tuple): If `testing` is set, returns a tuple (error, result) where error is</span>
<span class="sd"> either None or a string detailing the error from protfunc_parser or seen when trying to</span>
<span class="sd"> run `literal_eval` on the parsed string.</span>
<span class="sd"> any (any): A structure to replace the string on the prototype level. If this is a</span>
<span class="sd"> callable or a (callable, (args,)) structure, it will be executed as if one had supplied</span>
<span class="sd"> it to the prototype directly. This structure is also passed through literal_eval so one</span>
<span class="sd"> can get actual Python primitives out of it (not just strings). It will also identify</span>
<span class="sd"> eventual object #dbrefs in the output from the protfunc.</span>
<span class="sd"> any: A structure to replace the string on the prototype leve. Note</span>
<span class="sd"> that FunctionParser functions $funcname(*args, **kwargs) can return any</span>
<span class="sd"> data type to insert into the prototype.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="n">value</span>
<span class="n">available_functions</span> <span class="o">=</span> <span class="n">PROT_FUNCS</span> <span class="k">if</span> <span class="n">available_functions</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">available_functions</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">FUNC_PARSER</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">raise_errors</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">return_str</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">inlinefuncs</span><span class="o">.</span><span class="n">parse_inlinefunc</span><span class="p">(</span>
<span class="n">value</span><span class="p">,</span> <span class="n">available_funcs</span><span class="o">=</span><span class="n">available_functions</span><span class="p">,</span> <span class="n">stacktrace</span><span class="o">=</span><span class="n">stacktrace</span><span class="p">,</span> <span class="n">testing</span><span class="o">=</span><span class="n">testing</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">)</span>
<span class="n">err</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
<span class="k">if</span> <span class="n">testing</span><span class="p">:</span>
<span class="k">return</span> <span class="n">err</span><span class="p">,</span> <span class="n">result</span>
<span class="k">return</span> <span class="n">result</span></div>
@ -827,7 +802,7 @@
<span class="sd"> clr (str, optional): What coloration tag to use.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">protfunc_name</span><span class="p">,</span> <span class="n">protfunc</span> <span class="ow">in</span> <span class="n">PROT_FUNCS</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">for</span> <span class="n">protfunc_name</span><span class="p">,</span> <span class="n">protfunc</span> <span class="ow">in</span> <span class="n">FUNC_PARSER</span><span class="o">.</span><span class="n">callables</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;- |c$</span><span class="si">{name}</span><span class="s2">|n - |W</span><span class="si">{docs}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="n">protfunc_name</span><span class="p">,</span> <span class="n">docs</span><span class="o">=</span><span class="n">protfunc</span><span class="o">.</span><span class="vm">__doc__</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
@ -952,7 +927,7 @@
<span class="k">return</span> <span class="n">default</span></div>
<div class="viewcode-block" id="init_spawn_value"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.init_spawn_value">[docs]</a><span class="k">def</span> <span class="nf">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">validator</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<div class="viewcode-block" id="init_spawn_value"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.init_spawn_value">[docs]</a><span class="k">def</span> <span class="nf">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">validator</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Analyze the prototype value and produce a value useful at the point of spawning.</span>
@ -963,6 +938,8 @@
<span class="sd"> other - will be assigned depending on the variable type</span>
<span class="sd"> validator (callable, optional): If given, this will be called with the value to</span>
<span class="sd"> check and guarantee the outcome is of a given type.</span>
<span class="sd"> caller (Object or Account): This is necessary for certain protfuncs that perform object</span>
<span class="sd"> searches and have to check permissions.</span>
<span class="sd"> Returns:</span>
<span class="sd"> any (any): The (potentially pre-processed value to use for this prototype key)</span>
@ -977,7 +954,7 @@
<span class="n">value</span> <span class="o">=</span> <span class="n">validator</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="o">*</span><span class="n">make_iter</span><span class="p">(</span><span class="n">args</span><span class="p">)))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">validator</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">protfunc_parser</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">protfunc_parser</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="n">validator</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span></div>

View file

@ -649,7 +649,8 @@
<span class="k">return</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">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">texts</span> <span class="k">if</span> <span class="n">line</span><span class="p">)</span></div>
<div class="viewcode-block" id="batch_update_objects_with_prototype"><a class="viewcode-back" href="../../../api/evennia.prototypes.spawner.html#evennia.prototypes.spawner.batch_update_objects_with_prototype">[docs]</a><span class="k">def</span> <span class="nf">batch_update_objects_with_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">diff</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">exact</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<div class="viewcode-block" id="batch_update_objects_with_prototype"><a class="viewcode-back" href="../../../api/evennia.prototypes.spawner.html#evennia.prototypes.spawner.batch_update_objects_with_prototype">[docs]</a><span class="k">def</span> <span class="nf">batch_update_objects_with_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">diff</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">exact</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Update existing objects with the latest version of the prototype.</span>
@ -666,6 +667,7 @@
<span class="sd"> if it&#39;s not set in the prototype. With `exact=True`, all un-specified properties of the</span>
<span class="sd"> objects will be removed if they exist. This will lead to a more accurate 1:1 correlation</span>
<span class="sd"> between the object and the prototype but is usually impractical.</span>
<span class="sd"> caller (Object or Account, optional): This may be used by protfuncs to do permission checks.</span>
<span class="sd"> Returns:</span>
<span class="sd"> changed (int): The number of objects that had changes applied to them.</span>
@ -717,33 +719,33 @@
<span class="n">do_save</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;key&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_key</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_key</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;typeclass&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_typeclass_path</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_typeclass_path</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;location&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_location</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_location</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;home&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_home</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_home</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;destination&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_destination</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db_destination</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;locks&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">directive</span> <span class="o">==</span> <span class="s2">&quot;REPLACE&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">))</span>
<span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;permissions&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">directive</span> <span class="o">==</span> <span class="s2">&quot;REPLACE&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">perm</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">for</span> <span class="n">perm</span> <span class="ow">in</span> <span class="n">val</span><span class="p">))</span>
<span class="n">obj</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">perm</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span> <span class="k">for</span> <span class="n">perm</span> <span class="ow">in</span> <span class="n">val</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;aliases&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">directive</span> <span class="o">==</span> <span class="s2">&quot;REPLACE&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">val</span><span class="p">))</span>
<span class="n">obj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span> <span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">val</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;tags&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">directive</span> <span class="o">==</span> <span class="s2">&quot;REPLACE&quot;</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span>
<span class="o">*</span><span class="p">(</span>
<span class="p">(</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">ttag</span><span class="p">,</span> <span class="nb">str</span><span class="p">),</span> <span class="n">tcategory</span><span class="p">,</span> <span class="n">tdata</span><span class="p">)</span>
<span class="p">(</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">ttag</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span> <span class="n">tcategory</span><span class="p">,</span> <span class="n">tdata</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ttag</span><span class="p">,</span> <span class="n">tcategory</span><span class="p">,</span> <span class="n">tdata</span> <span class="ow">in</span> <span class="n">val</span>
<span class="p">)</span>
<span class="p">)</span>
@ -753,8 +755,8 @@
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span>
<span class="o">*</span><span class="p">(</span>
<span class="p">(</span>
<span class="n">init_spawn_value</span><span class="p">(</span><span class="n">akey</span><span class="p">,</span> <span class="nb">str</span><span class="p">),</span>
<span class="n">init_spawn_value</span><span class="p">(</span><span class="n">aval</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">),</span>
<span class="n">init_spawn_value</span><span class="p">(</span><span class="n">akey</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span>
<span class="n">init_spawn_value</span><span class="p">(</span><span class="n">aval</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span>
<span class="n">acategory</span><span class="p">,</span>
<span class="n">alocks</span><span class="p">,</span>
<span class="p">)</span>
@ -765,7 +767,7 @@
<span class="c1"># we don&#39;t auto-rerun exec statements, it would be huge security risk!</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">))</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">directive</span> <span class="o">==</span> <span class="s2">&quot;REMOVE&quot;</span><span class="p">:</span>
<span class="n">do_save</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;key&quot;</span><span class="p">:</span>
@ -878,7 +880,7 @@
<span class="c1"># Spawner mechanism</span>
<div class="viewcode-block" id="spawn"><a class="viewcode-back" href="../../../api/evennia.prototypes.spawner.html#evennia.prototypes.spawner.spawn">[docs]</a><span class="k">def</span> <span class="nf">spawn</span><span class="p">(</span><span class="o">*</span><span class="n">prototypes</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<div class="viewcode-block" id="spawn"><a class="viewcode-back" href="../../../api/evennia.prototypes.spawner.html#evennia.prototypes.spawner.spawn">[docs]</a><span class="k">def</span> <span class="nf">spawn</span><span class="p">(</span><span class="o">*</span><span class="n">prototypes</span><span class="p">,</span> <span class="n">caller</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"> Spawn a number of prototyped objects.</span>
@ -887,6 +889,7 @@
<span class="sd"> prototype_key (will be used to find the prototype) or a full prototype</span>
<span class="sd"> dictionary. These will be batched-spawned as one object each.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> caller (Object or Account, optional): This may be used by protfuncs to do access checks.</span>
<span class="sd"> prototype_modules (str or list): A python-path to a prototype</span>
<span class="sd"> module, or a list of such paths. These will be used to build</span>
<span class="sd"> the global protparents dictionary accessible by the input</span>
@ -952,39 +955,39 @@
<span class="s2">&quot;key&quot;</span><span class="p">,</span>
<span class="s2">&quot;Spawned-</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">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="nb">bytes</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()),</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()[:</span><span class="mi">6</span><span class="p">]),</span>
<span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;location&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;home&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span><span class="p">:</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_home&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="c1"># settings.DEFAULT_HOME not existing is common for unittests</span>
<span class="k">pass</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;destination&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_destination&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_destination&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_OBJECT_TYPECLASS</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="n">create_kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="c1"># extract calls to handlers</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;permissions&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">permission_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">)</span>
<span class="n">permission_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">lock_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="n">lock_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;aliases&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">)</span>
<span class="n">alias_string</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">tags</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="o">*</span><span class="n">data</span><span class="p">)</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span>
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">tag</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="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">data</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">init_spawn_value</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span> <span class="n">category</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">data</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prototype_key</span><span class="p">:</span>
@ -992,11 +995,11 @@
<span class="n">tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">PROTOTYPE_TAG_CATEGORY</span><span class="p">))</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;exec&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">execs</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">)</span>
<span class="n">execs</span> <span class="o">=</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">)</span>
<span class="c1"># extract ndb assignments</span>
<span class="n">nattributes</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="p">(</span><span class="n">key</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="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">],</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">))</span>
<span class="p">(</span><span class="n">key</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="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">],</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">value_to_obj</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</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">prot</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;ndb_&quot;</span><span class="p">)</span>
<span class="p">)</span>
@ -1005,7 +1008,7 @@
<span class="n">val</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">prot</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;attrs&quot;</span><span class="p">,</span> <span class="p">[]))</span>
<span class="n">attributes</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="p">(</span><span class="n">attrname</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="o">*</span><span class="n">rest</span><span class="p">)</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span>
<span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">attrname</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">),</span>
<span class="n">attributes</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">attrname</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span>
<span class="n">rest</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">rest</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span> <span class="n">rest</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">rest</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span><span class="p">))</span>
<span class="n">simple_attributes</span> <span class="o">=</span> <span class="p">[]</span>
@ -1017,7 +1020,7 @@
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">simple_attributes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">value_to_obj_or_any</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">init_spawn_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">value_to_obj_or_any</span><span class="p">,</span> <span class="n">caller</span><span class="o">=</span><span class="n">caller</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">attributes</span> <span class="o">=</span> <span class="n">attributes</span> <span class="o">+</span> <span class="n">simple_attributes</span>

View file

@ -101,6 +101,21 @@
<span class="s2">&quot;Update your settings file (see evennia/settings_default.py &quot;</span>
<span class="s2">&quot;for more info).&quot;</span>
<span class="p">)</span>
<span class="n">depstring</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;settings.</span><span class="si">{}</span><span class="s2"> was renamed to </span><span class="si">{}</span><span class="s2">. Update your settings file (the FuncParser &quot;</span>
<span class="s2">&quot;replaces and generalizes that which inlinefuncs used to do).&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="s2">&quot;INLINEFUNC_ENABLED&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">DeprecationWarning</span><span class="p">(</span><span class="n">depstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="s2">&quot;settings.INLINEFUNC_ENABLED&quot;</span><span class="p">,</span> <span class="s2">&quot;FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLE&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="s2">&quot;INLINEFUNC_STACK_MAXSIZE&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">DeprecationWarning</span><span class="p">(</span><span class="n">depstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="s2">&quot;settings.INLINEFUNC_STACK_MAXSIZE&quot;</span><span class="p">,</span> <span class="s2">&quot;FUNCPARSER_MAX_NESTING&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="s2">&quot;INLINEFUNC_MODULES&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">DeprecationWarning</span><span class="p">(</span><span class="n">depstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="s2">&quot;settings.INLINEFUNC_MODULES&quot;</span><span class="p">,</span> <span class="s2">&quot;FUNCPARSER_OUTGOING_MESSAGES_MODULES&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="s2">&quot;PROTFUNC_MODULES&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">DeprecationWarning</span><span class="p">(</span><span class="n">depstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="s2">&quot;settings.PROTFUNC_MODULES&quot;</span><span class="p">,</span> <span class="s2">&quot;FUNCPARSER_PROTOTYPE_VALUE_MODULES&quot;</span><span class="p">))</span>
<span class="n">gametime_deprecation</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;The settings TIME_SEC_PER_MIN, TIME_MIN_PER_HOUR,&quot;</span>

View file

@ -70,10 +70,9 @@
<span class="kn">from</span> <span class="nn">evennia.server.portal</span> <span class="kn">import</span> <span class="n">amp</span>
<span class="kn">from</span> <span class="nn">evennia.server.signals</span> <span class="kn">import</span> <span class="n">SIGNAL_ACCOUNT_POST_LOGIN</span><span class="p">,</span> <span class="n">SIGNAL_ACCOUNT_POST_LOGOUT</span>
<span class="kn">from</span> <span class="nn">evennia.server.signals</span> <span class="kn">import</span> <span class="n">SIGNAL_ACCOUNT_POST_FIRST_LOGIN</span><span class="p">,</span> <span class="n">SIGNAL_ACCOUNT_POST_LAST_LOGOUT</span>
<span class="kn">from</span> <span class="nn">evennia.utils.inlinefuncs</span> <span class="kn">import</span> <span class="n">parse_inlinefunc</span>
<span class="kn">from</span> <span class="nn">codecs</span> <span class="kn">import</span> <span class="n">decode</span> <span class="k">as</span> <span class="n">codecs_decode</span>
<span class="n">_INLINEFUNC_ENABLED</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">INLINEFUNC_ENABLED</span>
<span class="n">_FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span>
<span class="c1"># delayed imports</span>
<span class="n">_AccountDB</span> <span class="o">=</span> <span class="kc">None</span>
@ -101,6 +100,9 @@
<span class="n">_MAX_SERVER_COMMANDS_PER_SECOND</span> <span class="o">=</span> <span class="mf">100.0</span>
<span class="n">_MAX_SESSION_COMMANDS_PER_SECOND</span> <span class="o">=</span> <span class="mf">5.0</span>
<span class="n">_MODEL_MAP</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_FUNCPARSER</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># input handlers</span>
@ -193,7 +195,8 @@
<div class="viewcode-block" id="SessionHandler.clean_senddata"><a class="viewcode-back" href="../../../api/evennia.server.sessionhandler.html#evennia.server.sessionhandler.SessionHandler.clean_senddata">[docs]</a> <span class="k">def</span> <span class="nf">clean_senddata</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Clean up data for sending across the AMP wire. Also apply INLINEFUNCS.</span>
<span class="sd"> Clean up data for sending across the AMP wire. Also apply the</span>
<span class="sd"> FuncParser using callables from `settings.FUNCPARSER_OUTGOING_MESSAGES_MODULES`.</span>
<span class="sd"> Args:</span>
<span class="sd"> session (Session): The relevant session instance.</span>
@ -209,10 +212,15 @@
<span class="sd"> Returns:</span>
<span class="sd"> kwargs (dict): A cleaned dictionary of cmdname:[[args],{kwargs}] pairs,</span>
<span class="sd"> where the keys, args and kwargs have all been converted to</span>
<span class="sd"> send-safe entities (strings or numbers), and inlinefuncs have been</span>
<span class="sd"> send-safe entities (strings or numbers), and funcparser parsing has been</span>
<span class="sd"> applied.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_FUNCPARSER</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_FUNCPARSER</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.utils.funcparser</span> <span class="kn">import</span> <span class="n">FuncParser</span>
<span class="n">_FUNCPARSER</span> <span class="o">=</span> <span class="n">FuncParser</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">FUNCPARSER_OUTGOING_MESSAGES_MODULE</span><span class="p">,</span> <span class="n">raise_errors</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">options</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;options&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">raw</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;raw&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">strip_inlinefunc</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;strip_inlinefunc&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
@ -244,9 +252,10 @@
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">)):</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">_utf8</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">_INLINEFUNC_ENABLED</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">raw</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ServerSessionHandler</span><span class="p">):</span>
<span class="c1"># only parse inlinefuncs on the outgoing path (sessionhandler-&gt;)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">parse_inlinefunc</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">strip</span><span class="o">=</span><span class="n">strip_inlinefunc</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="k">if</span> <span class="n">_FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">raw</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ServerSessionHandler</span><span class="p">):</span>
<span class="c1"># only apply funcparser on the outgoing path (sessionhandler-&gt;)</span>
<span class="c1"># data = parse_inlinefunc(data, strip=strip_inlinefunc, session=session)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">_FUNCPARSER</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">strip</span><span class="o">=</span><span class="n">strip_inlinefunc</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">elif</span> <span class="p">(</span>

File diff suppressed because it is too large Load diff

View file

@ -1,730 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.utils.inlinefuncs &#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.utils.inlinefuncs</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.utils.inlinefuncs</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Inline functions (nested form).</span>
<span class="sd">This parser accepts nested inlinefunctions on the form</span>
<span class="sd">```python</span>
<span class="sd">$funcname(arg, arg, ...)</span>
<span class="sd">```</span>
<span class="sd">embedded in any text where any arg can be another ``$funcname()`` call.</span>
<span class="sd">This functionality is turned off by default - to activate,</span>
<span class="sd">`settings.INLINEFUNC_ENABLED` must be set to `True`.</span>
<span class="sd">Each token starts with `$funcname(` where there must be no space</span>
<span class="sd">between the `$funcname` and `&quot;(&quot;`. The inlinefunc ends with a matched ending parentesis.</span>
<span class="sd">`&quot;)&quot;`.</span>
<span class="sd">Inside the inlinefunc definition, one can use `\` to escape. This is</span>
<span class="sd">mainly needed for escaping commas in flowing text (which would</span>
<span class="sd">otherwise be interpreted as an argument separator), or to escape `)`</span>
<span class="sd">when not intended to close the function block. Enclosing text in</span>
<span class="sd">matched `\&quot;\&quot;\&quot;` (triple quotes) or `&#39;&#39;&#39;` (triple single-quotes) will</span>
<span class="sd">also escape *everything* within without needing to escape individual</span>
<span class="sd">characters.</span>
<span class="sd">The available inlinefuncs are defined as global-level functions in</span>
<span class="sd">modules defined by `settings.INLINEFUNC_MODULES`. They are identified</span>
<span class="sd">by their function name (and ignored if this name starts with `_`). They</span>
<span class="sd">should be on the following form:</span>
<span class="sd">```python</span>
<span class="sd">def funcname (*args, **kwargs):</span>
<span class="sd"> # ...</span>
<span class="sd">```</span>
<span class="sd">Here, the arguments given to `$funcname(arg1,arg2)` will appear as the</span>
<span class="sd">`*args` tuple. This will be populated by the arguments given to the</span>
<span class="sd">inlinefunc in-game - the only part that will be available from</span>
<span class="sd">in-game. `**kwargs` are not supported from in-game but are only used</span>
<span class="sd">internally by Evennia to make details about the caller available to</span>
<span class="sd">the function. The kwarg passed to all functions is `session`, the</span>
<span class="sd">Sessionobject for the object seeing the string. This may be `None` if</span>
<span class="sd">the string is sent to a non-puppetable object. The inlinefunc should</span>
<span class="sd">never raise an exception.</span>
<span class="sd">There are two reserved function names:</span>
<span class="sd">- &quot;nomatch&quot;: This is called if the user uses a functionname that is</span>
<span class="sd"> not registered. The nomatch function will get the name of the</span>
<span class="sd"> not-found function as its first argument followed by the normal</span>
<span class="sd"> arguments to the given function. If not defined the default effect is</span>
<span class="sd"> to print `&lt;UNKNOWN&gt;` to replace the unknown function.</span>
<span class="sd">- &quot;stackfull&quot;: This is called when the maximum nested function stack is reached.</span>
<span class="sd"> When this happens, the original parsed string is returned and the result of</span>
<span class="sd"> the `stackfull` inlinefunc is appended to the end. By default this is an</span>
<span class="sd"> error message.</span>
<span class="sd">Syntax errors, notably failing to completely closing all inlinefunc</span>
<span class="sd">blocks, will lead to the entire string remaining unparsed. Inlineparsing should</span>
<span class="sd">never traceback.</span>
<span class="sd">----</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">fnmatch</span>
<span class="kn">import</span> <span class="nn">random</span> <span class="k">as</span> <span class="nn">base_random</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.utils</span> <span class="kn">import</span> <span class="n">utils</span><span class="p">,</span> <span class="n">logger</span>
<span class="c1"># The stack size is a security measure. Set to &lt;=0 to disable.</span>
<span class="n">_STACK_MAXSIZE</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">INLINEFUNC_STACK_MAXSIZE</span>
<span class="c1"># example/testing inline functions</span>
<div class="viewcode-block" id="random"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.random">[docs]</a><span class="k">def</span> <span class="nf">random</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"> Inlinefunc. Returns a random number between</span>
<span class="sd"> 0 and 1, from 0 to a maximum value, or within a given range (inclusive).</span>
<span class="sd"> Args:</span>
<span class="sd"> minval (str, optional): Minimum value. If not given, assumed 0.</span>
<span class="sd"> maxval (str, optional): Maximum value.</span>
<span class="sd"> Keyword argumuents:</span>
<span class="sd"> session (Session): Session getting the string.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If either of the min/maxvalue has a &#39;.&#39; in it, a floating-point random</span>
<span class="sd"> value will be returned. Otherwise it will be an integer value in the</span>
<span class="sd"> given range.</span>
<span class="sd"> Example:</span>
<span class="sd"> `$random()`</span>
<span class="sd"> `$random(5)`</span>
<span class="sd"> `$random(5, 10)`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">nargs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># only maxval given</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="s2">&quot;0&quot;</span><span class="p">,</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="n">args</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;0&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;.&quot;</span> <span class="ow">in</span> <span class="n">minval</span> <span class="ow">or</span> <span class="s2">&quot;.&quot;</span> <span class="ow">in</span> <span class="n">maxval</span><span class="p">:</span>
<span class="c1"># float mode</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">minval</span><span class="p">),</span> <span class="nb">float</span><span class="p">(</span><span class="n">maxval</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{:.2f}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">minval</span> <span class="o">+</span> <span class="n">maxval</span> <span class="o">*</span> <span class="n">base_random</span><span class="o">.</span><span class="n">random</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># int mode</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">minval</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">maxval</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">base_random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="n">minval</span><span class="p">,</span> <span class="n">maxval</span><span class="p">))</span></div>
<div class="viewcode-block" id="pad"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.pad">[docs]</a><span class="k">def</span> <span class="nf">pad</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"> Inlinefunc. Pads text to given width.</span>
<span class="sd"> Args:</span>
<span class="sd"> text (str, optional): Text to pad.</span>
<span class="sd"> width (str, optional): Will be converted to integer. Width</span>
<span class="sd"> of padding.</span>
<span class="sd"> align (str, optional): Alignment of padding; one of &#39;c&#39;, &#39;l&#39; or &#39;r&#39;.</span>
<span class="sd"> fillchar (str, optional): Character used for padding. Defaults to a</span>
<span class="sd"> space.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> session (Session): Session performing the pad.</span>
<span class="sd"> Example:</span>
<span class="sd"> `$pad(text, width, align, fillchar)`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">align</span><span class="p">,</span> <span class="n">fillchar</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="s2">&quot;c&quot;</span><span class="p">,</span> <span class="s2">&quot; &quot;</span>
<span class="n">nargs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">width</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">if</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="k">else</span> <span class="mi">78</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">align</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="k">if</span> <span class="n">args</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;c&quot;</span><span class="p">,</span> <span class="s2">&quot;l&quot;</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;c&quot;</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">:</span>
<span class="n">fillchar</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="k">return</span> <span class="n">utils</span><span class="o">.</span><span class="n">pad</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="n">align</span><span class="p">,</span> <span class="n">fillchar</span><span class="o">=</span><span class="n">fillchar</span><span class="p">)</span></div>
<div class="viewcode-block" id="crop"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.crop">[docs]</a><span class="k">def</span> <span class="nf">crop</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"> Inlinefunc. Crops ingoing text to given widths.</span>
<span class="sd"> Args:</span>
<span class="sd"> text (str, optional): Text to crop.</span>
<span class="sd"> width (str, optional): Will be converted to an integer. Width of</span>
<span class="sd"> crop in characters.</span>
<span class="sd"> suffix (str, optional): End string to mark the fact that a part</span>
<span class="sd"> of the string was cropped. Defaults to `[...]`.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> session (Session): Session performing the crop.</span>
<span class="sd"> Example:</span>
<span class="sd"> `$crop(text, width=78, suffix=&#39;[...]&#39;)`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">suffix</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="s2">&quot;[...]&quot;</span>
<span class="n">nargs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">width</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">if</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="k">else</span> <span class="mi">78</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">suffix</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="k">return</span> <span class="n">utils</span><span class="o">.</span><span class="n">crop</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">,</span> <span class="n">suffix</span><span class="o">=</span><span class="n">suffix</span><span class="p">)</span></div>
<div class="viewcode-block" id="space"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.space">[docs]</a><span class="k">def</span> <span class="nf">space</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"> Inlinefunc. Inserts an arbitrary number of spaces. Defaults to 4 spaces.</span>
<span class="sd"> Args:</span>
<span class="sd"> spaces (int, optional): The number of spaces to insert.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> session (Session): Session performing the crop.</span>
<span class="sd"> Example:</span>
<span class="sd"> `$space(20)`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">width</span> <span class="o">=</span> <span class="mi">4</span>
<span class="k">if</span> <span class="n">args</span><span class="p">:</span>
<span class="n">width</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> <span class="k">if</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="k">else</span> <span class="mi">4</span>
<span class="k">return</span> <span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="n">width</span></div>
<div class="viewcode-block" id="clr"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.clr">[docs]</a><span class="k">def</span> <span class="nf">clr</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"> Inlinefunc. Colorizes nested text.</span>
<span class="sd"> Args:</span>
<span class="sd"> startclr (str, optional): An ANSI color abbreviation without the</span>
<span class="sd"> prefix `|`, such as `r` (red foreground) or `[r` (red background).</span>
<span class="sd"> text (str, optional): Text</span>
<span class="sd"> endclr (str, optional): The color to use at the end of the string. Defaults</span>
<span class="sd"> to `|n` (reset-color).</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> session (Session): Session object triggering inlinefunc.</span>
<span class="sd"> Example:</span>
<span class="sd"> `$clr(startclr, text, endclr)`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">nargs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">color</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="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">&quot;|&quot;</span> <span class="o">+</span> <span class="n">color</span> <span class="o">+</span> <span class="n">text</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">text</span> <span class="o">+=</span> <span class="s2">&quot;|&quot;</span> <span class="o">+</span> <span class="n">args</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">text</span> <span class="o">+=</span> <span class="s2">&quot;|n&quot;</span>
<span class="k">return</span> <span class="n">text</span></div>
<div class="viewcode-block" id="null"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.null">[docs]</a><span class="k">def</span> <span class="nf">null</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">args</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span></div>
<div class="viewcode-block" id="nomatch"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.nomatch">[docs]</a><span class="k">def</span> <span class="nf">nomatch</span><span class="p">(</span><span class="n">name</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"> Default implementation of nomatch returns the function as-is as a string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;inlinefunc_stack_depth&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;session&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;$</span><span class="si">{name}</span><span class="s2">(</span><span class="si">{args}{kwargs}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
<span class="n">args</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</span><span class="p">),</span>
<span class="n">kwargs</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">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">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()),</span>
<span class="p">)</span></div>
<span class="n">_INLINE_FUNCS</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># we specify a default nomatch function to use if no matching func was</span>
<span class="c1"># found. This will be overloaded by any nomatch function defined in</span>
<span class="c1"># the imported modules.</span>
<span class="n">_DEFAULT_FUNCS</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;nomatch&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="s2">&quot;&lt;UNKNOWN&gt;&quot;</span><span class="p">,</span>
<span class="s2">&quot;stackfull&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> (not parsed: &quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">_INLINE_FUNCS</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">_DEFAULT_FUNCS</span><span class="p">)</span>
<span class="c1"># load custom inline func modules.</span>
<span class="k">for</span> <span class="n">module</span> <span class="ow">in</span> <span class="n">utils</span><span class="o">.</span><span class="n">make_iter</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">INLINEFUNC_MODULES</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">_INLINE_FUNCS</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">utils</span><span class="o">.</span><span class="n">callables_from_module</span><span class="p">(</span><span class="n">module</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">ImportError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">if</span> <span class="n">module</span> <span class="o">==</span> <span class="s2">&quot;server.conf.inlinefuncs&quot;</span><span class="p">:</span>
<span class="c1"># a temporary warning since the default module changed name</span>
<span class="k">raise</span> <span class="ne">ImportError</span><span class="p">(</span>
<span class="s2">&quot;Error: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">Possible reason: mygame/server/conf/inlinefunc.py should &quot;</span>
<span class="s2">&quot;be renamed to mygame/server/conf/inlinefuncs.py (note &quot;</span>
<span class="s2">&quot;the S at the end).&quot;</span> <span class="o">%</span> <span class="n">err</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<span class="c1"># regex definitions</span>
<span class="n">_RE_STARTTOKEN</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;(?&lt;!</span><span class="se">\\</span><span class="s2">)\$(\w+)\(&quot;</span><span class="p">)</span> <span class="c1"># unescaped $funcname( (start of function call)</span>
<span class="c1"># note: this regex can be experimented with at https://regex101.com/r/kGR3vE/2</span>
<span class="n">_RE_TOKEN</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> (?&lt;!\\)\&#39;\&#39;\&#39;(?P&lt;singlequote&gt;.*?)(?&lt;!\\)\&#39;\&#39;\&#39;| # single-triplets escape all inside</span>
<span class="sd"> (?&lt;!\\)\&quot;\&quot;\&quot;(?P&lt;doublequote&gt;.*?)(?&lt;!\\)\&quot;\&quot;\&quot;| # double-triplets escape all inside</span>
<span class="sd"> (?P&lt;comma&gt;(?&lt;!\\)\,)| # , (argument sep)</span>
<span class="sd"> (?P&lt;end&gt;(?&lt;!\\)\))| # ) (possible end of func call)</span>
<span class="sd"> (?P&lt;leftparens&gt;(?&lt;!\\)\()| # ( (lone left-parens)</span>
<span class="sd"> (?P&lt;start&gt;(?&lt;!\\)\$\w+\()| # $funcname (start of func call)</span>
<span class="sd"> (?P&lt;escaped&gt; # escaped tokens to re-insert sans backslash</span>
<span class="sd"> \\\&#39;|\\\&quot;|\\\)|\\\$\w+\(|\\\()|</span>
<span class="sd"> (?P&lt;rest&gt; # everything else to re-insert verbatim</span>
<span class="sd"> \$(?!\w+\()|\&#39;|\&quot;|\\|[^),$\&#39;\&quot;\\\(]+)&quot;&quot;&quot;</span><span class="p">,</span>
<span class="n">re</span><span class="o">.</span><span class="n">UNICODE</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">VERBOSE</span> <span class="o">|</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Cache for function lookups.</span>
<span class="n">_PARSING_CACHE</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">LimitedSizeOrderedDict</span><span class="p">(</span><span class="n">size_limit</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
<div class="viewcode-block" id="ParseStack"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.ParseStack">[docs]</a><span class="k">class</span> <span class="nc">ParseStack</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Custom stack that always concatenates strings together when the</span>
<span class="sd"> strings are added next to one another. Tuples are stored</span>
<span class="sd"> separately and None is used to mark that a string should be broken</span>
<span class="sd"> up into a new chunk. Below is the resulting stack after separately</span>
<span class="sd"> appending 3 strings, None, 2 strings, a tuple and finally 2</span>
<span class="sd"> strings:</span>
<span class="sd"> [string + string + string,</span>
<span class="sd"> None</span>
<span class="sd"> string + string,</span>
<span class="sd"> tuple,</span>
<span class="sd"> string + string]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="ParseStack.__init__"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.ParseStack.__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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># always start stack with the empty string</span>
<span class="nb">list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># indicates if the top of the stack is a string or not</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_string_last</span> <span class="o">=</span> <span class="kc">True</span></div>
<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="p">(</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__eq__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">&quot;_string_last&quot;</span><span class="p">)</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_string_last</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">_string_last</span>
<span class="p">)</span>
<span class="k">def</span> <span class="fm">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__eq__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<div class="viewcode-block" id="ParseStack.append"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.ParseStack.append">[docs]</a> <span class="k">def</span> <span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The stack will merge strings, add other things as normal</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">item</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_string_last</span><span class="p">:</span>
<span class="bp">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">item</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_string_last</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># everything else is added as normal</span>
<span class="nb">list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_string_last</span> <span class="o">=</span> <span class="kc">False</span></div></div>
<div class="viewcode-block" id="InlinefuncError"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.InlinefuncError">[docs]</a><span class="k">class</span> <span class="nc">InlinefuncError</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">):</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="parse_inlinefunc"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.parse_inlinefunc">[docs]</a><span class="k">def</span> <span class="nf">parse_inlinefunc</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">strip</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">available_funcs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">stacktrace</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parse the incoming string.</span>
<span class="sd"> Args:</span>
<span class="sd"> string (str): The incoming string to parse.</span>
<span class="sd"> strip (bool, optional): Whether to strip function calls rather than</span>
<span class="sd"> execute them.</span>
<span class="sd"> available_funcs (dict, optional): Define an alternative source of functions to parse for.</span>
<span class="sd"> If unset, use the functions found through `settings.INLINEFUNC_MODULES`.</span>
<span class="sd"> stacktrace (bool, optional): If set, print the stacktrace to log.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> session (Session): This is sent to this function by Evennia when triggering</span>
<span class="sd"> it. It is passed to the inlinefunc.</span>
<span class="sd"> kwargs (any): All other kwargs are also passed on to the inlinefunc.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_PARSING_CACHE</span>
<span class="n">usecache</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">available_funcs</span><span class="p">:</span>
<span class="n">available_funcs</span> <span class="o">=</span> <span class="n">_INLINE_FUNCS</span>
<span class="n">usecache</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># make sure the default keys are available, but also allow overriding</span>
<span class="n">tmp</span> <span class="o">=</span> <span class="n">_DEFAULT_FUNCS</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">tmp</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">available_funcs</span><span class="p">)</span>
<span class="n">available_funcs</span> <span class="o">=</span> <span class="n">tmp</span>
<span class="k">if</span> <span class="n">usecache</span> <span class="ow">and</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">_PARSING_CACHE</span><span class="p">:</span>
<span class="c1"># stack is already cached</span>
<span class="n">stack</span> <span class="o">=</span> <span class="n">_PARSING_CACHE</span><span class="p">[</span><span class="n">string</span><span class="p">]</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">_RE_STARTTOKEN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
<span class="c1"># if there are no unescaped start tokens at all, return immediately.</span>
<span class="k">return</span> <span class="n">string</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># no cached stack; build a new stack and continue</span>
<span class="n">stack</span> <span class="o">=</span> <span class="n">ParseStack</span><span class="p">()</span>
<span class="c1"># process string on stack</span>
<span class="n">ncallable</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">nlparens</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">nvalid</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">stacktrace</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="s2">&quot;STRING: </span><span class="si">{}</span><span class="s2"> =&gt;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_info</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">_RE_TOKEN</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
<span class="n">gdict</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groupdict</span><span class="p">()</span>
<span class="k">if</span> <span class="n">stacktrace</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="s2">&quot; MATCH: </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">key</span><span class="p">:</span> <span class="n">val</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">gdict</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">val</span><span class="p">})</span>
<span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_info</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
<span class="k">if</span> <span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;singlequote&quot;</span><span class="p">]:</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;singlequote&quot;</span><span class="p">])</span>
<span class="k">elif</span> <span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;doublequote&quot;</span><span class="p">]:</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;doublequote&quot;</span><span class="p">])</span>
<span class="k">elif</span> <span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;leftparens&quot;</span><span class="p">]:</span>
<span class="c1"># we have a left-parens inside a callable</span>
<span class="k">if</span> <span class="n">ncallable</span><span class="p">:</span>
<span class="n">nlparens</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;(&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;end&quot;</span><span class="p">]:</span>
<span class="k">if</span> <span class="n">nlparens</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">nlparens</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;)&quot;</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">ncallable</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;)&quot;</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="n">stack</span><span class="p">:</span>
<span class="n">operation</span> <span class="o">=</span> <span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">operation</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">strip</span><span class="p">:</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">operation</span><span class="p">,</span> <span class="p">[</span><span class="n">arg</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">args</span><span class="p">)]))</span>
<span class="n">ncallable</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">operation</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;start&quot;</span><span class="p">]:</span>
<span class="n">funcname</span> <span class="o">=</span> <span class="n">_RE_STARTTOKEN</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;start&quot;</span><span class="p">])</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># try to fetch the matching inlinefunc from storage</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">available_funcs</span><span class="p">[</span><span class="n">funcname</span><span class="p">])</span>
<span class="n">nvalid</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">available_funcs</span><span class="p">[</span><span class="s2">&quot;nomatch&quot;</span><span class="p">])</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">funcname</span><span class="p">)</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="n">ncallable</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;escaped&quot;</span><span class="p">]:</span>
<span class="c1"># escaped tokens</span>
<span class="n">token</span> <span class="o">=</span> <span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;escaped&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">lstrip</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="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;comma&quot;</span><span class="p">]:</span>
<span class="k">if</span> <span class="n">ncallable</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># commas outside strings and inside a callable are</span>
<span class="c1"># used to mark argument separation - we use None</span>
<span class="c1"># in the stack to indicate such a separation.</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># no callable active - just a string</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># the rest</span>
<span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">gdict</span><span class="p">[</span><span class="s2">&quot;rest&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">ncallable</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># this means not all inlinefuncs were complete</span>
<span class="k">return</span> <span class="n">string</span>
<span class="k">if</span> <span class="n">_STACK_MAXSIZE</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">_STACK_MAXSIZE</span> <span class="o">&lt;</span> <span class="n">nvalid</span><span class="p">:</span>
<span class="c1"># if stack is larger than limit, throw away parsing</span>
<span class="k">return</span> <span class="n">string</span> <span class="o">+</span> <span class="n">available_funcs</span><span class="p">[</span><span class="s2">&quot;stackfull&quot;</span><span class="p">](</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">usecache</span><span class="p">:</span>
<span class="c1"># cache the stack - we do this also if we don&#39;t check the cache above</span>
<span class="n">_PARSING_CACHE</span><span class="p">[</span><span class="n">string</span><span class="p">]</span> <span class="o">=</span> <span class="n">stack</span>
<span class="c1"># run the stack recursively</span>
<span class="k">def</span> <span class="nf">_run_stack</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">depth</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="n">retval</span> <span class="o">=</span> <span class="n">item</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="k">if</span> <span class="n">strip</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">func</span><span class="p">,</span> <span class="n">arglist</span> <span class="o">=</span> <span class="n">item</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">arglist</span><span class="p">:</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># an argument-separating comma - start a new arg</span>
<span class="n">args</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># all other args should merge into one string</span>
<span class="n">args</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">_run_stack</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">depth</span><span class="o">=</span><span class="n">depth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># execute the inlinefunc at this point or strip it.</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;inlinefunc_stack_depth&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">depth</span>
<span class="n">retval</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">strip</span> <span class="k">else</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">utils</span><span class="o">.</span><span class="n">to_str</span><span class="p">(</span><span class="n">retval</span><span class="p">)</span>
<span class="n">retval</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">_run_stack</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">stack</span><span class="p">)</span>
<span class="k">if</span> <span class="n">stacktrace</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="s2">&quot;STACK: </span><span class="se">\n</span><span class="si">{}</span><span class="s2"> =&gt; </span><span class="si">{}</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">stack</span><span class="p">,</span> <span class="n">retval</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_info</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
<span class="c1"># execute the stack</span>
<span class="k">return</span> <span class="n">retval</span></div>
<div class="viewcode-block" id="raw"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.raw">[docs]</a><span class="k">def</span> <span class="nf">raw</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Escape all inlinefuncs in a string so they won&#39;t get parsed.</span>
<span class="sd"> Args:</span>
<span class="sd"> string (str): String with inlinefuncs to escape.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_escape</span><span class="p">(</span><span class="n">match</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</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="mi">0</span><span class="p">)</span>
<span class="k">return</span> <span class="n">_RE_STARTTOKEN</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">_escape</span><span class="p">,</span> <span class="n">string</span><span class="p">)</span></div>
<span class="c1">#</span>
<span class="c1"># Nick templating</span>
<span class="c1">#</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">This supports the use of replacement templates in nicks:</span>
<span class="sd">This happens in two steps:</span>
<span class="sd">1) The user supplies a template that is converted to a regex according</span>
<span class="sd"> to the unix-like templating language.</span>
<span class="sd">2) This regex is tested against nicks depending on which nick replacement</span>
<span class="sd"> strategy is considered (most commonly inputline).</span>
<span class="sd">3) If there is a template match and there are templating markers,</span>
<span class="sd"> these are replaced with the arguments actually given.</span>
<span class="sd">@desc $1 $2 $3</span>
<span class="sd">This will be converted to the following regex:</span>
<span class="sd">\@desc (?P&lt;1&gt;\w+) (?P&lt;2&gt;\w+) $(?P&lt;3&gt;\w+)</span>
<span class="sd">Supported template markers (through fnmatch)</span>
<span class="sd"> * matches anything (non-greedy) -&gt; .*?</span>
<span class="sd"> ? matches any single character -&gt;</span>
<span class="sd"> [seq] matches any entry in sequence</span>
<span class="sd"> [!seq] matches entries not in sequence</span>
<span class="sd">Custom arg markers</span>
<span class="sd"> $N argument position (1-99)</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">_RE_NICK_ARG</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;</span><span class="se">\\</span><span class="s2">(\$)([1-9][0-9]?)&quot;</span><span class="p">)</span>
<span class="n">_RE_NICK_TEMPLATE_ARG</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;(\$)([1-9][0-9]?)&quot;</span><span class="p">)</span>
<span class="n">_RE_NICK_SPACE</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;</span><span class="se">\\</span><span class="s2"> &quot;</span><span class="p">)</span>
<div class="viewcode-block" id="NickTemplateInvalid"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.NickTemplateInvalid">[docs]</a><span class="k">class</span> <span class="nc">NickTemplateInvalid</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">):</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="initialize_nick_templates"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.initialize_nick_templates">[docs]</a><span class="k">def</span> <span class="nf">initialize_nick_templates</span><span class="p">(</span><span class="n">in_template</span><span class="p">,</span> <span class="n">out_template</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initialize the nick templates for matching and remapping a string.</span>
<span class="sd"> Args:</span>
<span class="sd"> in_template (str): The template to be used for nick recognition.</span>
<span class="sd"> out_template (str): The template to be used to replace the string</span>
<span class="sd"> matched by the in_template.</span>
<span class="sd"> Returns:</span>
<span class="sd"> regex (regex): Regex to match against strings</span>
<span class="sd"> template (str): Template with markers {arg1}, {arg2}, etc for</span>
<span class="sd"> replacement using the standard .format method.</span>
<span class="sd"> Raises:</span>
<span class="sd"> evennia.utils.inlinefuncs.NickTemplateInvalid: If the in/out template</span>
<span class="sd"> does not have a matching number of $args.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># create the regex for in_template</span>
<span class="n">regex_string</span> <span class="o">=</span> <span class="n">fnmatch</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="n">in_template</span><span class="p">)</span>
<span class="n">n_inargs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">_RE_NICK_ARG</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">regex_string</span><span class="p">))</span>
<span class="n">regex_string</span> <span class="o">=</span> <span class="n">_RE_NICK_SPACE</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;\s+&quot;</span><span class="p">,</span> <span class="n">regex_string</span><span class="p">)</span>
<span class="n">regex_string</span> <span class="o">=</span> <span class="n">_RE_NICK_ARG</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="k">lambda</span> <span class="n">m</span><span class="p">:</span> <span class="s2">&quot;(?P&lt;arg</span><span class="si">%s</span><span class="s2">&gt;.+?)&quot;</span> <span class="o">%</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="n">regex_string</span><span class="p">)</span>
<span class="c1"># create the out_template</span>
<span class="n">template_string</span> <span class="o">=</span> <span class="n">_RE_NICK_TEMPLATE_ARG</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="k">lambda</span> <span class="n">m</span><span class="p">:</span> <span class="s2">&quot;{arg</span><span class="si">%s</span><span class="s2">}&quot;</span> <span class="o">%</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="n">out_template</span><span class="p">)</span>
<span class="c1"># validate the tempaltes - they should at least have the same number of args</span>
<span class="n">n_outargs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">_RE_NICK_TEMPLATE_ARG</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">out_template</span><span class="p">))</span>
<span class="k">if</span> <span class="n">n_inargs</span> <span class="o">!=</span> <span class="n">n_outargs</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">NickTemplateInvalid</span>
<span class="k">return</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">regex_string</span><span class="p">),</span> <span class="n">template_string</span></div>
<div class="viewcode-block" id="parse_nick_template"><a class="viewcode-back" href="../../../api/evennia.utils.inlinefuncs.html#evennia.utils.inlinefuncs.parse_nick_template">[docs]</a><span class="k">def</span> <span class="nf">parse_nick_template</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">template_regex</span><span class="p">,</span> <span class="n">outtemplate</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parse a text using a template and map it to another template</span>
<span class="sd"> Args:</span>
<span class="sd"> string (str): The input string to processj</span>
<span class="sd"> template_regex (regex): A template regex created with</span>
<span class="sd"> initialize_nick_template.</span>
<span class="sd"> outtemplate (str): The template to which to map the matches</span>
<span class="sd"> produced by the template_regex. This should have $1, $2,</span>
<span class="sd"> etc to match the regex.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">template_regex</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">if</span> <span class="n">match</span><span class="p">:</span>
<span class="k">return</span> <span class="n">outtemplate</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">match</span><span class="o">.</span><span class="n">groupdict</span><span class="p">())</span>
<span class="k">return</span> <span class="n">string</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>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="inlinefuncs.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.utils.inlinefuncs</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

@ -62,6 +62,8 @@
<span class="kn">import</span> <span class="nn">importlib</span>
<span class="kn">import</span> <span class="nn">importlib.util</span>
<span class="kn">import</span> <span class="nn">importlib.machinery</span>
<span class="kn">from</span> <span class="nn">ast</span> <span class="kn">import</span> <span class="n">literal_eval</span>
<span class="kn">from</span> <span class="nn">simpleeval</span> <span class="kn">import</span> <span class="n">simple_eval</span>
<span class="kn">from</span> <span class="nn">unicodedata</span> <span class="kn">import</span> <span class="n">east_asian_width</span>
<span class="kn">from</span> <span class="nn">twisted.internet.task</span> <span class="kn">import</span> <span class="n">deferLater</span>
<span class="kn">from</span> <span class="nn">twisted.internet.defer</span> <span class="kn">import</span> <span class="n">returnValue</span> <span class="c1"># noqa - used as import target</span>
@ -1120,7 +1122,8 @@
<span class="sd"> store_key (tuple, optional): This is only used in combination with `stop` and</span>
<span class="sd"> should be the return given from the original `repeat` call. If this</span>
<span class="sd"> is given, all other args except `stop` are ignored.</span>
<span class="sd"> *args, **kwargs: Used as arguments to `callback`.</span>
<span class="sd"> *args: Used as arguments to `callback`.</span>
<span class="sd"> **kwargs: Keyword-arguments to pass to `callback`.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple or None: The tuple is the `store_key` - the identifier for the</span>
@ -1154,8 +1157,8 @@
<span class="sd"> Args:</span>
<span class="sd"> store_key (tuple): This is the return from `repeat`, used to uniquely</span>
<span class="sd"> identify the ticker to stop. Without the store_key, the ticker </span>
<span class="sd"> must be stopped by passing its parameters to `TICKER_HANDLER.remove` </span>
<span class="sd"> identify the ticker to stop. Without the store_key, the ticker</span>
<span class="sd"> must be stopped by passing its parameters to `TICKER_HANDLER.remove`</span>
<span class="sd"> directly.</span>
<span class="sd"> Returns:</span>
@ -2432,6 +2435,107 @@
<span class="k">return</span> <span class="n">ret</span>
<span class="k">return</span> <span class="n">decorator</span></div>
<div class="viewcode-block" id="safe_convert_to_types"><a class="viewcode-back" href="../../../api/evennia.utils.utils.html#evennia.contrib.tutorial_examples.red_button.safe_convert_to_types">[docs]</a><span class="k">def</span> <span class="nf">safe_convert_to_types</span><span class="p">(</span><span class="n">converters</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">raise_errors</span><span class="o">=</span><span class="kc">True</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"> Helper function to safely convert inputs to expected data types.</span>
<span class="sd"> Args:</span>
<span class="sd"> converters (tuple): A tuple `((converter, converter,...), {kwarg: converter, ...})` to</span>
<span class="sd"> match a converter to each element in `*args` and `**kwargs`.</span>
<span class="sd"> Each converter will will be called with the arg/kwarg-value as the only argument.</span>
<span class="sd"> If there are too few converters given, the others will simply not be converter. If the</span>
<span class="sd"> converter is given as the string &#39;py&#39;, it attempts to run</span>
<span class="sd"> `safe_eval`/`literal_eval` on the input arg or kwarg value. It&#39;s possible to</span>
<span class="sd"> skip the arg/kwarg part of the tuple, an empty tuple/dict will then be assumed.</span>
<span class="sd"> *args: The arguments to convert with `argtypes`.</span>
<span class="sd"> raise_errors (bool, optional): If set, raise any errors. This will</span>
<span class="sd"> abort the conversion at that arg/kwarg. Otherwise, just skip the</span>
<span class="sd"> conversion of the failing arg/kwarg. This will be set by the FuncParser if</span>
<span class="sd"> this is used as a part of a FuncParser callable.</span>
<span class="sd"> **kwargs: The kwargs to convert with `kwargtypes`</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: `(args, kwargs)` in converted form.</span>
<span class="sd"> Raises:</span>
<span class="sd"> utils.funcparser.ParsingError: If parsing failed in the `&#39;py&#39;`</span>
<span class="sd"> converter. This also makes this compatible with the FuncParser</span>
<span class="sd"> interface.</span>
<span class="sd"> any: Any other exception raised from other converters, if raise_errors is True.</span>
<span class="sd"> Notes:</span>
<span class="sd"> This function is often used to validate/convert input from untrusted sources. For</span>
<span class="sd"> security, the &quot;py&quot;-converter is deliberately limited and uses `safe_eval`/`literal_eval`</span>
<span class="sd"> which only supports simple expressions or simple containers with literals. NEVER</span>
<span class="sd"> use the python `eval` or `exec` methods as a converter for any untrusted input! Allowing</span>
<span class="sd"> untrusted sources to execute arbitrary python on your server is a severe security risk,</span>
<span class="sd"> Example:</span>
<span class="sd"> ::</span>
<span class="sd"> $funcname(1, 2, 3.0, c=[1,2,3])</span>
<span class="sd"> def _funcname(*args, **kwargs):</span>
<span class="sd"> args, kwargs = safe_convert_input(((int, int, float), {&#39;c&#39;: &#39;py&#39;}), *args, **kwargs)</span>
<span class="sd"> # ...</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_safe_eval</span><span class="p">(</span><span class="n">inp</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">inp</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="c1"># already converted</span>
<span class="k">return</span> <span class="n">inp</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">literal_eval</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">literal_err</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">err</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">simple_eval</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">simple_err</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">err</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="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">err</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">pass</span>
<span class="k">if</span> <span class="n">raise_errors</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.utils.funcparser</span> <span class="kn">import</span> <span class="n">ParsingError</span>
<span class="n">err</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Errors converting &#39;</span><span class="si">{</span><span class="n">inp</span><span class="si">}</span><span class="s2">&#39; to python:</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="sa">f</span><span class="s2">&quot;literal_eval raised </span><span class="si">{</span><span class="n">literal_err</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="sa">f</span><span class="s2">&quot;simple_eval raised </span><span class="si">{</span><span class="n">simple_err</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ParsingError</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="c1"># handle an incomplete/mixed set of input converters</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">converters</span><span class="p">:</span>
<span class="k">return</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="n">arg_converters</span><span class="p">,</span> <span class="o">*</span><span class="n">kwarg_converters</span> <span class="o">=</span> <span class="n">converters</span>
<span class="n">arg_converters</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">arg_converters</span><span class="p">)</span>
<span class="n">kwarg_converters</span> <span class="o">=</span> <span class="n">kwarg_converters</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">kwarg_converters</span> <span class="k">else</span> <span class="p">{}</span>
<span class="c1"># apply the converters</span>
<span class="k">if</span> <span class="n">args</span> <span class="ow">and</span> <span class="n">arg_converters</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="n">arg_converters</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">arg_converters</span><span class="p">)</span>
<span class="k">for</span> <span class="n">iarg</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">args</span><span class="p">[:</span><span class="nb">len</span><span class="p">(</span><span class="n">arg_converters</span><span class="p">)]):</span>
<span class="n">converter</span> <span class="o">=</span> <span class="n">arg_converters</span><span class="p">[</span><span class="n">iarg</span><span class="p">]</span>
<span class="n">converter</span> <span class="o">=</span> <span class="n">_safe_eval</span> <span class="k">if</span> <span class="n">converter</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;py&#39;</span><span class="p">,</span> <span class="s1">&#39;python&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="n">converter</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">args</span><span class="p">[</span><span class="n">iarg</span><span class="p">]</span> <span class="o">=</span> <span class="n">converter</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">if</span> <span class="n">raise_errors</span><span class="p">:</span>
<span class="k">raise</span>
<span class="n">args</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">kwarg_converters</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwarg_converters</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">converter</span> <span class="ow">in</span> <span class="n">kwarg_converters</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">converter</span> <span class="o">=</span> <span class="n">_safe_eval</span> <span class="k">if</span> <span class="n">converter</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;py&#39;</span><span class="p">,</span> <span class="s1">&#39;python&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="n">converter</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">{</span><span class="o">**</span><span class="n">kwargs</span><span class="p">}:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">converter</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">if</span> <span class="n">raise_errors</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">return</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span></div>
</pre></div>
<div class="clearer"></div>

View file

@ -0,0 +1,492 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.utils.verb_conjugation.conjugate &#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.utils.verb_conjugation.conjugate</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.utils.verb_conjugation.conjugate</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">English verb conjugation</span>
<span class="sd">Original Author: Tom De Smedt &lt;tomdesmedt@organisms.be&gt; of Nodebox</span>
<span class="sd">Refactored by Griatch 2021, for Evennia.</span>
<span class="sd">This is distributed under the GPL2 license. See ./LICENSE.txt for details.</span>
<span class="sd">The verb.txt morphology was adopted from the XTAG morph_englis.flat:</span>
<span class="sd">http://www.cis.upenn.edu/~xtag/</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="n">_VERBS_FILE</span> <span class="o">=</span> <span class="s2">&quot;verbs.txt&quot;</span>
<span class="c1"># Each verb and its tenses is a list in verbs.txt,</span>
<span class="c1"># indexed according to the following keys:</span>
<span class="c1"># the negated forms (for supported verbs) are ind+11.</span>
<span class="n">verb_tenses_keys</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;infinitive&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s2">&quot;1st singular present&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s2">&quot;2nd singular present&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
<span class="s2">&quot;3rd singular present&quot;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
<span class="s2">&quot;present plural&quot;</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>
<span class="s2">&quot;present participle&quot;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
<span class="s2">&quot;1st singular past&quot;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
<span class="s2">&quot;2nd singular past&quot;</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span>
<span class="s2">&quot;3rd singular past&quot;</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>
<span class="s2">&quot;past plural&quot;</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>
<span class="s2">&quot;past&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
<span class="s2">&quot;past participle&quot;</span><span class="p">:</span> <span class="mi">11</span><span class="p">,</span>
<span class="p">}</span>
<span class="c1"># allow to specify tenses with a shorter notation</span>
<span class="n">verb_tenses_aliases</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;inf&quot;</span><span class="p">:</span> <span class="s2">&quot;infinitive&quot;</span><span class="p">,</span>
<span class="s2">&quot;1sgpres&quot;</span><span class="p">:</span> <span class="s2">&quot;1st singular present&quot;</span><span class="p">,</span>
<span class="s2">&quot;2sgpres&quot;</span><span class="p">:</span> <span class="s2">&quot;2nd singular present&quot;</span><span class="p">,</span>
<span class="s2">&quot;3sgpres&quot;</span><span class="p">:</span> <span class="s2">&quot;3rd singular present&quot;</span><span class="p">,</span>
<span class="s2">&quot;pl&quot;</span><span class="p">:</span> <span class="s2">&quot;present plural&quot;</span><span class="p">,</span>
<span class="s2">&quot;prog&quot;</span><span class="p">:</span> <span class="s2">&quot;present participle&quot;</span><span class="p">,</span>
<span class="s2">&quot;1sgpast&quot;</span><span class="p">:</span> <span class="s2">&quot;1st singular past&quot;</span><span class="p">,</span>
<span class="s2">&quot;2sgpast&quot;</span><span class="p">:</span> <span class="s2">&quot;2nd singular past&quot;</span><span class="p">,</span>
<span class="s2">&quot;3sgpast&quot;</span><span class="p">:</span> <span class="s2">&quot;3rd singular past&quot;</span><span class="p">,</span>
<span class="s2">&quot;pastpl&quot;</span><span class="p">:</span> <span class="s2">&quot;past plural&quot;</span><span class="p">,</span>
<span class="s2">&quot;ppart&quot;</span><span class="p">:</span> <span class="s2">&quot;past participle&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="c1"># Each verb has morphs for infinitve,</span>
<span class="c1"># 3rd singular present, present participle,</span>
<span class="c1"># past and past participle.</span>
<span class="c1"># Verbs like &quot;be&quot; have other morphs as well</span>
<span class="c1"># (i.e. I am, you are, she is, they aren&#39;t)</span>
<span class="c1"># Additionally, the following verbs can be negated:</span>
<span class="c1"># be, can, do, will, must, have, may, need, dare, ought.</span>
<span class="c1"># load the conjugation forms from ./verbs.txt</span>
<span class="n">verb_tenses</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">path</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">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</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="n">_VERBS_FILE</span><span class="p">)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="k">as</span> <span class="n">fil</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">fil</span><span class="o">.</span><span class="n">readlines</span><span class="p">():</span>
<span class="n">wordlist</span> <span class="o">=</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">line</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">verb_tenses</span><span class="p">[</span><span class="n">wordlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">wordlist</span>
<span class="c1"># Each verb can be lemmatised:</span>
<span class="c1"># inflected morphs of the verb point</span>
<span class="c1"># to its infinitive in this dictionary.</span>
<span class="n">verb_lemmas</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">infinitive</span> <span class="ow">in</span> <span class="n">verb_tenses</span><span class="p">:</span>
<span class="k">for</span> <span class="n">tense</span> <span class="ow">in</span> <span class="n">verb_tenses</span><span class="p">[</span><span class="n">infinitive</span><span class="p">]:</span>
<span class="k">if</span> <span class="n">tense</span><span class="p">:</span>
<span class="n">verb_lemmas</span><span class="p">[</span><span class="n">tense</span><span class="p">]</span> <span class="o">=</span> <span class="n">infinitive</span>
<div class="viewcode-block" id="verb_infinitive"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_infinitive">[docs]</a><span class="k">def</span> <span class="nf">verb_infinitive</span><span class="p">(</span><span class="n">verb</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the uninflected form of the verb, like &#39;are&#39; -&gt; &#39;be&#39;</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to get the uninflected form of.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The uninflected verb form of `verb`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">verb_lemmas</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span></div>
<div class="viewcode-block" id="verb_conjugate"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_conjugate">[docs]</a><span class="k">def</span> <span class="nf">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">tense</span><span class="o">=</span><span class="s2">&quot;infinitive&quot;</span><span class="p">,</span> <span class="n">negate</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inflects the verb to the given tense.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The single verb to conjugate.</span>
<span class="sd"> tense (str): The tense to convert to. This can be given either as a long or short form</span>
<span class="sd"> - &quot;infinitive&quot; (&quot;inf&quot;) - be</span>
<span class="sd"> - &quot;1st/2nd/3rd singular present&quot; (&quot;1/2/3sgpres&quot;) - am/are/is</span>
<span class="sd"> - &quot;present plural&quot; (&quot;pl&quot;) - are</span>
<span class="sd"> - &quot;present participle&quot; (&quot;prog&quot;) - being</span>
<span class="sd"> - &quot;1st/2nd/3rd singular past&quot; (&quot;1/2/3sgpast&quot;) - was/were/was</span>
<span class="sd"> - &quot;past plural&quot; (&quot;pastpl&quot;) - were</span>
<span class="sd"> - &quot;past&quot; - were</span>
<span class="sd"> - &quot;past participle&quot; (&quot;ppart&quot;) - been</span>
<span class="sd"> negate (bool): Negates the verb. This only supported</span>
<span class="sd"> for a limited number of verbs: be, can, do, will, must, have, may,</span>
<span class="sd"> need, dare, ought.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The conjugated verb. If conjugation fails, the original verb is returned.</span>
<span class="sd"> Examples:</span>
<span class="sd"> The verb &#39;be&#39;:</span>
<span class="sd"> - present: I am, you are, she is,</span>
<span class="sd"> - present participle: being,</span>
<span class="sd"> - past: I was, you were, he was,</span>
<span class="sd"> - past participle: been,</span>
<span class="sd"> - negated present: I am not, you aren&#39;t, it isn&#39;t.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tense</span> <span class="o">=</span> <span class="n">verb_tenses_aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">tense</span><span class="p">,</span> <span class="n">tense</span><span class="p">)</span>
<span class="n">verb</span> <span class="o">=</span> <span class="n">verb_infinitive</span><span class="p">(</span><span class="n">verb</span><span class="p">)</span>
<span class="n">ind</span> <span class="o">=</span> <span class="n">verb_tenses_keys</span><span class="p">[</span><span class="n">tense</span><span class="p">]</span>
<span class="k">if</span> <span class="n">negate</span><span class="p">:</span>
<span class="n">ind</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">verb_tenses_keys</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">verb_tenses</span><span class="p">[</span><span class="n">verb</span><span class="p">][</span><span class="n">ind</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="c1"># TODO implement simple algorithm here with +s for certain tenses?</span>
<span class="k">return</span> <span class="n">verb</span></div>
<div class="viewcode-block" id="verb_present"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_present">[docs]</a><span class="k">def</span> <span class="nf">verb_present</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">negate</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inflects the verb in the present tense.</span>
<span class="sd"> Args:</span>
<span class="sd"> person (str or int): This can be 1, 2, 3, &quot;1st&quot;, &quot;2nd&quot;, &quot;3rd&quot;, &quot;plural&quot; or &quot;*&quot;.</span>
<span class="sd"> negate (bool): Some verbs like be, have, must, can be negated.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The present tense verb.</span>
<span class="sd"> Example:</span>
<span class="sd"> had -&gt; have</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">person</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">person</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;pl&quot;</span><span class="p">,</span> <span class="s2">&quot;*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;stndrgural&quot;</span><span class="p">)</span>
<span class="n">mapping</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;1&quot;</span><span class="p">:</span> <span class="s2">&quot;1st singular present&quot;</span><span class="p">,</span>
<span class="s2">&quot;2&quot;</span><span class="p">:</span> <span class="s2">&quot;2nd singular present&quot;</span><span class="p">,</span>
<span class="s2">&quot;3&quot;</span><span class="p">:</span> <span class="s2">&quot;3rd singular present&quot;</span><span class="p">,</span>
<span class="s2">&quot;*&quot;</span><span class="p">:</span> <span class="s2">&quot;present plural&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">mapping</span> <span class="ow">and</span> <span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">mapping</span><span class="p">[</span><span class="n">person</span><span class="p">],</span> <span class="n">negate</span><span class="p">)</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">mapping</span><span class="p">[</span><span class="n">person</span><span class="p">],</span> <span class="n">negate</span><span class="p">)</span>
<span class="k">return</span> <span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="s2">&quot;infinitive&quot;</span><span class="p">,</span> <span class="n">negate</span><span class="p">)</span></div>
<div class="viewcode-block" id="verb_present_participle"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_present_participle">[docs]</a><span class="k">def</span> <span class="nf">verb_present_participle</span><span class="p">(</span><span class="n">verb</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inflects the verb in the present participle.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to inflect.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The inflected verb.</span>
<span class="sd"> Examples:</span>
<span class="sd"> give -&gt; giving, be -&gt; being, swim -&gt; swimming</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="s2">&quot;present participle&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="verb_past"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_past">[docs]</a><span class="k">def</span> <span class="nf">verb_past</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">negate</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inflects the verb in the past tense.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to inflect.</span>
<span class="sd"> person (str, optional): The person can be specified with 1, 2, 3,</span>
<span class="sd"> &quot;1st&quot;, &quot;2nd&quot;, &quot;3rd&quot;, &quot;plural&quot;, &quot;*&quot;.</span>
<span class="sd"> negate (bool, optional): Some verbs like be, have, must, can be negated.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The inflected verb.</span>
<span class="sd"> Examples:</span>
<span class="sd"> give -&gt; gave, be -&gt; was, swim -&gt; swam</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">person</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">person</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;pl&quot;</span><span class="p">,</span> <span class="s2">&quot;*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;stndrgural&quot;</span><span class="p">)</span>
<span class="n">mapping</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;1&quot;</span><span class="p">:</span> <span class="s2">&quot;1st singular past&quot;</span><span class="p">,</span>
<span class="s2">&quot;2&quot;</span><span class="p">:</span> <span class="s2">&quot;2nd singular past&quot;</span><span class="p">,</span>
<span class="s2">&quot;3&quot;</span><span class="p">:</span> <span class="s2">&quot;3rd singular past&quot;</span><span class="p">,</span>
<span class="s2">&quot;*&quot;</span><span class="p">:</span> <span class="s2">&quot;past plural&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">mapping</span> <span class="ow">and</span> <span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">mapping</span><span class="p">[</span><span class="n">person</span><span class="p">],</span> <span class="n">negate</span><span class="p">)</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">mapping</span><span class="p">[</span><span class="n">person</span><span class="p">],</span> <span class="n">negate</span><span class="p">)</span>
<span class="k">return</span> <span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="s2">&quot;past&quot;</span><span class="p">,</span> <span class="n">negate</span><span class="o">=</span><span class="n">negate</span><span class="p">)</span></div>
<div class="viewcode-block" id="verb_past_participle"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_past_participle">[docs]</a><span class="k">def</span> <span class="nf">verb_past_participle</span><span class="p">(</span><span class="n">verb</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inflects the verb in the present participle.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to inflect.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The inflected verb.</span>
<span class="sd"> Examples:</span>
<span class="sd"> give -&gt; given, be -&gt; been, swim -&gt; swum</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="s2">&quot;past participle&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="verb_all_tenses"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_all_tenses">[docs]</a><span class="k">def</span> <span class="nf">verb_all_tenses</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get all all possible verb tenses.</span>
<span class="sd"> Returns:</span>
<span class="sd"> list: A list if string names.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">verb_tenses_keys</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span></div>
<div class="viewcode-block" id="verb_tense"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_tense">[docs]</a><span class="k">def</span> <span class="nf">verb_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns a string from verb_tenses_keys representing the verb&#39;s tense.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to check the tense of.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The tense.</span>
<span class="sd"> Example:</span>
<span class="sd"> given -&gt; &quot;past participle&quot;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">infinitive</span> <span class="o">=</span> <span class="n">verb_infinitive</span><span class="p">(</span><span class="n">verb</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">verb_tenses</span><span class="p">[</span><span class="n">infinitive</span><span class="p">]</span>
<span class="k">for</span> <span class="n">tense</span> <span class="ow">in</span> <span class="n">verb_tenses_keys</span><span class="p">:</span>
<span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="n">verb_tenses_keys</span><span class="p">[</span><span class="n">tense</span><span class="p">]]</span> <span class="o">==</span> <span class="n">verb</span><span class="p">:</span>
<span class="k">return</span> <span class="n">tense</span>
<span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="n">verb_tenses_keys</span><span class="p">[</span><span class="n">tense</span><span class="p">]</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">verb_tenses_keys</span><span class="p">)]</span> <span class="o">==</span> <span class="n">verb</span><span class="p">:</span>
<span class="k">return</span> <span class="n">tense</span></div>
<div class="viewcode-block" id="verb_is_tense"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_is_tense">[docs]</a><span class="k">def</span> <span class="nf">verb_is_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">tense</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks whether the verb is in the given tense.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to check.</span>
<span class="sd"> tense (str): The tense to check.</span>
<span class="sd"> Return:</span>
<span class="sd"> bool: If verb matches given tense.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tense</span> <span class="o">=</span> <span class="n">verb_tenses_aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">tense</span><span class="p">,</span> <span class="n">tense</span><span class="p">)</span>
<span class="k">return</span> <span class="n">verb_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">)</span> <span class="o">==</span> <span class="n">tense</span></div>
<div class="viewcode-block" id="verb_is_present"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_is_present">[docs]</a><span class="k">def</span> <span class="nf">verb_is_present</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">negated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks whether the verb is in the present tense.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to check.</span>
<span class="sd"> person (str): Check which person.</span>
<span class="sd"> negated (bool): Check if verb was negated.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: If verb was in present tense.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">person</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">person</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">,</span> <span class="s2">&quot;plural&quot;</span><span class="p">)</span>
<span class="n">tense</span> <span class="o">=</span> <span class="n">verb_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tense</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;present&quot;</span> <span class="ow">in</span> <span class="n">tense</span> <span class="ow">and</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">tense</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">negated</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="s2">&quot;n&#39;t&quot;</span> <span class="ow">in</span> <span class="n">verb</span> <span class="ow">or</span> <span class="s2">&quot; not&quot;</span> <span class="ow">in</span> <span class="n">verb</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="verb_is_present_participle"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_is_present_participle">[docs]</a><span class="k">def</span> <span class="nf">verb_is_present_participle</span><span class="p">(</span><span class="n">verb</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks whether the verb is in present participle.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to check.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: Result of check.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tense</span> <span class="o">=</span> <span class="n">verb_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">)</span>
<span class="k">return</span> <span class="n">tense</span> <span class="o">==</span> <span class="s2">&quot;present participle&quot;</span></div>
<div class="viewcode-block" id="verb_is_past"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_is_past">[docs]</a><span class="k">def</span> <span class="nf">verb_is_past</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">negated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks whether the verb is in the past tense.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to check.</span>
<span class="sd"> person (str): The person to check.</span>
<span class="sd"> negated (bool): Check if verb is negated.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: Result of check.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">person</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">person</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">,</span> <span class="s2">&quot;plural&quot;</span><span class="p">)</span>
<span class="n">tense</span> <span class="o">=</span> <span class="n">verb_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tense</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;past&quot;</span> <span class="ow">in</span> <span class="n">tense</span> <span class="ow">and</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">tense</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">negated</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="s2">&quot;n&#39;t&quot;</span> <span class="ow">in</span> <span class="n">verb</span> <span class="ow">or</span> <span class="s2">&quot; not&quot;</span> <span class="ow">in</span> <span class="n">verb</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="verb_is_past_participle"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_is_past_participle">[docs]</a><span class="k">def</span> <span class="nf">verb_is_past_participle</span><span class="p">(</span><span class="n">verb</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Checks whether the verb is in past participle.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to check.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: The result of the check.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tense</span> <span class="o">=</span> <span class="n">verb_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">)</span>
<span class="k">return</span> <span class="n">tense</span> <span class="o">==</span> <span class="s2">&quot;past participle&quot;</span></div>
<div class="viewcode-block" id="verb_actor_stance_components"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.conjugate.html#evennia.utils.verb_conjugation.conjugate.verb_actor_stance_components">[docs]</a><span class="k">def</span> <span class="nf">verb_actor_stance_components</span><span class="p">(</span><span class="n">verb</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Figure out actor stance components of a verb.</span>
<span class="sd"> Args:</span>
<span class="sd"> verb (str): The verb to analyze</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: The 2nd person (you) and 3rd person forms of the verb,</span>
<span class="sd"> in the same tense as the ingoing verb.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tense</span> <span class="o">=</span> <span class="n">verb_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;participle&quot;</span> <span class="ow">in</span> <span class="n">tense</span> <span class="ow">or</span> <span class="s2">&quot;plural&quot;</span> <span class="ow">in</span> <span class="n">tense</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">verb</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tense</span> <span class="o">==</span> <span class="s2">&quot;infinitive&quot;</span> <span class="ow">or</span> <span class="s2">&quot;present&quot;</span> <span class="ow">in</span> <span class="n">tense</span><span class="p">:</span>
<span class="n">you_str</span> <span class="o">=</span> <span class="n">verb_present</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="s2">&quot;2&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">verb</span>
<span class="n">them_str</span> <span class="o">=</span> <span class="n">verb_present</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="s2">&quot;3&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">verb</span> <span class="o">+</span> <span class="s2">&quot;s&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">you_str</span> <span class="o">=</span> <span class="n">verb_past</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="s2">&quot;2&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">verb</span>
<span class="n">them_str</span> <span class="o">=</span> <span class="n">verb_past</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="s2">&quot;3&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">verb</span> <span class="o">+</span> <span class="s2">&quot;s&quot;</span>
<span class="k">return</span> <span class="p">(</span><span class="n">you_str</span><span class="p">,</span> <span class="n">them_str</span><span class="p">)</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>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="conjugate.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.utils.verb_conjugation.conjugate</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

@ -0,0 +1,346 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.utils.verb_conjugation.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.utils.verb_conjugation.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.utils.verb_conjugation.tests</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Unit tests for verb conjugation.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">parameterized</span> <span class="kn">import</span> <span class="n">parameterized</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">.</span> <span class="kn">import</span> <span class="n">conjugate</span>
<div class="viewcode-block" id="TestVerbConjugate"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.tests.html#evennia.utils.verb_conjugation.tests.TestVerbConjugate">[docs]</a><span class="k">class</span> <span class="nc">TestVerbConjugate</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 conjugation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;be&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="s2">&quot;do&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;be&quot;</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_infinitive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the infinite-getter.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_infinitive</span><span class="p">(</span><span class="n">verb</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;be&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="s2">&quot;do&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;be&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;2sgpres&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;are&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;3sgpres&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;is&quot;</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_conjugate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tense</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test conjugation for different tenses.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_conjugate</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">tense</span><span class="o">=</span><span class="n">tense</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="s2">&quot;do&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;2nd&quot;</span><span class="p">,</span> <span class="s2">&quot;were&quot;</span><span class="p">,</span> <span class="s2">&quot;are&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;3rd&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;is&quot;</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_present</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">person</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the present.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_present</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="n">person</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="s2">&quot;having&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="s2">&quot;swimming&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="s2">&quot;giving&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="s2">&quot;giving&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;being&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="s2">&quot;doing&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;being&quot;</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_present_participle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the present_participle</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_present_participle</span><span class="p">(</span><span class="n">verb</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="s2">&quot;had&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="s2">&quot;swam&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="s2">&quot;gave&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="s2">&quot;gave&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;was&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="s2">&quot;did&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;was&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;2nd&quot;</span><span class="p">,</span> <span class="s2">&quot;were&quot;</span><span class="p">,</span> <span class="s2">&quot;were&quot;</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_past</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">person</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the past getter.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_past</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="n">person</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="s2">&quot;had&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="s2">&quot;swum&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;been&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="s2">&quot;done&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;been&quot;</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_past_participle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the past participle.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_past_participle</span><span class="p">(</span><span class="n">verb</span><span class="p">))</span>
<div class="viewcode-block" id="TestVerbConjugate.test_verb_get_all_tenses"><a class="viewcode-back" href="../../../../api/evennia.utils.verb_conjugation.tests.html#evennia.utils.verb_conjugation.tests.TestVerbConjugate.test_verb_get_all_tenses">[docs]</a> <span class="k">def</span> <span class="nf">test_verb_get_all_tenses</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 getting all tenses.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">conjugate</span><span class="o">.</span><span class="n">verb_tenses_keys</span><span class="o">.</span><span class="n">keys</span><span class="p">()),</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_all_tenses</span><span class="p">())</span></div>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="s2">&quot;infinitive&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="s2">&quot;infinitive&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="s2">&quot;infinitive&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="s2">&quot;past participle&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="s2">&quot;1st singular present&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="s2">&quot;present participle&quot;</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;2nd singular present&quot;</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_tense</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the tense retriever.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">,</span> <span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_is_tense</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tense</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the tense-checker</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_is_tense</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">tense</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;had&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_is_present</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">person</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the tense-checker</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_is_present</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="n">person</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_is_present_participle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the tense-checker</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_is_present_participle</span><span class="p">(</span><span class="n">verb</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;swim&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;1st&quot;</span><span class="p">,</span> <span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;2nd&quot;</span><span class="p">,</span> <span class="s2">&quot;were&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_is_past</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">person</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the tense-checker</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_is_past</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">person</span><span class="o">=</span><span class="n">person</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;swimming&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">(</span><span class="s2">&quot;had&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_is_past_participle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the tense-checker</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_is_past_participle</span><span class="p">(</span><span class="n">verb</span><span class="p">))</span>
<span class="nd">@parameterized</span><span class="o">.</span><span class="n">expand</span><span class="p">([</span>
<span class="p">(</span><span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;have&quot;</span><span class="p">,</span> <span class="s2">&quot;has&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;swimming&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;swimming&quot;</span><span class="p">,</span> <span class="s2">&quot;swimming&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;give&quot;</span><span class="p">,</span> <span class="s2">&quot;gives&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;given&quot;</span><span class="p">,</span> <span class="s2">&quot;given&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;am&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;is&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;doing&quot;</span><span class="p">,</span> <span class="s2">&quot;doing&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;are&quot;</span><span class="p">,</span> <span class="s2">&quot;is&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;had&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;had&quot;</span><span class="p">,</span> <span class="s2">&quot;had&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;grin&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;grin&quot;</span><span class="p">,</span> <span class="s2">&quot;grins&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;smile&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;smile&quot;</span><span class="p">,</span> <span class="s2">&quot;smiles&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;vex&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;vex&quot;</span><span class="p">,</span> <span class="s2">&quot;vexes&quot;</span><span class="p">)),</span>
<span class="p">(</span><span class="s2">&quot;thrust&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;thrust&quot;</span><span class="p">,</span> <span class="s2">&quot;thrusts&quot;</span><span class="p">)),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_verb_actor_stance_components</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">expected</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the tense-checker</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">conjugate</span><span class="o">.</span><span class="n">verb_actor_stance_components</span><span class="p">(</span><span class="n">verb</span><span class="p">))</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>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<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.utils.verb_conjugation.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

@ -217,11 +217,11 @@
<li><a href="evennia/utils/evmenu.html">evennia.utils.evmenu</a></li>
<li><a href="evennia/utils/evmore.html">evennia.utils.evmore</a></li>
<li><a href="evennia/utils/evtable.html">evennia.utils.evtable</a></li>
<li><a href="evennia/utils/funcparser.html">evennia.utils.funcparser</a></li>
<li><a href="evennia/utils/gametime.html">evennia.utils.gametime</a></li>
<li><a href="evennia/utils/idmapper/manager.html">evennia.utils.idmapper.manager</a></li>
<li><a href="evennia/utils/idmapper/models.html">evennia.utils.idmapper.models</a></li>
<li><a href="evennia/utils/idmapper/tests.html">evennia.utils.idmapper.tests</a></li>
<li><a href="evennia/utils/inlinefuncs.html">evennia.utils.inlinefuncs</a></li>
<li><a href="evennia/utils/logger.html">evennia.utils.logger</a></li>
<li><a href="evennia/utils/optionclasses.html">evennia.utils.optionclasses</a></li>
<li><a href="evennia/utils/optionhandler.html">evennia.utils.optionhandler</a></li>
@ -231,6 +231,8 @@
<li><a href="evennia/utils/text2html.html">evennia.utils.text2html</a></li>
<li><a href="evennia/utils/utils.html">evennia.utils.utils</a></li>
<li><a href="evennia/utils/validatorfuncs.html">evennia.utils.validatorfuncs</a></li>
<li><a href="evennia/utils/verb_conjugation/conjugate.html">evennia.utils.verb_conjugation.conjugate</a></li>
<li><a href="evennia/utils/verb_conjugation/tests.html">evennia.utils.verb_conjugation.tests</a></li>
<li><a href="evennia/web/api/filters.html">evennia.web.api.filters</a></li>
<li><a href="evennia/web/api/permissions.html">evennia.web.api.permissions</a></li>
<li><a href="evennia/web/api/serializers.html">evennia.web.api.serializers</a></li>