Updated HTML docs

This commit is contained in:
Griatch 2021-08-22 20:36:28 +02:00
parent 5e89a10cbf
commit 40b2ba0cee
74 changed files with 627 additions and 363 deletions

View file

@ -65,16 +65,24 @@
<span class="c1"># the typeclass inherits from the XYZRoom (or XYZExit)</span>
<span class="c1"># if adding the evennia.contrib.xyzgrid.prototypes to</span>
<span class="c1"># settings.PROTOTYPE_MODULES, one could just set the</span>
<span class="c1"># prototype_parent to &#39;xyz_room&#39; and &#39;xyz_exit&#39; respectively</span>
<span class="c1"># prototype_parent to &#39;xyz_room&#39; and &#39;xyz_exit&#39; here</span>
<span class="c1"># instead.</span>
<span class="n">PARENT</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">ROOM_PARENT</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;An empty room&quot;</span><span class="p">,</span>
<span class="s2">&quot;prototype_key&quot;</span><span class="p">:</span> <span class="s2">&quot;xyzmap_room_map1&quot;</span><span class="p">,</span>
<span class="s2">&quot;prototype_key&quot;</span><span class="p">:</span> <span class="s2">&quot;xyz_exit_prototype&quot;</span><span class="p">,</span>
<span class="c1"># &quot;prototype_parent&quot;: &quot;xyz_room&quot;,</span>
<span class="s2">&quot;typeclass&quot;</span><span class="p">:</span> <span class="s2">&quot;evennia.contrib.xyzgrid.xyzroom.XYZRoom&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;An empty room.&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">EXIT_PARENT</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;prototype_key&quot;</span><span class="p">:</span> <span class="s2">&quot;xyz_exit_prototype&quot;</span><span class="p">,</span>
<span class="c1"># &quot;prototype_parent&quot;: &quot;xyz_exit&quot;,</span>
<span class="s2">&quot;typeclass&quot;</span><span class="p">:</span> <span class="s2">&quot;evennia.contrib.xyzgrid.xyzroom.XYZExit&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A path to the next location.&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="c1"># ---------------------------------------- map1</span>
<span class="c1"># The large tree</span>
@ -176,13 +184,17 @@
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;These branches are wide enough to easily walk on. There&#39;s green all around.&quot;</span>
<span class="p">},</span>
<span class="c1"># directional prototypes</span>
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">):</span> <span class="p">{</span>
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;e&#39;</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A dark passage into the underworld.&quot;</span>
<span class="p">},</span>
<span class="p">}</span>
<span class="k">for</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">PROTOTYPES_MAP1</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">prot</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">PARENT</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">PROTOTYPES_MAP1</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="c1"># we don&#39;t want to give exits the room typeclass!</span>
<span class="n">prot</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ROOM_PARENT</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">prot</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">EXIT_PARENT</span>
<span class="n">XYMAP_DATA_MAP1</span> <span class="o">=</span> <span class="p">{</span>
@ -295,8 +307,12 @@
<span class="c1"># this is required by the prototypes, but we add it all at once so we don&#39;t</span>
<span class="c1"># need to add it to every line above</span>
<span class="k">for</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">PROTOTYPES_MAP2</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">prot</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">PARENT</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">PROTOTYPES_MAP2</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="c1"># we don&#39;t want to give exits the room typeclass!</span>
<span class="n">prot</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ROOM_PARENT</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">prot</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">EXIT_PARENT</span>
<span class="n">XYMAP_DATA_MAP2</span> <span class="o">=</span> <span class="p">{</span>

View file

@ -60,9 +60,11 @@
<span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">join</span> <span class="k">as</span> <span class="n">pathjoin</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">import</span> <span class="nn">evennia</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">ansi</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.xyzgrid.xyzgrid</span> <span class="kn">import</span> <span class="n">get_xyzgrid</span>
<span class="n">_HELP_SHORT</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">evennia xyzgrid help | list | init | add | spawn | initpath | delete [&lt;options&gt;]</span>
<span class="s2"> Manages the XYZ grid. Use &#39;xyzgrid help &lt;option&gt;&#39; for documentation.</span>
@ -203,6 +205,8 @@
<span class="s2">&quot;delete&quot;</span><span class="p">:</span> <span class="n">_HELP_DELETE</span>
<span class="p">}</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">_init</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_option_help</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Show help &lt;command&gt; aid.</span>

View file

@ -1099,19 +1099,21 @@
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">edge</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="p">(</span><span class="n">l1</span> <span class="o">+</span> <span class="n">l2</span><span class="p">)</span> <span class="o">*</span> <span class="n">Ysize</span><span class="si">}{</span><span class="n">l1</span><span class="si">}</span><span class="se">\n\n</span><span class="si">{</span><span class="n">edge</span><span class="si">}</span><span class="s2">&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="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="mf">0.01</span><span class="p">),</span>
<span class="p">((</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span> <span class="mi">1</span><span class="p">),</span>
<span class="p">((</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="mf">0.03</span><span class="p">),</span>
<span class="p">((</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span> <span class="mi">5</span><span class="p">),</span>
<span class="p">])</span>
<span class="k">def</span> <span class="nf">test_grid_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gridsize</span><span class="p">,</span> <span class="n">max_time</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test of grid-creataion performance for Nx, Ny grid.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># import cProfile</span>
<span class="n">Xmax</span><span class="p">,</span> <span class="n">Ymax</span> <span class="o">=</span> <span class="n">gridsize</span>
<span class="n">grid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_grid</span><span class="p">(</span><span class="n">Xmax</span><span class="p">,</span> <span class="n">Ymax</span><span class="p">)</span>
<span class="n">t0</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="n">mapobj</span> <span class="o">=</span> <span class="n">xymap</span><span class="o">.</span><span class="n">XYMap</span><span class="p">({</span><span class="s1">&#39;map&#39;</span><span class="p">:</span> <span class="n">grid</span><span class="p">},</span> <span class="n">Z</span><span class="o">=</span><span class="s2">&quot;testmap&quot;</span><span class="p">)</span>
<span class="n">t0</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="n">mapobj</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="c1"># cProfile.runctx(&#39;mapobj.parse()&#39;, globals(), locals())</span>
<span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertLess</span><span class="p">(</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t0</span><span class="p">,</span> <span class="n">max_time</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;Map creation of (</span><span class="si">{</span><span class="n">Xmax</span><span class="si">}</span><span class="s2">x</span><span class="si">{</span><span class="n">Ymax</span><span class="si">}</span><span class="s2">) grid slower &quot;</span>
<span class="sa">f</span><span class="s2">&quot;than expected </span><span class="si">{</span><span class="n">max_time</span><span class="si">}</span><span class="s2">s.&quot;</span><span class="p">)</span>

View file

@ -151,10 +151,15 @@
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">variable_from_module</span><span class="p">,</span> <span class="n">mod_import</span><span class="p">,</span> <span class="n">is_iter</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.prototypes</span> <span class="kn">import</span> <span class="n">prototypes</span> <span class="k">as</span> <span class="n">protlib</span>
<span class="kn">from</span> <span class="nn">evennia.prototypes.spawner</span> <span class="kn">import</span> <span class="n">flatten_prototype</span>
<span class="kn">from</span> <span class="nn">.utils</span> <span class="kn">import</span> <span class="n">MapError</span><span class="p">,</span> <span class="n">MapParserError</span><span class="p">,</span> <span class="n">BIGVAL</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">xymap_legend</span>
<span class="n">_NO_DB_PROTOTYPES</span> <span class="o">=</span> <span class="kc">True</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;XYZGRID_USE_DB_PROTOTYPES&quot;</span><span class="p">):</span>
<span class="n">_NO_DB_PROTOTYPES</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">settings</span><span class="o">.</span><span class="n">XYZGRID_USE_DB_PROTOTYPES</span>
<span class="n">_CACHE_DIR</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CACHE_DIR</span>
<span class="n">_LOADED_PROTOTYPES</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_XYZROOMCLASS</span> <span class="o">=</span> <span class="kc">None</span>
@ -393,8 +398,9 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c1"># nothing more to do</span>
<span class="k">continue</span>
<span class="c1"># we need to load the prototype dict onto each for ease of access</span>
<span class="n">proto</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">require_single</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># we need to load the prototype dict onto each for ease of access. Note that</span>
<span class="n">proto</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">require_single</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">no_db</span><span class="o">=</span><span class="n">_NO_DB_PROTOTYPES</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">node_or_link_class</span><span class="o">.</span><span class="n">prototype</span> <span class="o">=</span> <span class="n">proto</span></div>
<div class="viewcode-block" id="XYMap.parse"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xymap.html#evennia.contrib.xyzgrid.xymap.XYMap.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -534,13 +540,24 @@
<span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">prototype</span><span class="p">:</span>
<span class="n">node_coord</span> <span class="o">=</span> <span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">X</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">Y</span><span class="p">)</span>
<span class="c1"># load prototype from override, or use default</span>
<span class="n">node</span><span class="o">.</span><span class="n">prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prototypes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="n">node_coord</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">prototypes</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span> <span class="n">node</span><span class="o">.</span><span class="n">prototype</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">node</span><span class="o">.</span><span class="n">prototype</span> <span class="o">=</span> <span class="n">flatten_prototype</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prototypes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="n">node_coord</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prototypes</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span> <span class="n">node</span><span class="o">.</span><span class="n">prototype</span><span class="p">)),</span>
<span class="n">no_db</span><span class="o">=</span><span class="n">_NO_DB_PROTOTYPES</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="k">raise</span> <span class="n">MapParserError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Room prototype malformed: </span><span class="si">{</span><span class="n">err</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span>
<span class="c1"># do the same for links (x, y, direction) coords</span>
<span class="k">for</span> <span class="n">direction</span><span class="p">,</span> <span class="n">maplink</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">first_links</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">maplink</span><span class="o">.</span><span class="n">prototype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prototypes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="n">node_coord</span> <span class="o">+</span> <span class="p">(</span><span class="n">direction</span><span class="p">,),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prototypes</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span> <span class="n">maplink</span><span class="o">.</span><span class="n">prototype</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">maplink</span><span class="o">.</span><span class="n">prototype</span> <span class="o">=</span> <span class="n">flatten_prototype</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prototypes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="n">node_coord</span> <span class="o">+</span> <span class="p">(</span><span class="n">direction</span><span class="p">,),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prototypes</span><span class="o">.</span><span class="n">get</span><span class="p">((</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span> <span class="n">maplink</span><span class="o">.</span><span class="n">prototype</span><span class="p">)),</span>
<span class="n">no_db</span><span class="o">=</span><span class="n">_NO_DB_PROTOTYPES</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="k">raise</span> <span class="n">MapParserError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Exit prototype malformed: </span><span class="si">{</span><span class="n">err</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">maplink</span><span class="p">)</span>
<span class="c1"># store</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display_map</span> <span class="o">=</span> <span class="n">display_map</span></div>
@ -667,8 +684,8 @@
<span class="n">spawned</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># find existing nodes, in case some rooms need to be removed</span>
<span class="n">map_coords</span> <span class="o">=</span> <span class="p">((</span><span class="n">node</span><span class="o">.</span><span class="n">X</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">Y</span><span class="p">)</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span>
<span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node_index_map</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="p">(</span><span class="n">n</span><span class="o">.</span><span class="n">Y</span><span class="p">,</span> <span class="n">n</span><span class="o">.</span><span class="n">X</span><span class="p">)))</span>
<span class="n">map_coords</span> <span class="o">=</span> <span class="p">[(</span><span class="n">node</span><span class="o">.</span><span class="n">X</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">Y</span><span class="p">)</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span>
<span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">node_index_map</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="p">(</span><span class="n">n</span><span class="o">.</span><span class="n">Y</span><span class="p">,</span> <span class="n">n</span><span class="o">.</span><span class="n">X</span><span class="p">))]</span>
<span class="k">for</span> <span class="n">existing_room</span> <span class="ow">in</span> <span class="n">_XYZROOMCLASS</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">Z</span><span class="p">)):</span>
<span class="n">roomX</span><span class="p">,</span> <span class="n">roomY</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">existing_room</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">if</span> <span class="p">(</span><span class="n">roomX</span><span class="p">,</span> <span class="n">roomY</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">map_coords</span><span class="p">:</span>

View file

@ -353,7 +353,11 @@
<span class="n">nodeobj</span> <span class="o">=</span> <span class="n">NodeTypeclass</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="n">xyz</span><span class="p">)</span>
<span class="k">except</span> <span class="n">NodeTypeclass</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="c1"># create a new entity with proper coordinates etc</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; spawning room at xyz=</span><span class="si">{</span><span class="n">xyz</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">tclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prototype</span><span class="p">[</span><span class="s1">&#39;typeclass&#39;</span><span class="p">]</span>
<span class="n">tclass</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s1">&#39; (</span><span class="si">{</span><span class="n">tclass</span><span class="si">}</span><span class="s1">)&#39;</span>
<span class="k">if</span> <span class="n">tclass</span> <span class="o">!=</span> <span class="s1">&#39;evennia.contrib.xyzgrid.xyzroom.XYZRoom&#39;</span>
<span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; spawning room at xyz=</span><span class="si">{</span><span class="n">xyz</span><span class="si">}{</span><span class="n">tclass</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">nodeobj</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">NodeTypeclass</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;key&#39;</span><span class="p">,</span> <span class="s1">&#39;An empty room&#39;</span><span class="p">),</span>
<span class="n">xyz</span><span class="o">=</span><span class="n">xyz</span>
@ -369,7 +373,6 @@
<span class="c1"># apply prototype to node. This will not override the XYZ tags since</span>
<span class="c1"># these are not in the prototype and exact=False</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="bp">self</span><span class="o">.</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">nodeobj</span><span class="p">],</span> <span class="n">exact</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></div>
@ -406,8 +409,6 @@
<span class="n">link</span><span class="o">.</span><span class="n">prototype</span><span class="p">[</span><span class="s1">&#39;prototype_key&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generate_prototype_key</span><span class="p">()</span>
<span class="n">maplinks</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">aliases</span><span class="p">,</span> <span class="n">direction</span><span class="p">,</span> <span class="n">link</span><span class="p">)</span>
<span class="c1"># if xyz == (8, 1, &#39;the large tree&#39;):</span>
<span class="c1"># from evennia import set_trace;set_trace()</span>
<span class="c1"># remove duplicates</span>
<span class="n">linkobjs</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
<span class="k">for</span> <span class="n">exitobj</span> <span class="ow">in</span> <span class="n">ExitTypeclass</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="n">xyz</span><span class="p">):</span>
@ -426,7 +427,6 @@
<span class="c1"># build all exits first run)</span>
<span class="n">differing_keys</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">maplinks</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">symmetric_difference</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">linkobjs</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
<span class="k">for</span> <span class="n">differing_key</span> <span class="ow">in</span> <span class="n">differing_keys</span><span class="p">:</span>
<span class="c1"># from evennia import set_trace;set_trace()</span>
<span class="k">if</span> <span class="n">differing_key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">maplinks</span><span class="p">:</span>
<span class="c1"># an exit without a maplink - delete the exit-object</span>
@ -450,7 +450,12 @@
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="n">linkobjs</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">exi</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; spawning/updating exit xyz=</span><span class="si">{</span><span class="n">xyz</span><span class="si">}</span><span class="s2">, direction=</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">prot</span> <span class="o">=</span> <span class="n">maplinks</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()][</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">prototype</span>
<span class="n">tclass</span> <span class="o">=</span> <span class="n">prot</span><span class="p">[</span><span class="s1">&#39;typeclass&#39;</span><span class="p">]</span>
<span class="n">tclass</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s1">&#39; (</span><span class="si">{</span><span class="n">tclass</span><span class="si">}</span><span class="s1">)&#39;</span>
<span class="k">if</span> <span class="n">tclass</span> <span class="o">!=</span> <span class="s1">&#39;evennia.contrib.xyzgrid.xyzroom.XYZExit&#39;</span>
<span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; spawning/updating exit xyz=</span><span class="si">{</span><span class="n">xyz</span><span class="si">}</span><span class="s2">, direction=</span><span class="si">{</span><span class="n">key</span><span class="si">}{</span><span class="n">tclass</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="c1"># apply prototypes to catch any changes</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">linkobj</span> <span class="ow">in</span> <span class="n">linkobjs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>

View file

@ -166,6 +166,9 @@
<span class="n">map_data_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">variable_from_module</span><span class="p">(</span><span class="n">module_path</span><span class="p">,</span> <span class="s2">&quot;XYMAP_DATA&quot;</span><span class="p">)]</span>
<span class="c1"># inject the python path in the map data</span>
<span class="k">for</span> <span class="n">mapdata</span> <span class="ow">in</span> <span class="n">map_data_list</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">mapdata</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not find or load map from </span><span class="si">{</span><span class="n">module_path</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">mapdata</span><span class="p">[</span><span class="s1">&#39;module_path&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">module_path</span>
<span class="k">return</span> <span class="n">map_data_list</span></div>
@ -179,10 +182,14 @@
<span class="n">nmaps</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">loaded_mapdata</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">changed</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">mapdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">mapdata</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">mapdata</span> <span class="o">=</span> <span class="n">mapdata</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># generate all Maps - this will also initialize their components</span>
<span class="c1"># and bake any pathfinding paths (or load from disk-cache)</span>
<span class="k">for</span> <span class="n">zcoord</span><span class="p">,</span> <span class="n">old_mapdata</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">for</span> <span class="n">zcoord</span><span class="p">,</span> <span class="n">old_mapdata</span> <span class="ow">in</span> <span class="n">mapdata</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Loading map &#39;</span><span class="si">{</span><span class="n">zcoord</span><span class="si">}</span><span class="s2">&#39;...&quot;</span><span class="p">)</span>
@ -210,7 +217,7 @@
<span class="c1"># re-store changed data</span>
<span class="k">for</span> <span class="n">zcoord</span> <span class="ow">in</span> <span class="n">changed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="p">[</span><span class="n">zcoord</span><span class="p">]</span> <span class="o">=</span> <span class="n">loaded_mapdata</span><span class="p">[</span><span class="s1">&#39;zcoord&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="p">[</span><span class="n">zcoord</span><span class="p">]</span> <span class="o">=</span> <span class="n">loaded_mapdata</span><span class="p">[</span><span class="n">zcoord</span><span class="p">]</span>
<span class="c1"># store</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Loaded and linked </span><span class="si">{</span><span class="n">nmaps</span><span class="si">}</span><span class="s2"> map(s).&quot;</span><span class="p">)</span>
@ -264,7 +271,9 @@
<span class="sd"> Clear the entire grid, including database entities, then the grid too.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_map</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">zcoord</span> <span class="k">for</span> <span class="n">zcoord</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="p">),</span> <span class="n">remove_objects</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">mapdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span>
<span class="k">if</span> <span class="n">mapdata</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_map</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">zcoord</span> <span class="k">for</span> <span class="n">zcoord</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="p">),</span> <span class="n">remove_objects</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span></div>
<div class="viewcode-block" id="XYZGrid.spawn"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.spawn">[docs]</a> <span class="k">def</span> <span class="nf">spawn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span> <span class="n">directions</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
@ -333,6 +342,7 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">loaded</span><span class="p">:</span>
<span class="n">xyzgrid</span><span class="o">.</span><span class="n">reload</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="k">raise</span>
<span class="k">if</span> <span class="n">print_errors</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>

View file

@ -128,27 +128,20 @@
<span class="sd"> possible with a unique combination of x,y,z).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># filter by tags, then figure out of we got a single match or not</span>
<span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="n">xyz</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">ncount</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="k">if</span> <span class="n">ncount</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
<span class="c1"># error - mimic default get() behavior but with a little more info</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">xyz</span>
<span class="c1"># mimic get_family</span>
<span class="n">paths</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="k">for</span> <span class="bp">cls</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
<span class="p">]</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path__in&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">paths</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span>
<span class="bp">self</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_X_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">z</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">except</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="n">inp</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;xyz=(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">), &quot;</span> <span class="o">+</span>
<span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">=</span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s2">&quot;</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="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> &quot;</span>
<span class="sa">f</span><span class="s2">&quot;matching query </span><span class="si">{</span><span class="n">inp</span><span class="si">}</span><span class="s2"> does not exist.&quot;</span><span class="p">)</span></div></div>
<span class="n">inp</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Query: xyz=(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">), &quot;</span> <span class="o">+</span>
<span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">=</span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s2">&quot;</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="k">if</span> <span class="n">ncount</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">MultipleObjectsReturned</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="XYZExitManager"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZExitManager">[docs]</a><span class="k">class</span> <span class="nc">XYZExitManager</span><span class="p">(</span><span class="n">XYZManager</span><span class="p">):</span>

View file

@ -1007,7 +1007,7 @@
<span class="k">return</span> <span class="s2">&quot;node_typeclass&quot;</span>
<span class="k">def</span> <span class="nf">_typeclass_select</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">typeclass</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_typeclass_select</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">typeclass</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Select typeclass from list and add it to prototype. Return next node to go to.&quot;&quot;&quot;</span>
<span class="n">ret</span> <span class="o">=</span> <span class="n">_set_property</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">typeclass</span><span class="p">,</span> <span class="n">prop</span><span class="o">=</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="n">processor</span><span class="o">=</span><span class="nb">str</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;Selected typeclass |c</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">typeclass</span><span class="p">))</span>
@ -2622,7 +2622,7 @@
<span class="c1"># prototype load node</span>
<span class="k">def</span> <span class="nf">_prototype_load_select</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype_key</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_prototype_load_select</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">prototype_key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">matches</span><span class="p">:</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">matches</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>

View file

@ -147,28 +147,74 @@
<span class="k">elif</span> <span class="n">protkey</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="s2">&quot;prototype_desc&quot;</span><span class="p">):</span>
<span class="n">prototype</span><span class="p">[</span><span class="n">protkey</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;attrs&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="c1"># break reference</span>
<span class="n">tags</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="p">[]))</span>
<span class="n">homogenized_tags</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">homogenized</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">homogenized_tags</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">homogenized_attrs</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">homogenized_parents</span> <span class="o">=</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">prototype</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="ow">in</span> <span class="n">reserved</span><span class="p">:</span>
<span class="c1"># check all reserved keys</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;tags&quot;</span><span class="p">:</span>
<span class="c1"># tags must be on form [(tag, category, data), ...]</span>
<span class="n">tags</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="p">[]))</span>
<span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">tags</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">tag</span><span class="p">):</span>
<span class="n">homogenized_tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">tag</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">tag</span><span class="p">:</span>
<span class="n">ntag</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ntag</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">homogenized_tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">tag</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">ntag</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">homogenized_tags</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">tag</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">tag</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="kc">None</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">homogenized_tags</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</span><span class="p">[:</span><span class="mi">3</span><span class="p">])</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;attrs&quot;</span><span class="p">:</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;attrs&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="c1"># break reference</span>
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="c1"># attrs must be on form [(key, value, category, lockstr)]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_error</span><span class="p">(</span><span class="s2">&quot;Prototype&#39;s &#39;attr&#39; field must &quot;</span>
<span class="sa">f</span><span class="s2">&quot;be a list of tuples: </span><span class="si">{</span><span class="n">prototype</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">attr</span><span class="p">:</span>
<span class="n">nattr</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nattr</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># we assume a None-value</span>
<span class="n">homogenized_attrs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">attr</span><span class="p">[</span><span class="mi">0</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="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">nattr</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">homogenized_attrs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">attr</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">attr</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">nattr</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="n">homogenized_attrs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">attr</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">attr</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">attr</span><span class="p">[</span><span class="mi">2</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="n">homogenized_attrs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">attr</span><span class="p">[:</span><span class="mi">4</span><span class="p">])</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s2">&quot;prototype_parent&quot;</span><span class="p">:</span>
<span class="c1"># homogenize any prototype-parents embedded directly as dicts</span>
<span class="n">protparents</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="s1">&#39;prototype_parent&#39;</span><span class="p">,</span> <span class="p">[])</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">protparents</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="n">protparents</span> <span class="o">=</span> <span class="p">[</span><span class="n">protparents</span><span class="p">]</span>
<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">protparents</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c1"># recursively homogenize directly embedded prototype parents</span>
<span class="n">homogenized_parents</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">homogenize_prototype</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">custom_keys</span><span class="o">=</span><span class="n">custom_keys</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">homogenized_tags</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
<span class="c1"># normal prototype-parent names are added as-is</span>
<span class="n">homogenized_parents</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># another reserved key</span>
<span class="n">homogenized</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># unassigned keys -&gt; attrs</span>
<span class="n">attrs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="n">attrs</span><span class="p">:</span>
<span class="n">homogenized</span><span class="p">[</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">attrs</span>
<span class="c1"># unreserved keys -&gt; attrs</span>
<span class="n">homogenized_attrs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="n">homogenized_attrs</span><span class="p">:</span>
<span class="n">homogenized</span><span class="p">[</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">homogenized_attrs</span>
<span class="k">if</span> <span class="n">homogenized_tags</span><span class="p">:</span>
<span class="n">homogenized</span><span class="p">[</span><span class="s2">&quot;tags&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">homogenized_tags</span>
<span class="k">if</span> <span class="n">homogenized_parents</span><span class="p">:</span>
<span class="n">homogenized</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">homogenized_parents</span>
<span class="c1"># add required missing parts that had defaults before</span>
@ -475,7 +521,8 @@
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="search_prototype"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.search_prototype">[docs]</a><span class="k">def</span> <span class="nf">search_prototype</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">require_single</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">return_iterators</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<div class="viewcode-block" id="search_prototype"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.search_prototype">[docs]</a><span class="k">def</span> <span class="nf">search_prototype</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">require_single</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">return_iterators</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">no_db</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Find prototypes based on key and/or tags, or all prototypes.</span>
@ -489,6 +536,9 @@
<span class="sd"> return_iterators (bool): Optimized return for large numbers of db-prototypes.</span>
<span class="sd"> If set, separate returns of module based prototypes and paginate</span>
<span class="sd"> the db-prototype return.</span>
<span class="sd"> no_db (bool): Optimization. If set, skip querying for database-generated prototypes and only</span>
<span class="sd"> include module-based prototypes. This can lead to a dramatic speedup since</span>
<span class="sd"> module-prototypes are static and require no db-lookup.</span>
<span class="sd"> Return:</span>
<span class="sd"> matches (list): Default return, all found prototype dicts. Empty list if</span>
@ -540,35 +590,38 @@
<span class="c1"># prototype_from_object will modify the base prototype for every object</span>
<span class="n">module_prototypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">mod_matches</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
<span class="c1"># search db-stored prototypes</span>
<span class="k">if</span> <span class="n">tags</span><span class="p">:</span>
<span class="c1"># exact match on tag(s)</span>
<span class="n">tags</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">tags</span><span class="p">)</span>
<span class="n">tag_categories</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;db_prototype&quot;</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">tags</span><span class="p">]</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="n">DbPrototype</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_tag</span><span class="p">(</span><span class="n">tags</span><span class="p">,</span> <span class="n">tag_categories</span><span class="p">)</span>
<span class="k">if</span> <span class="n">no_db</span><span class="p">:</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="n">DbPrototype</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">if</span> <span class="n">key</span><span class="p">:</span>
<span class="c1"># exact or partial match on key</span>
<span class="n">exact_match</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">Q</span><span class="p">(</span><span class="n">db_key__iexact</span><span class="o">=</span><span class="n">key</span><span class="p">))</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;db_key&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">exact_match</span> <span class="ow">and</span> <span class="n">allow_fuzzy</span><span class="p">:</span>
<span class="c1"># try with partial match instead</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">Q</span><span class="p">(</span><span class="n">db_key__icontains</span><span class="o">=</span><span class="n">key</span><span class="p">))</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;db_key&quot;</span><span class="p">)</span>
<span class="c1"># search db-stored prototypes</span>
<span class="k">if</span> <span class="n">tags</span><span class="p">:</span>
<span class="c1"># exact match on tag(s)</span>
<span class="n">tags</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">tags</span><span class="p">)</span>
<span class="n">tag_categories</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;db_prototype&quot;</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">tags</span><span class="p">]</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="n">DbPrototype</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_tag</span><span class="p">(</span><span class="n">tags</span><span class="p">,</span> <span class="n">tag_categories</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="n">exact_match</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="n">DbPrototype</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">if</span> <span class="n">key</span><span class="p">:</span>
<span class="c1"># exact or partial match on key</span>
<span class="n">exact_match</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">Q</span><span class="p">(</span><span class="n">db_key__iexact</span><span class="o">=</span><span class="n">key</span><span class="p">))</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;db_key&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">exact_match</span> <span class="ow">and</span> <span class="n">allow_fuzzy</span><span class="p">:</span>
<span class="c1"># try with partial match instead</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">Q</span><span class="p">(</span><span class="n">db_key__icontains</span><span class="o">=</span><span class="n">key</span><span class="p">))</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;db_key&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="n">exact_match</span>
<span class="c1"># convert to prototype</span>
<span class="n">db_ids</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">Attribute</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">scriptdb__pk__in</span><span class="o">=</span><span class="n">db_ids</span><span class="p">,</span> <span class="n">db_key</span><span class="o">=</span><span class="s2">&quot;prototype&quot;</span><span class="p">)</span>
<span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;db_value&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;scriptdb__db_key&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># convert to prototype</span>
<span class="n">db_ids</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">db_matches</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">Attribute</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">scriptdb__pk__in</span><span class="o">=</span><span class="n">db_ids</span><span class="p">,</span> <span class="n">db_key</span><span class="o">=</span><span class="s2">&quot;prototype&quot;</span><span class="p">)</span>
<span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;db_value&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;scriptdb__db_key&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">and</span> <span class="n">require_single</span><span class="p">:</span>
<span class="n">nmodules</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">module_prototypes</span><span class="p">)</span>
<span class="n">ndbprots</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="n">ndbprots</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">count</span><span class="p">()</span> <span class="k">if</span> <span class="n">db_matches</span> <span class="k">else</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">nmodules</span> <span class="o">+</span> <span class="n">ndbprots</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;Found </span><span class="si">{num}</span><span class="s2"> matching prototypes among </span><span class="si">{module_prototypes}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
@ -810,19 +863,29 @@
<span class="n">err</span><span class="o">=</span><span class="n">err</span><span class="p">,</span> <span class="n">protkey</span><span class="o">=</span><span class="n">protkey</span><span class="p">,</span> <span class="n">typeclass</span><span class="o">=</span><span class="n">typeclass</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># recursively traverse prototype_parent chain</span>
<span class="k">if</span> <span class="n">prototype_parent</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prototype_parent</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c1"># the protparent is already embedded as a dict;</span>
<span class="n">prototype_parent</span> <span class="o">=</span> <span class="p">[</span><span class="n">prototype_parent</span><span class="p">]</span>
<span class="c1"># recursively traverse prototype_parent chain</span>
<span class="k">for</span> <span class="n">protstring</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">prototype_parent</span><span class="p">):</span>
<span class="n">protstring</span> <span class="o">=</span> <span class="n">protstring</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">if</span> <span class="n">protkey</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">protstring</span> <span class="o">==</span> <span class="n">protkey</span><span class="p">:</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Prototype </span><span class="si">{protkey}</span><span class="s2"> tries to parent itself.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">protkey</span><span class="o">=</span><span class="n">protkey</span><span class="p">))</span>
<span class="n">protparent</span> <span class="o">=</span> <span class="n">protparents</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">protstring</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">protparent</span><span class="p">:</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Prototype </span><span class="si">{protkey}</span><span class="s2">&#39;s prototype_parent &#39;</span><span class="si">{parent}</span><span class="s2">&#39; was not found.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">protkey</span><span class="o">=</span><span class="n">protkey</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">protstring</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">protstring</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c1"># an already embedded prototype_parent</span>
<span class="n">protparent</span> <span class="o">=</span> <span class="n">protstring</span>
<span class="n">protstring</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">protstring</span> <span class="o">=</span> <span class="n">protstring</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">if</span> <span class="n">protkey</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">protstring</span> <span class="o">==</span> <span class="n">protkey</span><span class="p">:</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Prototype </span><span class="si">{protkey}</span><span class="s2"> tries to parent itself.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">protkey</span><span class="o">=</span><span class="n">protkey</span><span class="p">))</span>
<span class="n">protparent</span> <span class="o">=</span> <span class="n">protparents</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">protstring</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">protparent</span><span class="p">:</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Prototype </span><span class="si">{protkey}</span><span class="s2">&#39;s `prototype_parent` (named &#39;</span><span class="si">{parent}</span><span class="s2">&#39;) &quot;</span>
<span class="s2">&quot;was not found.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">protkey</span><span class="o">=</span><span class="n">protkey</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">protstring</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># check for infinite recursion</span>
<span class="k">if</span> <span class="nb">id</span><span class="p">(</span><span class="n">prototype</span><span class="p">)</span> <span class="ow">in</span> <span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;visited&quot;</span><span class="p">]:</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> has infinite nesting of prototypes.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
@ -833,9 +896,12 @@
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">_ERRSTR</span><span class="si">}</span><span class="s2">: &quot;</span> <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="si">{</span><span class="n">_ERRSTR</span><span class="si">}</span><span class="s2">: &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;errors&quot;</span><span class="p">]))</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;visited&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">id</span><span class="p">(</span><span class="n">prototype</span><span class="p">))</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;depth&quot;</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># next step of recursive validation</span>
<span class="n">validate_prototype</span><span class="p">(</span>
<span class="n">protparent</span><span class="p">,</span> <span class="n">protstring</span><span class="p">,</span> <span class="n">protparents</span><span class="p">,</span> <span class="n">is_prototype_base</span><span class="o">=</span><span class="n">is_prototype_base</span><span class="p">,</span> <span class="n">_flags</span><span class="o">=</span><span class="n">_flags</span>
<span class="p">)</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;visited&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">_flags</span><span class="p">[</span><span class="s2">&quot;depth&quot;</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span>
@ -960,7 +1026,7 @@
<span class="n">attrs</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="p">(</span><span class="n">attrkey</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="n">locks</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="n">locks</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">lock</span> <span class="k">for</span> <span class="n">lock</span> <span class="ow">in</span> <span class="n">locks</span> <span class="k">if</span> <span class="n">lock</span><span class="p">)</span>
<span class="n">locks</span> <span class="o">=</span> <span class="n">locks</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locks</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lock</span> <span class="k">for</span> <span class="n">lock</span> <span class="ow">in</span> <span class="n">locks</span> <span class="k">if</span> <span class="n">lock</span><span class="p">)</span>
<span class="n">category</span> <span class="o">=</span> <span class="s2">&quot;|ccategory:|n </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">category</span><span class="p">)</span> <span class="k">if</span> <span class="n">category</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">cat_locks</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">category</span> <span class="ow">or</span> <span class="n">locks</span><span class="p">:</span>

View file

@ -262,10 +262,23 @@
<span class="n">_workprot</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="n">_workprot</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">_workprot</span>
<span class="k">if</span> <span class="s2">&quot;prototype_parent&quot;</span> <span class="ow">in</span> <span class="n">inprot</span><span class="p">:</span>
<span class="c1"># move backwards through the inheritance</span>
<span class="k">for</span> <span class="n">prototype</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">inprot</span><span class="p">[</span><span class="s2">&quot;prototype_parent&quot;</span><span class="p">]):</span>
<span class="n">prototype_parents</span> <span class="o">=</span> <span class="n">inprot</span><span class="p">[</span><span class="s2">&quot;prototype_parent&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prototype_parents</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c1"># protparent already embedded as-is</span>
<span class="n">prototype_parents</span> <span class="o">=</span> <span class="p">[</span><span class="n">prototype_parents</span><span class="p">]</span>
<span class="k">for</span> <span class="n">prototype</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">prototype_parents</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c1"># protparent already embedded as-is</span>
<span class="n">parent_prototype</span> <span class="o">=</span> <span class="n">prototype</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># protparent given by-name</span>
<span class="n">parent_prototype</span> <span class="o">=</span> <span class="n">protparents</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">prototype</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="p">{})</span>
<span class="c1"># Build the prot dictionary in reverse order, overloading</span>
<span class="n">new_prot</span> <span class="o">=</span> <span class="n">_get_prototype</span><span class="p">(</span>
<span class="n">protparents</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">prototype</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="p">{}),</span> <span class="n">protparents</span><span class="p">,</span> <span class="n">_workprot</span><span class="o">=</span><span class="n">_workprot</span>
<span class="n">parent_prototype</span><span class="p">,</span> <span class="n">protparents</span><span class="p">,</span> <span class="n">_workprot</span><span class="o">=</span><span class="n">_workprot</span>
<span class="p">)</span>
<span class="c1"># attrs, tags have internal structure that should be inherited separately</span>
@ -287,7 +300,7 @@
<span class="k">return</span> <span class="n">_workprot</span>
<div class="viewcode-block" id="flatten_prototype"><a class="viewcode-back" href="../../../api/evennia.prototypes.spawner.html#evennia.prototypes.spawner.flatten_prototype">[docs]</a><span class="k">def</span> <span class="nf">flatten_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">validate</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<div class="viewcode-block" id="flatten_prototype"><a class="viewcode-back" href="../../../api/evennia.prototypes.spawner.html#evennia.prototypes.spawner.flatten_prototype">[docs]</a><span class="k">def</span> <span class="nf">flatten_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="n">validate</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">no_db</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Produce a &#39;flattened&#39; prototype, where all prototype parents in the inheritance tree have been</span>
<span class="sd"> merged into a final prototype.</span>
@ -295,6 +308,8 @@
<span class="sd"> Args:</span>
<span class="sd"> prototype (dict): Prototype to flatten. Its `prototype_parent` field will be parsed.</span>
<span class="sd"> validate (bool, optional): Validate for valid keys etc.</span>
<span class="sd"> no_db (bool, optional): Don&#39;t search db-based prototypes. This can speed up</span>
<span class="sd"> searching dramatically since module-based prototypes are static.</span>
<span class="sd"> Returns:</span>
<span class="sd"> flattened (dict): The final, flattened prototype.</span>
@ -303,7 +318,8 @@
<span class="k">if</span> <span class="n">prototype</span><span class="p">:</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">protlib</span><span class="o">.</span><span class="n">homogenize_prototype</span><span class="p">(</span><span class="n">prototype</span><span class="p">)</span>
<span class="n">protparents</span> <span class="o">=</span> <span class="p">{</span><span class="n">prot</span><span class="p">[</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> <span class="n">prot</span> <span class="k">for</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">()}</span>
<span class="n">protparents</span> <span class="o">=</span> <span class="p">{</span><span class="n">prot</span><span class="p">[</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> <span class="n">prot</span>
<span class="k">for</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">protlib</span><span class="o">.</span><span class="n">search_prototype</span><span class="p">(</span><span class="n">no_db</span><span class="o">=</span><span class="n">no_db</span><span class="p">)}</span>
<span class="n">protlib</span><span class="o">.</span><span class="n">validate_prototype</span><span class="p">(</span>
<span class="n">prototype</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">protparents</span><span class="p">,</span> <span class="n">is_prototype_base</span><span class="o">=</span><span class="n">validate</span><span class="p">,</span> <span class="n">strict</span><span class="o">=</span><span class="n">validate</span>
<span class="p">)</span>
@ -367,7 +383,8 @@
<span class="k">if</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">prot</span><span class="p">[</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">aliases</span>
<span class="n">tags</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span>
<span class="p">[(</span><span class="n">tag</span><span class="o">.</span><span class="n">db_key</span><span class="p">,</span> <span class="n">tag</span><span class="o">.</span><span class="n">db_category</span><span class="p">,</span> <span class="n">tag</span><span class="o">.</span><span class="n">db_data</span><span class="p">)</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_objs</span><span class="o">=</span><span class="kc">True</span><span class="p">)]</span>
<span class="p">[(</span><span class="n">tag</span><span class="o">.</span><span class="n">db_key</span><span class="p">,</span> <span class="n">tag</span><span class="o">.</span><span class="n">db_category</span><span class="p">,</span> <span class="n">tag</span><span class="o">.</span><span class="n">db_data</span><span class="p">)</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">return_objs</span><span class="o">=</span><span class="kc">True</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="p">(</span><span class="nb">str</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="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">tup</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">tags</span><span class="p">:</span>
<span class="n">prot</span><span class="p">[</span><span class="s2">&quot;tags&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span>
@ -375,7 +392,8 @@
<span class="p">[</span>
<span class="p">(</span><span class="n">attr</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">attr</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">attr</span><span class="o">.</span><span class="n">category</span><span class="p">,</span> <span class="s2">&quot;;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">attr</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">all</span><span class="p">()))</span>
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="p">]</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="p">(</span><span class="nb">str</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="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">tup</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">tup</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">attrs</span><span class="p">:</span>
<span class="n">prot</span><span class="p">[</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">attrs</span>

View file

@ -272,12 +272,16 @@
<span class="sd"> be stripped on the Evennia side.</span>
<span class="sd"> ::</span>
<span class="sd"> [cmd.name, [], {}] -&gt; Cmd.Name</span>
<span class="sd"> [cmd.name, [arg], {}] -&gt; Cmd.Name arg</span>
<span class="sd"> [cmd.name, [args],{}] -&gt; Cmd.Name [args]</span>
<span class="sd"> [cmd.name, [], {kwargs}] -&gt; Cmd.Name {kwargs}</span>
<span class="sd"> [cmd_name, [], {}] -&gt; Cmd.Name</span>
<span class="sd"> [cmd_name, [arg], {}] -&gt; Cmd.Name arg</span>
<span class="sd"> [cmd_name, [args],{}] -&gt; Cmd.Name [args]</span>
<span class="sd"> [cmd_name, [], {kwargs}] -&gt; Cmd.Name {kwargs}</span>
<span class="sd"> [cmdname, [args, {kwargs}] -&gt; Core.Cmdname [[args],{kwargs}]</span>
<span class="sd"> For more flexibility with certain clients, if `cmd_name` is capitalized,</span>
<span class="sd"> Evennia will leave its current capitalization (So CMD_nAmE would be sent</span>
<span class="sd"> as CMD.nAmE but cMD_Name would be Cmd.Name)</span>
<span class="sd"> Notes:</span>
<span class="sd"> There are also a few default mappings between evennia outputcmds and GMCP:</span>
<span class="sd"> ::</span>
@ -293,9 +297,13 @@
<span class="k">if</span> <span class="n">cmdname</span> <span class="ow">in</span> <span class="n">EVENNIA_TO_GMCP</span><span class="p">:</span>
<span class="n">gmcp_cmdname</span> <span class="o">=</span> <span class="n">EVENNIA_TO_GMCP</span><span class="p">[</span><span class="n">cmdname</span><span class="p">]</span>
<span class="k">elif</span> <span class="s2">&quot;_&quot;</span> <span class="ow">in</span> <span class="n">cmdname</span><span class="p">:</span>
<span class="n">gmcp_cmdname</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">word</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">cmdname</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="k">if</span> <span class="n">cmdname</span><span class="o">.</span><span class="n">istitle</span><span class="p">():</span>
<span class="c1"># leave without capitalization</span>
<span class="n">gmcp_cmdname</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">word</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">cmdname</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="k">else</span><span class="p">:</span>
<span class="n">gmcp_cmdname</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">word</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">cmdname</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="k">else</span><span class="p">:</span>
<span class="n">gmcp_cmdname</span> <span class="o">=</span> <span class="s2">&quot;Core.</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">cmdname</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span>
<span class="n">gmcp_cmdname</span> <span class="o">=</span> <span class="s2">&quot;Core.</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">cmdname</span> <span class="k">if</span> <span class="n">cmdname</span><span class="o">.</span><span class="n">istitle</span><span class="p">()</span> <span class="k">else</span> <span class="n">cmdname</span><span class="o">.</span><span class="n">capitalize</span><span class="p">())</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">args</span> <span class="ow">or</span> <span class="n">kwargs</span><span class="p">):</span>
<span class="n">gmcp_string</span> <span class="o">=</span> <span class="n">gmcp_cmdname</span>

View file

@ -1416,7 +1416,7 @@
<span class="sd"> Parse the select action</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">available_choices</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;available_choices&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">available_choices</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;available_choices&quot;</span><span class="p">,</span> <span class="p">[])</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">index</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">raw_string</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span> <span class="o">-</span> <span class="mi">1</span>
@ -1432,7 +1432,10 @@
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">select</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">selection</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="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>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">(</span><span class="s2">&quot;Error in EvMenu.list_node decorator:</span><span class="se">\n</span><span class="s2"> &quot;</span>
<span class="sa">f</span><span class="s2">&quot;select-callable: </span><span class="si">{</span><span class="n">select</span><span class="si">}</span><span class="se">\n</span><span class="s2"> with args: (</span><span class="si">{</span><span class="n">caller</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">selection</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">available_choices</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">kwargs</span><span class="si">}</span><span class="s2">) raised &quot;</span>
<span class="s2">&quot;exception.&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">select</span><span class="p">:</span>
<span class="c1"># we assume a string was given, we inject the result into the kwargs</span>
<span class="c1"># to pass on to the next node</span>