Fix unhandled exception in show file command
authorJeremy Stanley <fungi@yuggoth.org>
Wed, 27 Sep 2017 16:52:45 +0000 (16:52 +0000)
committerJeremy Stanley <fungi@yuggoth.org>
Wed, 27 Sep 2017 16:52:45 +0000 (16:52 +0000)
When generating the list of nodes from a file for the "show file"
command output, treat the data attribute as a list rather than a
dict. Previously, use of this command would crash the interpreter on
an unhandled exception attempting to invoke a nonexistent (since the
data model conversion) .keys() method.

While we're here, correct the output preamble to refer to the file
contents as "nodes" instead of "elements since it also includes
non-element nodes. Also correct the error message when a nonexistent
file is requested to say "file" instead of "category" (this was
probably cut-n-pasted from "show categories" and missed getting
updated).

For future safety, add a selftest to exercise the "show files"
command.

mudpy/misc.py
mudpy/tests/selftest.py

index 32c0d68..ebccc26 100644 (file)
@@ -2164,14 +2164,13 @@ def command_show(actor, parameters):
         if len(arguments) != 2:
             message = "You must specify one file."
         elif arguments[1] in universe.files:
-            message = ('These are the elements in the "' + arguments[1]
+            message = ('These are the nodes in the "' + arguments[1]
                        + '" file:$(eol)')
-            elements = universe.files[arguments[1]].data.keys()
-            elements.sort()
+            elements = sorted(universe.files[arguments[1]].data)
             for element in elements:
                 message += "$(eol)   $(grn)" + element + "$(nrm)"
         else:
-            message = 'Category "' + arguments[1] + '" does not exist.'
+            message = 'File "%s" does not exist.' % arguments[1]
     elif arguments[0] == "element":
         if len(arguments) != 2:
             message = "You must specify one element."
index 261fa06..a7fefc2 100644 (file)
@@ -2,6 +2,7 @@
 # to use, copy, modify, and distribute this software is granted under
 # terms provided in the LICENSE file distributed with this software.
 
+import os
 import re
 import sys
 import telnetlib
@@ -177,6 +178,12 @@ test_show_files = (
         r' \x1b\[33m\[private\]\x1b\[0m.*> ', ""),
 )
 
+test_show_file = (
+    (2, "> ", "show file %s" %
+        os.path.join(os.getcwd(), "data/internal.yaml")),
+    (2, "These are the nodes in the.*file:.*internal:counters.*> ", ""),
+)
+
 test_show_element = (
     (2, "> ", "show element mudpy.limit"),
     (2, r'These are the properties of the "mudpy\.limit" element.*'
@@ -228,6 +235,7 @@ dialogue = (
     (test_set_facet, "set facet"),
     (test_set_refused, "refuse altering read-only element"),
     (test_show_files, "show a list of loaded files"),
+    (test_show_file, "show nodes from a specific file"),
     (test_show_element, "show element"),
     (test_show_log, "show log"),
     (test_custom_loglevel, "custom loglevel"),