Updated HTML docs

This commit is contained in:
Griatch 2021-12-16 19:34:13 +01:00
parent d79d2e888e
commit 5376217df9
57 changed files with 584 additions and 406 deletions

View file

@ -1621,10 +1621,10 @@
<span class="sd"> set attribute on an object or account</span>
<span class="sd"> Usage:</span>
<span class="sd"> set &lt;obj&gt;/&lt;attr&gt; = &lt;value&gt;</span>
<span class="sd"> set &lt;obj&gt;/&lt;attr&gt; =</span>
<span class="sd"> set &lt;obj&gt;/&lt;attr&gt;</span>
<span class="sd"> set *&lt;account&gt;/&lt;attr&gt; = &lt;value&gt;</span>
<span class="sd"> set[/switch] &lt;obj&gt;/&lt;attr&gt;[:category] = &lt;value&gt;</span>
<span class="sd"> set[/switch] &lt;obj&gt;/&lt;attr&gt;[:category] = # delete attribute</span>
<span class="sd"> set[/switch] &lt;obj&gt;/&lt;attr&gt;[:category] # view attribute</span>
<span class="sd"> set[/switch] *&lt;account&gt;/&lt;attr&gt;[:category] = &lt;value&gt;</span>
<span class="sd"> Switch:</span>
<span class="sd"> edit: Open the line editor (string values only)</span>
@ -1675,7 +1675,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="CmdSetAttribute.check_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.check_attr">[docs]</a> <span class="k">def</span> <span class="nf">check_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">):</span>
<div class="viewcode-block" id="CmdSetAttribute.check_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.check_attr">[docs]</a> <span class="k">def</span> <span class="nf">check_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This may be overridden by subclasses in case restrictions need to be</span>
<span class="sd"> placed on what attributes can be set by who beyond the normal lock.</span>
@ -1732,7 +1732,7 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_found</span>
<span class="k">return</span> <span class="n">result</span></div>
<div class="viewcode-block" id="CmdSetAttribute.view_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.view_attr">[docs]</a> <span class="k">def</span> <span class="nf">view_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<div class="viewcode-block" id="CmdSetAttribute.view_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.view_attr">[docs]</a> <span class="k">def</span> <span class="nf">view_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Look up the value of an attribute and return a string displaying it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@ -1743,45 +1743,49 @@
<span class="n">val</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_nested_lookup</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="o">*</span><span class="n">nested_keys</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_found</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Attribute </span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2"> = </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="n">error</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> has no attribute &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Attribute </span><span class="si">{</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">/|w</span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s2">|n [category:</span><span class="si">{</span><span class="n">category</span><span class="si">}</span><span class="s2">] = </span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">error</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Attribute </span><span class="si">{</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">/|w</span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s2"> [category:</span><span class="si">{</span><span class="n">category</span><span class="si">}</span><span class="s2">] does not exist.&quot;</span>
<span class="k">if</span> <span class="n">nested</span><span class="p">:</span>
<span class="n">error</span> <span class="o">+=</span> <span class="s2">&quot; (Nested lookups attempted)&quot;</span>
<span class="k">return</span> <span class="n">error</span></div>
<div class="viewcode-block" id="CmdSetAttribute.rm_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.rm_attr">[docs]</a> <span class="k">def</span> <span class="nf">rm_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<div class="viewcode-block" id="CmdSetAttribute.rm_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.rm_attr">[docs]</a> <span class="k">def</span> <span class="nf">rm_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Remove an attribute from the object, or a nested data structure, and report back.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">nested</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">nested_keys</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">split_nested_attr</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
<span class="n">nested</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
<span class="k">if</span> <span class="n">nested_keys</span><span class="p">:</span>
<span class="n">del_key</span> <span class="o">=</span> <span class="n">nested_keys</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">)</span>
<span class="n">deep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_nested_lookup</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="o">*</span><span class="n">nested_keys</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">if</span> <span class="n">deep</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_found</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="n">deep</span><span class="p">[</span><span class="n">del_key</span><span class="p">]</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">IndexError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
<span class="k">continue</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Deleted attribute &#39;</span><span class="si">%s</span><span class="s2">&#39; (= nested) from </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Deleted attribute </span><span class="si">{</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">/|w</span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s2">|n [category:</span><span class="si">{</span><span class="n">category</span><span class="si">}</span><span class="s2">].&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">exists</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Deleted attribute &#39;</span><span class="si">%s</span><span class="s2">&#39; (= </span><span class="si">%s</span><span class="s2">) from </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">exists</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">error</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> has no attribute &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
<span class="n">exists</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="p">)</span>
<span class="k">if</span> <span class="n">exists</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Deleted attribute </span><span class="si">{</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">/|w</span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s2">|n [category:</span><span class="si">{</span><span class="n">category</span><span class="si">}</span><span class="s2">].&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">No attribute </span><span class="si">{</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">/|w</span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s2">|n [category: </span><span class="si">{</span><span class="n">category</span><span class="si">}</span><span class="s2">] &quot;</span>
<span class="s2">&quot;was found to delete.&quot;</span><span class="p">)</span>
<span class="n">error</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">No attribute </span><span class="si">{</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">/|w</span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s2">|n [category: </span><span class="si">{</span><span class="n">category</span><span class="si">}</span><span class="s2">] was found to delete.&quot;</span>
<span class="k">if</span> <span class="n">nested</span><span class="p">:</span>
<span class="n">error</span> <span class="o">+=</span> <span class="s2">&quot; (Nested lookups attempted)&quot;</span>
<span class="k">return</span> <span class="n">error</span></div>
<div class="viewcode-block" id="CmdSetAttribute.set_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.set_attr">[docs]</a> <span class="k">def</span> <span class="nf">set_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<div class="viewcode-block" id="CmdSetAttribute.set_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdSetAttribute.set_attr">[docs]</a> <span class="k">def</span> <span class="nf">set_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">attr</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">done</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">nested_keys</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">split_nested_attr</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">and</span> <span class="n">nested_keys</span><span class="p">:</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="p">)</span> <span class="ow">and</span> <span class="n">nested_keys</span><span class="p">:</span>
<span class="n">acc_key</span> <span class="o">=</span> <span class="n">nested_keys</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">lookup_value</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="n">lookup_value</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="p">)</span>
<span class="n">deep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_nested_lookup</span><span class="p">(</span><span class="n">lookup_value</span><span class="p">,</span> <span class="o">*</span><span class="n">nested_keys</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="k">if</span> <span class="n">deep</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">not_found</span><span class="p">:</span>
<span class="c1"># To support appending and inserting to lists</span>
@ -1808,7 +1812,7 @@
<span class="n">deep</span><span class="p">[</span><span class="n">acc_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">except</span> <span class="ne">TypeError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="c1"># Tuples can&#39;t be modified</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> - </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">deep</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="si">{</span><span class="n">err</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="n">deep</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">lookup_value</span>
<span class="n">attr</span> <span class="o">=</span> <span class="n">key</span>
@ -1818,8 +1822,8 @@
<span class="n">verb</span> <span class="o">=</span> <span class="s2">&quot;Modified&quot;</span> <span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">has</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;Created&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">done</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="si">%s</span><span class="s2"> attribute </span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2"> = </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">attr</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="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="si">{</span><span class="n">verb</span><span class="si">}</span><span class="s2"> attribute </span><span class="si">{</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">/|w</span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s2">|n [category:</span><span class="si">{</span><span class="n">category</span><span class="si">}</span><span class="s2">] = </span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span>
<span class="c1"># this means literal_eval tried to parse a faulty string</span>
<span class="k">return</span> <span class="p">(</span>
@ -1905,13 +1909,14 @@
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</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;Usage: set obj/attr = value. Use empty value to clear.&quot;</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;Usage: set obj/attr[:category] = value. Use empty value to clear.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># get values prepared by the parser</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">objname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objattr</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span>
<span class="n">category</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;option&quot;</span><span class="p">)</span> <span class="c1"># None if unset</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">search_for_obj</span><span class="p">(</span><span class="n">objname</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
@ -1941,11 +1946,11 @@
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># no = means we inspect the attribute(s)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">attrs</span><span class="p">:</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">attr</span><span class="o">.</span><span class="n">key</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="n">attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">attr</span><span class="o">.</span><span class="n">key</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">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">)]</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="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">view_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">view_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">))</span>
<span class="c1"># we view it without parsing markup.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;raw&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
<span class="k">return</span>
@ -1955,19 +1960,19 @@
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You don&#39;t have permission to edit </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</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="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rm_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rm_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># setting attribute(s). Make sure to convert to real Python type before saving.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;control&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;edit&quot;</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;You don&#39;t have permission to edit </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</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="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">_convert_from_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">set_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">set_attr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</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="c1"># send feedback</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</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">result</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">))</span></div></div>

View file

@ -1009,15 +1009,17 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s1">&#39;Obj/test1=&quot;value1&quot;&#39;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test1 = &#39;value1&#39;&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test1 [category:None] = value1&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s1">&#39;Obj2/test2=&quot;value2&quot;&#39;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj2/test2 = &#39;value2&#39;&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj2/test2 [category:None] = value2&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj2/test2&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj2/test2 = value2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj2/NotFound&quot;</span><span class="p">,</span> <span class="s2">&quot;Obj2 has no attribute &#39;notfound&#39;.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj2/test2&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj2/test2 [category:None] = value2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj2/NotFound&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj2/notfound [category:None] does not exist.&quot;</span><span class="p">)</span>
<span class="k">with</span> <span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.default.building.EvEditor&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">mock_ed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;/edit Obj2/test3&quot;</span><span class="p">)</span>
@ -1026,14 +1028,18 @@
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s1">&#39;Obj2/test3=&quot;value3&quot;&#39;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj2/test3 = &#39;value3&#39;&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj2/test3 [category:None] = value3&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj2/test3 = &quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute &#39;test3&#39; (= True) from Obj2.&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute Obj2/test3 [category:None].&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj2/test4:Foo = &#39;Bar&#39;&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj2/test4 [category:Foo] = Bar&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdCpAttr</span><span class="p">(),</span>
<span class="s2">&quot;/copy Obj2/test2 = Obj2/test3&quot;</span><span class="p">,</span>
@ -1052,123 +1058,162 @@
<div class="viewcode-block" id="TestBuilding.test_nested_attribute_commands"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestBuilding.test_nested_attribute_commands">[docs]</a> <span class="k">def</span> <span class="nf">test_nested_attribute_commands</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># list - adding white space proves real parsing</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test1=[1,2]&quot;</span><span class="p">,</span> <span class="s2">&quot;Created attribute Obj/test1 = [1, 2]&quot;</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1=[1,2]&quot;</span><span class="p">,</span> <span class="s2">&quot;Created attribute Obj/test1 [category:None] = [1, 2]&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test1&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test1 = [1, 2]&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test1[0]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test1[0] = 1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test1[1]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test1[1] = 2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test1 [category:None] = [1, 2]&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test1[0] [category:None] = 1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[1]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test1[1] [category:None] = 2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[0] = 99&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test1 = [99, 2]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test1 [category:None] = [99, 2]&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test1[0] [category:None] = 99&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test1[0]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test1[0] = 99&quot;</span><span class="p">)</span>
<span class="c1"># list delete</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[0] =&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute &#39;test1[0]&#39; (= nested) from Obj.&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute Obj/test1[0] [category:None].&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test1[0] [category:None] = 2&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test1[0]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test1[0] = 2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[1]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Obj has no attribute &#39;test1[1]&#39;. (Nested lookups attempted)&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test1[1] [category:None] does not exist. (Nested lookups attempted)&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Delete non-existent</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[5] =&quot;</span><span class="p">,</span>
<span class="s2">&quot;Obj has no attribute &#39;test1[5]&#39;. (Nested lookups attempted)&quot;</span><span class="p">,</span>
<span class="s2">&quot;No attribute Obj/test1[5] [category: None] was found to &quot;</span>
<span class="s2">&quot;delete. (Nested lookups attempted)&quot;</span>
<span class="p">)</span>
<span class="c1"># Append</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[+] = 42&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test1 = [2, 42]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test1 [category:None] = [2, 42]&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test1[+0] = -1&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test1 = [-1, 2, 42]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test1 [category:None] = [-1, 2, 42]&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># dict - removing white space proves real parsing</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2={ &#39;one&#39;: 1, &#39;two&#39;: 2 }&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test2 = {&#39;one&#39;: 1, &#39;two&#39;: 2}&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test2 [category:None] = {&#39;one&#39;: 1, &#39;two&#39;: 2}&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test2&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test2 = {&#39;one&#39;: 1, &#39;two&#39;: 2}&quot;</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test2 [category:None] = {&#39;one&#39;: 1, &#39;two&#39;: 2}&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;one&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test2[&#39;one&#39;] [category:None] = 1&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;one]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test2[&#39;one] [category:None] = 1&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test2[&#39;one&#39;]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test2[&#39;one&#39;] = 1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test2[&#39;one]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test2[&#39;one] = 1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;one&#39;]=99&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 = {&#39;one&#39;: 99, &#39;two&#39;: 2}&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 [category:None] = {&#39;one&#39;: 99, &#39;two&#39;: 2}&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;one&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test2[&#39;one&#39;] [category:None] = 99&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;two&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test2[&#39;two&#39;] [category:None] = 2&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test2[&#39;one&#39;]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test2[&#39;one&#39;] = 99&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test2[&#39;two&#39;]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test2[&#39;two&#39;] = 2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[+&#39;three&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Obj has no attribute &#39;test2[+&#39;three&#39;]&#39;. (Nested lookups attempted)&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test2[+&#39;three&#39;] [category:None] does not exist. (Nested lookups attempted)&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[+&#39;three&#39;] = 3&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 = {&#39;one&#39;: 99, &#39;two&#39;: 2, </span><span class="se">\&quot;</span><span class="s2">+&#39;three&#39;</span><span class="se">\&quot;</span><span class="s2">: 3}&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 [category:None] = {&#39;one&#39;: 99, &#39;two&#39;: 2, </span><span class="se">\&quot;</span><span class="s2">+&#39;three&#39;</span><span class="se">\&quot;</span><span class="s2">: 3}&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[+&#39;three&#39;] =&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute &#39;test2[+&#39;three&#39;]&#39; (= nested) from Obj.&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute Obj/test2[+&#39;three&#39;] [category:None].&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;three&#39;]=3&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 = {&#39;one&#39;: 99, &#39;two&#39;: 2, &#39;three&#39;: 3}&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 [category:None] = {&#39;one&#39;: 99, &#39;two&#39;: 2, &#39;three&#39;: 3}&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Dict delete</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;two&#39;] =&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute &#39;test2[&#39;two&#39;]&#39; (= nested) from Obj.&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute Obj/test2[&#39;two&#39;] [category:None].&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;two&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Obj has no attribute &#39;test2[&#39;two&#39;]&#39;. (Nested lookups attempted)&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test2[&#39;two&#39;] [category:None] does not exist. (Nested lookups attempted)&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test2&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test2 = {&#39;one&#39;: 99, &#39;three&#39;: 3}&quot;</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test2 [category:None] = {&#39;one&#39;: 99, &#39;three&#39;: 3}&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Obj has no attribute &#39;test2[0]&#39;. (Nested lookups attempted)&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test2[0] [category:None] does not exist. (Nested lookups attempted)&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[&#39;five&#39;] =&quot;</span><span class="p">,</span>
<span class="s2">&quot;Obj has no attribute &#39;test2[&#39;five&#39;]&#39;. (Nested lookups attempted)&quot;</span><span class="p">,</span>
<span class="s2">&quot;No attribute Obj/test2[&#39;five&#39;] [category: None] &quot;</span>
<span class="s2">&quot;was found to delete. (Nested lookups attempted)&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[+]=42&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 = {&#39;one&#39;: 99, &#39;three&#39;: 3, &#39;+&#39;: 42}&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 [category:None] = {&#39;one&#39;: 99, &#39;three&#39;: 3, &#39;+&#39;: 42}&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test2[+1]=33&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 = {&#39;one&#39;: 99, &#39;three&#39;: 3, &#39;+&#39;: 42, &#39;+1&#39;: 33}&quot;</span><span class="p">,</span>
<span class="s2">&quot;Modified attribute Obj/test2 [category:None] = &quot;</span>
<span class="s2">&quot;{&#39;one&#39;: 99, &#39;three&#39;: 3, &#39;+&#39;: 42, &#39;+1&#39;: 33}&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># tuple</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/tup = (1,2)&quot;</span><span class="p">,</span> <span class="s2">&quot;Created attribute Obj/tup = (1, 2)&quot;</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/tup = (1,2)&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/tup [category:None] = (1, 2)&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
@ -1189,54 +1234,85 @@
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="c1"># Special case for tuple, could have a better message</span>
<span class="s2">&quot;Obj/tup[1] = &quot;</span><span class="p">,</span>
<span class="s2">&quot;Obj has no attribute &#39;tup[1]&#39;. (Nested lookups attempted)&quot;</span><span class="p">,</span>
<span class="s2">&quot;No attribute Obj/tup[1] [category: None] &quot;</span>
<span class="s2">&quot;was found to delete. (Nested lookups attempted)&quot;</span>
<span class="p">)</span>
<span class="c1"># Deaper nesting</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test3=[{&#39;one&#39;: 1}]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test3 = [{&#39;one&#39;: 1}]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test3 [category:None] = [{&#39;one&#39;: 1}]&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test3[0][&#39;one&#39;]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test3[0][&#39;one&#39;] = 1&quot;</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test3[0][&#39;one&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test3[0][&#39;one&#39;] [category:None] = 1&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test3[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test3[0] [category:None] = {&#39;one&#39;: 1}&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test3[0]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test3[0] = {&#39;one&#39;: 1}&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test3[0][&#39;one&#39;] =&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute &#39;test3[0][&#39;one&#39;]&#39; (= nested) from Obj.&quot;</span><span class="p">,</span>
<span class="s2">&quot;Deleted attribute Obj/test3[0][&#39;one&#39;] [category:None].&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test3[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test3[0] [category:None] = </span><span class="si">{}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test3&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test3 [category:None] = [</span><span class="si">{}</span><span class="s2">]&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test3[0]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test3[0] = </span><span class="si">{}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test3&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test3 = [</span><span class="si">{}</span><span class="s2">]&quot;</span><span class="p">)</span>
<span class="c1"># Naughty keys</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4[0]=&#39;foo&#39;&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test4[0] = &#39;foo&#39;&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test4[0] [category:None] = foo&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test4[0]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test4[0] = foo&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test4[0] [category:None] = foo&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4=[{&#39;one&#39;: 1}]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test4 = [{&#39;one&#39;: 1}]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Created attribute Obj/test4 [category:None] = [{&#39;one&#39;: 1}]&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test4[0][&#39;one&#39;]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test4[0][&#39;one&#39;] = 1&quot;</span>
<span class="p">)</span>
<span class="c1"># Prefer nested items</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test4[0]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test4[0] = {&#39;one&#39;: 1}&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test4[0][&#39;one&#39;]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test4[0][&#39;one&#39;] = 1&quot;</span>
<span class="p">)</span>
<span class="c1"># Restored access</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdWipe</span><span class="p">(),</span> <span class="s2">&quot;Obj/test4&quot;</span><span class="p">,</span> <span class="s2">&quot;Wiped attributes test4 on Obj.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span> <span class="s2">&quot;Obj/test4[0]&quot;</span><span class="p">,</span> <span class="s2">&quot;Attribute Obj/test4[0] = foo&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4[0][&#39;one&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Obj has no attribute &#39;test4[0][&#39;one&#39;]&#39;.&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test4[0][&#39;one&#39;] [category:None] = 1&quot;</span>
<span class="p">)</span>
<span class="c1"># Prefer nested items</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test4[0] [category:None] = {&#39;one&#39;: 1}&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4[0][&#39;one&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test4[0][&#39;one&#39;] [category:None] = 1&quot;</span>
<span class="p">)</span>
<span class="c1"># Restored access</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdWipe</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4&quot;</span><span class="p">,</span>
<span class="s2">&quot;Wiped attributes test4 on Obj.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4[0]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test4[0] [category:None] = foo&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">building</span><span class="o">.</span><span class="n">CmdSetAttribute</span><span class="p">(),</span>
<span class="s2">&quot;Obj/test4[0][&#39;one&#39;]&quot;</span><span class="p">,</span>
<span class="s2">&quot;Attribute Obj/test4[0][&#39;one&#39;] [category:None] does not exist. (Nested lookups attempted)&quot;</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestBuilding.test_split_nested_attr"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestBuilding.test_split_nested_attr">[docs]</a> <span class="k">def</span> <span class="nf">test_split_nested_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -1908,7 +1984,7 @@
<span class="p">)</span></div></div>
<span class="kn">import</span> <span class="nn">evennia.commands.default.comms</span> <span class="k">as</span> <span class="nn">cmd_comms</span> <span class="c1"># noqa</span>
<span class="kn">from</span> <span class="nn">evennia.utils.create</span> <span class="kn">import</span> <span class="n">create_channel</span> <span class="c1"># noqa</span>
<div class="viewcode-block" id="TestCommsChannel"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestCommsChannel">[docs]</a><span class="k">class</span> <span class="nc">TestCommsChannel</span><span class="p">(</span><span class="n">CommandTest</span><span class="p">):</span>
@ -1922,7 +1998,7 @@
<span class="n">key</span><span class="o">=</span><span class="s2">&quot;testchannel&quot;</span><span class="p">,</span>
<span class="n">desc</span><span class="o">=</span><span class="s2">&quot;A test channel&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cmdchannel</span> <span class="o">=</span> <span class="n">comms</span><span class="o">.</span><span class="n">CmdChannel</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cmdchannel</span> <span class="o">=</span> <span class="n">cmd_comms</span><span class="o">.</span><span class="n">CmdChannel</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cmdchannel</span><span class="o">.</span><span class="n">account_caller</span> <span class="o">=</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="TestCommsChannel.tearDown"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestCommsChannel.tearDown">[docs]</a> <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>

View file

@ -1292,8 +1292,8 @@
<div class="viewcode-block" id="AttributeHandler.remove"><a class="viewcode-back" href="../../../api/evennia.typeclasses.attributes.html#evennia.typeclasses.attributes.AttributeHandler.remove">[docs]</a> <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span>
<span class="bp">self</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">raise_exception</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">raise_exception</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">accessing_obj</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">default_access</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="p">):</span>
@ -1304,11 +1304,11 @@
<span class="sd"> key (str or list, optional): An Attribute key to remove or a list of keys. If</span>
<span class="sd"> multiple keys, they must all be of the same `category`. If None and</span>
<span class="sd"> category is not given, remove all Attributes.</span>
<span class="sd"> category (str, optional): The category within which to</span>
<span class="sd"> remove the Attribute.</span>
<span class="sd"> raise_exception (bool, optional): If set, not finding the</span>
<span class="sd"> Attribute to delete will raise an exception instead of</span>
<span class="sd"> just quietly failing.</span>
<span class="sd"> category (str, optional): The category within which to</span>
<span class="sd"> remove the Attribute.</span>
<span class="sd"> accessing_obj (object, optional): An object to check</span>
<span class="sd"> against the `attredit` lock. If not given, the check will</span>
<span class="sd"> be skipped.</span>

View file

@ -439,12 +439,13 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">iterable</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="n">iterable</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">make_iter</span><span class="p">(</span><span class="n">iterable</span><span class="p">))</span>
<span class="n">len_iter</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">iterable</span><span class="p">)</span>
<span class="k">if</span> <span class="n">addquote</span><span class="p">:</span>
<span class="n">iterable</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&quot;</span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1">&quot;&#39;</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">iterable</span><span class="p">))</span>
<span class="n">iterable</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&quot;</span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1">&quot;&#39;</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">iterable</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">iterable</span><span class="p">))</span>
<span class="n">iterable</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">)</span>
<span class="k">if</span> <span class="n">endsep</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">):</span>
<span class="c1"># oxford comma alternative</span>