diff --git a/CHANGELOG.md b/CHANGELOG.md index 41e72dc57e..cd0f28466b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,9 @@ from in-game with default command (chiizujin) - [Feature][issue3450]: The default `page` command now tags its `Msg` objects with tag 'page' (category 'comms') and also checks the `Msg`' 'read' lock. - made backwards compatible for old pages. + made backwards compatible for old pages (Griatch) +- Feature: Clean up the default Command variable list shown when a command has + no `func()` defined (Griatch) - [Fix][pull3446]: Use plural ('no apples') instead of singular ('no apple') in `get_numbered_name` for better grammatical form (InspectorCaracal) - [Fix][pull3453]: Object aliases not showing in search multi-match @@ -29,6 +31,8 @@ way (chiizujin) - [Fix][pull3464]: EvEditor range:range specification didn't return correct range (chiizujin) +- [Fix][issue3462]: EvEditor :UU and :DD etc commands were not properly + differentiating from their lower-case alternatives (Griatch) - Doc: Added Beginner Tutorial lessons for AI, Quests and Procedural dungeon (Griatch) - Doc fixes (Griatch, InspectorCaracal) @@ -45,6 +49,7 @@ [pull3464]: https://github.com/evennia/evennia/pull/3464 [pull3467]: https://github.com/evennia/evennia/pull/3467 [issue3450]: https://github.com/evennia/evennia/issues/3450 +[issue3462]: https://github.com/evennia/evennia/issues/3462 ## Evennia 4.0.0 diff --git a/evennia/commands/cmdhandler.py b/evennia/commands/cmdhandler.py index 45605f758b..0da3039aaa 100644 --- a/evennia/commands/cmdhandler.py +++ b/evennia/commands/cmdhandler.py @@ -36,14 +36,13 @@ from weakref import WeakValueDictionary from django.conf import settings from django.utils.translation import gettext as _ -from twisted.internet import reactor -from twisted.internet.defer import inlineCallbacks, returnValue -from twisted.internet.task import deferLater - from evennia.commands.cmdset import CmdSet from evennia.commands.command import InterruptCommand from evennia.utils import logger, utils from evennia.utils.utils import string_suggestions +from twisted.internet import reactor +from twisted.internet.defer import inlineCallbacks, returnValue +from twisted.internet.task import deferLater _IN_GAME_ERRORS = settings.IN_GAME_ERRORS diff --git a/evennia/commands/command.py b/evennia/commands/command.py index 1bc0a49764..3d0d93dbff 100644 --- a/evennia/commands/command.py +++ b/evennia/commands/command.py @@ -11,7 +11,6 @@ import re from django.conf import settings from django.urls import reverse from django.utils.text import slugify - from evennia.locks.lockhandler import LockHandler from evennia.utils.ansi import ANSIString from evennia.utils.evtable import EvTable @@ -20,6 +19,7 @@ from evennia.utils.utils import fill, is_iter, lazy_property, make_iter CMD_IGNORE_PREFIXES = settings.CMD_IGNORE_PREFIXES + class InterruptCommand(Exception): """Cleanly interrupt a command.""" @@ -487,31 +487,29 @@ class Command(metaclass=CommandMeta): purposes when making commands. """ - variables = "\n".join( - " |w{}|n ({}): {}".format(key, type(val), val) for key, val in self.__dict__.items() - ) - string = f""" -Command {self} has no defined `func()` - showing on-command variables: -{variables} - """ - # a simple test command to show the available properties - string += "-" * 50 - string += "\n|w%s|n - Command variables from evennia:\n" % self.key - string += "-" * 50 - string += "\nname of cmd (self.key): |w%s|n\n" % self.key - string += "cmd aliases (self.aliases): |w%s|n\n" % self.aliases - string += "cmd locks (self.locks): |w%s|n\n" % self.locks - string += "help category (self.help_category): |w%s|n\n" % self.help_category.capitalize() - string += "object calling (self.caller): |w%s|n\n" % self.caller - string += "object storing cmdset (self.obj): |w%s|n\n" % self.obj - string += "command string given (self.cmdstring): |w%s|n\n" % self.cmdstring - # show cmdset.key instead of cmdset to shorten output - string += fill( - "current cmdset (self.cmdset): |w%s|n\n" - % (self.cmdset.key if self.cmdset.key else self.cmdset.__class__) - ) + output_string = """ +Command \"{cmdname}\" has no defined `func()` method. Available properties on this command are: - self.msg(string) + {variables}""" + variables = [" |w{}|n ({}): {}".format( + key, type(val), f'"{val}"' if isinstance(val, str) else val + ) + for key, val in + (("self.key", self.key), + ("self.cmdname", self.cmdstring), + ("self.raw_cmdname", self.raw_cmdname), + ("self.raw_string", self.raw_string), + ("self.aliases", self.aliases), + ("self.args", self.args), + ("self.caller", self.caller), + ("self.obj", self.obj), + ("self.session", self.session), + ("self.locks", self.locks), + ("self.help_category", self.help_category), + ("self.cmdset", self.cmdset)) + ] + output = output_string.format(cmdname=self.key, variables="\n ".join(variables)) + self.msg(output) def func(self): """ diff --git a/evennia/utils/eveditor.py b/evennia/utils/eveditor.py index 0def632759..f0f2168fca 100644 --- a/evennia/utils/eveditor.py +++ b/evennia/utils/eveditor.py @@ -43,7 +43,6 @@ import re from django.conf import settings from django.utils.translation import gettext as _ - from evennia import CmdSet from evennia.commands import cmdhandler from evennia.utils import dedent, fill, is_iter, justify, logger, to_str, utils @@ -468,7 +467,8 @@ class CmdEditorGroup(CmdEditorBase): linebuffer = self.linebuffer lstart, lend = self.lstart, self.lend - cmd = self.cmdstring + # preserve the cmdname including case (otherwise uu and UU would be the same) + cmd = self.raw_string[:len(self.cmdstring)] echo_mode = self.editor._echo_mode if cmd == ":": diff --git a/evennia/utils/tests/test_eveditor.py b/evennia/utils/tests/test_eveditor.py index 7e538e39c4..97bda62630 100644 --- a/evennia/utils/tests/test_eveditor.py +++ b/evennia/utils/tests/test_eveditor.py @@ -13,7 +13,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01\n[l:01 w:000 c:0000](:h for help)", ) self.call(eveditor.CmdLineInput(), "line 1", raw_string="line 1", msg="01line 1") @@ -24,7 +24,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", # list whole buffer - cmdstring=":", + raw_string=":", msg="Line Editor []\n01line 1\n02line 2\n" "03line 3\n04line 4\n05line 5\n" "[l:05 w:010 c:0034](:h for help)", @@ -32,7 +32,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), ":", # list empty range - cmdstring=":", + raw_string=":", msg="Line Editor []\n01line 1\n02line 2\n" "03line 3\n04line 4\n05line 5\n" "[l:05 w:010 c:0034](:h for help)", @@ -40,7 +40,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), ":4", # list from start to line 4 - cmdstring=":", + raw_string=":", msg="Line Editor []\n01line 1\n02line 2\n" "03line 3\n04line 4\n" "[l:04 w:008 c:0027](:h for help)", @@ -48,7 +48,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "2:", # list from line 2 to end - cmdstring=":", + raw_string=":", msg="Line Editor []\n02line 2\n03line 3\n" "04line 4\n05line 5\n" "[l:04 w:008 c:0027](:h for help)", @@ -56,7 +56,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "-10:10", # try to list invalid range (too large) - cmdstring=":", + raw_string=":", msg="Line Editor []\n01line 1\n02line 2\n" "03line 3\n04line 4\n05line 5\n" "[l:05 w:010 c:0034](:h for help)", @@ -64,7 +64,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "3:1", # try to list invalid range (reversed) - cmdstring=":", + raw_string=":", msg="Line Editor []\n03line 3\n" "[l:01 w:002 c:0006](:h for help)", ) @@ -74,14 +74,14 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":h", + raw_string=":h", msg=" - any non-command is appended to the end of the buffer.", ) # empty buffer self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01\n[l:01 w:000 c:0000](:h for help)", ) # input a string @@ -102,49 +102,49 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", # view buffer + raw_string=":", # view buffer msg="Line Editor []\n01First test line\n" "02Second test line\n[l:02 w:006 c:0032](:h for help)", ) self.call( eveditor.CmdEditorGroup(), "", - cmdstring="::", # view buffer, no linenums + raw_string="::", # view buffer, no linenums msg="Line Editor []\nFirst test line\n" "Second test line\n[l:02 w:006 c:0032](:h for help)", ) self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":::", # add single : alone on row + raw_string=":::", # add single : alone on row msg="Single ':' added to buffer.", ) self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01First test line\n" "02Second test line\n03:\n[l:03 w:007 c:0034](:h for help)", ) self.call( - eveditor.CmdEditorGroup(), "", cmdstring=":dd", msg="Deleted line 3." # delete line + eveditor.CmdEditorGroup(), "", raw_string=":dd", msg="Deleted line 3." # delete line ) self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "First test line\nSecond test line") - self.call(eveditor.CmdEditorGroup(), "", cmdstring=":u", msg="Undid one step.") # undo + self.call(eveditor.CmdEditorGroup(), "", raw_string=":u", msg="Undid one step.") # undo self.assertEqual( self.char1.ndb._eveditor.get_buffer(), "First test line\nSecond test line\n:" ) - self.call(eveditor.CmdEditorGroup(), "", cmdstring=":uu", msg="Redid one step.") # redo + self.call(eveditor.CmdEditorGroup(), "", raw_string=":uu", msg="Redid one step.") # redo self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "First test line\nSecond test line") - self.call(eveditor.CmdEditorGroup(), "", cmdstring=":u", msg="Undid one step.") # undo + self.call(eveditor.CmdEditorGroup(), "", raw_string=":u", msg="Undid one step.") # undo self.assertEqual( self.char1.ndb._eveditor.get_buffer(), "First test line\nSecond test line\n:" ) self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01First test line\n" "02Second test line\n03:\n[l:03 w:007 c:0034](:h for help)", ) @@ -152,31 +152,31 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "Second", - cmdstring=":dw", # delete by word + raw_string=":dw", # delete by word msg="Removed Second for lines 1-4.", ) - self.call(eveditor.CmdEditorGroup(), "", cmdstring=":u", msg="Undid one step.") # undo + self.call(eveditor.CmdEditorGroup(), "", raw_string=":u", msg="Undid one step.") # undo self.call( eveditor.CmdEditorGroup(), "2 Second", - cmdstring=":dw", # delete by word/line + raw_string=":dw", # delete by word/line msg="Removed Second for line 2.", ) self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "First test line\n test line\n:") self.call( - eveditor.CmdEditorGroup(), "2", cmdstring=":p", msg="Copy buffer is empty." # paste + eveditor.CmdEditorGroup(), "2", raw_string=":p", msg="Copy buffer is empty." # paste ) self.call( eveditor.CmdEditorGroup(), "2", - cmdstring=":y", # yank + raw_string=":y", # yank msg="Line 2, [' test line'] yanked.", ) self.call( eveditor.CmdEditorGroup(), "2", - cmdstring=":p", # paste + raw_string=":p", # paste msg="Pasted buffer [' test line'] to line 2.", ) self.assertEqual( @@ -184,31 +184,31 @@ class TestEvEditor(BaseEvenniaCommandTest): ) self.call( - eveditor.CmdEditorGroup(), "3", cmdstring=":x", msg="Line 3, [' test line'] cut." # cut + eveditor.CmdEditorGroup(), "3", raw_string=":x", msg="Line 3, [' test line'] cut." # cut ) self.call( eveditor.CmdEditorGroup(), "2 New Second line", - cmdstring=":i", # insert + raw_string=":i", # insert msg="Inserted 1 new line(s) at line 2.", ) self.call( eveditor.CmdEditorGroup(), "2 New Replaced Second line", # replace - cmdstring=":r", + raw_string=":r", msg="Replaced 1 line(s) at line 2.", ) self.call( eveditor.CmdEditorGroup(), "2 Inserted-", # insert beginning line - cmdstring=":I", + raw_string=":I", msg="Inserted text at beginning of line 2.", ) self.call( eveditor.CmdEditorGroup(), "2 -End", # append end line - cmdstring=":A", + raw_string=":A", msg="Appended text to end of line 2.", ) @@ -229,7 +229,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01\n[l:01 w:000 c:0000](:h for help)", ) self.call( @@ -250,7 +250,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":UU", + raw_string=":UU", msg="Reverted all changes to the buffer back to original state.", ) self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "") @@ -260,7 +260,7 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01\n[l:01 w:000 c:0000](:h for help)", ) self.call(eveditor.CmdLineInput(), "line 1.", raw_string="line 1.", msg="01line 1.") @@ -269,20 +269,20 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "2:3", - cmdstring=":", + raw_string=":", msg="Line Editor []\n02line 2.\n03line 3.\n[l:02 w:004 c:0015](:h for help)", ) self.call( eveditor.CmdEditorGroup(), "1:2 line LINE", - cmdstring=":s", + raw_string=":s", msg="Search-replaced line -> LINE for lines 1-2.", ) self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "LINE 1.\nLINE 2.\nline 3.") self.call( eveditor.CmdEditorGroup(), "line MINE", - cmdstring=":s", + raw_string=":s", msg="Search-replaced line -> MINE for lines 1-3.", ) self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "LINE 1.\nLINE 2.\nMINE 3.") @@ -292,14 +292,14 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01\n[l:01 w:000 c:0000](:h for help)", ) self.call(eveditor.CmdLineInput(), "line 1.", raw_string="line 1.", msg="01line 1.") self.call(eveditor.CmdLineInput(), "line 2.", raw_string="line 2.", msg="02line 2.") self.call(eveditor.CmdLineInput(), "line 3.", raw_string="line 3.", msg="03line 3.") self.call( - eveditor.CmdEditorGroup(), "", cmdstring=":DD", msg="Cleared 3 lines from buffer." + eveditor.CmdEditorGroup(), "", raw_string=":DD", msg="Cleared 3 lines from buffer." ) self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "") @@ -308,11 +308,11 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01\n[l:01 w:000 c:0000](:h for help)", ) self.call(eveditor.CmdLineInput(), "line 1", raw_string="line 1", msg="01line 1") - self.call(eveditor.CmdEditorGroup(), "1:2", cmdstring=":f", msg="Flood filled line 1.") + self.call(eveditor.CmdEditorGroup(), "1:2", raw_string=":f", msg="Flood filled line 1.") self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "line 1") def test_eveditor_COLON_J(self): @@ -320,16 +320,16 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01\n[l:01 w:000 c:0000](:h for help)", ) self.call(eveditor.CmdLineInput(), "line 1", raw_string="line 1", msg="01line 1") self.call(eveditor.CmdLineInput(), "l 2", raw_string="l 2", msg="02l 2") self.call(eveditor.CmdLineInput(), "l 3", raw_string="l 3", msg="03l 3") self.call(eveditor.CmdLineInput(), "l 4", raw_string="l 4", msg="04l 4") - self.call(eveditor.CmdEditorGroup(), "2 r", cmdstring=":j", msg="Right-justified line 2.") - self.call(eveditor.CmdEditorGroup(), "3 c", cmdstring=":j", msg="Center-justified line 3.") - self.call(eveditor.CmdEditorGroup(), "4 f", cmdstring=":j", msg="Full-justified line 4.") + self.call(eveditor.CmdEditorGroup(), "2 r", raw_string=":j", msg="Right-justified line 2.") + self.call(eveditor.CmdEditorGroup(), "3 c", raw_string=":j", msg="Center-justified line 3.") + self.call(eveditor.CmdEditorGroup(), "4 f", raw_string=":j", msg="Full-justified line 4.") l1, l2, l3, l4 = tuple(self.char1.ndb._eveditor.get_buffer().split("\n")) self.assertEqual(l1, "line 1") self.assertEqual(l2, " " * 75 + "l 2") @@ -341,44 +341,44 @@ class TestEvEditor(BaseEvenniaCommandTest): self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":", + raw_string=":", msg="Line Editor []\n01\n[l:01 w:000 c:0000](:h for help)", ) self.call(eveditor.CmdLineInput(), "line 1.", raw_string="line 1.", msg="01line 1.") self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":dw", + raw_string=":dw", msg="You must give a search word to delete.", ) # self.call( # eveditor.CmdEditorGroup(), # raw_string="", - # cmdstring=":i", + # raw_string=":i", # msg="You need to enter a new line and where to insert it.", # ) # self.call( # eveditor.CmdEditorGroup(), # "", - # cmdstring=":I", + # raw_string=":I", # msg="You need to enter text to insert.", # ) # self.call( # eveditor.CmdEditorGroup(), # "", - # cmdstring=":r", + # raw_string=":r", # msg="You need to enter a replacement string.", # ) self.call( eveditor.CmdEditorGroup(), "", - cmdstring=":s", + raw_string=":s", msg="You must give a search word and something to replace it with.", ) # self.call( # eveditor.CmdEditorGroup(), # "", - # cmdstring=":f", + # raw_string=":f", # msg="Valid justifications are [f]ull (default), [c]enter, [r]right or [l]eft" # ) self.assertEqual(self.char1.ndb._eveditor.get_buffer(), "line 1.")