From 3ebc9316f98685a26163f60b67267675592392c5 Mon Sep 17 00:00:00 2001 From: Cal Date: Sat, 15 Feb 2025 15:06:33 -0700 Subject: [PATCH 1/2] fix attribute view in CmdSetAttribute --- evennia/commands/default/building.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index 710e6f87cb..8d52430e1d 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -1854,12 +1854,21 @@ class CmdSetAttribute(ObjManipCommand): nested = False for key, nested_keys in self.split_nested_attr(attr): nested = True - if obj.attributes.has(key): - val = obj.attributes.get(key) - val = self.do_nested_lookup(val, *nested_keys) - if val is not self.not_found: - return f"\nAttribute {obj.name}/|w{attr}|n [category:{category}] = {val}" - error = f"\nAttribute {obj.name}/|w{attr} [category:{category}] does not exist." + if obj.attributes.has(key, category): + if nested_keys: + val = obj.attributes.get(key, category=category) + deep = self.do_nested_lookup(val, *nested_keys[:-1]) + if deep is not self.not_found: + try: + val = deep[nested_keys[-1]] + except (IndexError, KeyError, TypeError): + continue + return f"\nAttribute {obj.name}/|w{attr}|n [category:{category}] = {val}" + else: + val = obj.attributes.get(key, category=category) + if val: + return f"\nAttribute {obj.name}/|w{attr}|n [category:{category}] = {val}" + error = f"\nAttribute {obj.name}/|w{attr}|n [category:{category}] does not exist." if nested: error += " (Nested lookups attempted)" return error From 2c8581bd41fe8d13046848a4d26d59a6d4c84592 Mon Sep 17 00:00:00 2001 From: Cal Date: Sat, 17 Jan 2026 12:22:54 -0700 Subject: [PATCH 2/2] add unit test --- evennia/commands/default/tests.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/evennia/commands/default/tests.py b/evennia/commands/default/tests.py index 5db4c14acd..2a25251265 100644 --- a/evennia/commands/default/tests.py +++ b/evennia/commands/default/tests.py @@ -1920,6 +1920,25 @@ class TestBuilding(BaseEvenniaCommandTest): building.CmdSpawn(), "/examine NO_EXISTS", "No prototype named 'NO_EXISTS' was found." ) + def test_setattr_view_with_category(self): + """ + Test checking attributes with a category, including nested attributes. + """ + self.obj1.attributes.add("test", "value", category="cat") + self.call( + building.CmdSetAttribute(), + "Obj/test:cat", + "Attribute Obj/test [category:cat] = value", + ) + + # nested dict + self.obj1.attributes.add("testdict", {"key": "value"}, category="cat") + self.call( + building.CmdSetAttribute(), + "Obj/testdict['key']:cat", + "Attribute Obj/testdict['key'] [category:cat] = value", + ) + import evennia.commands.default.comms as cmd_comms # noqa from evennia.comms.comms import DefaultChannel # noqa