From f76affa6a748c7cee4fdf2122e9fe8f224bacb45 Mon Sep 17 00:00:00 2001 From: Aaron McMillin Date: Wed, 18 Sep 2019 23:08:10 -0400 Subject: [PATCH] [#1928] Edit existing nested --- evennia/commands/default/building.py | 15 ++++++++++++++- evennia/commands/default/tests.py | 9 ++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index 1dc61f1bdf..8a5a883338 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -1708,8 +1708,21 @@ class CmdSetAttribute(ObjManipCommand): return "\n%s has no attribute '%s'." % (obj.name, attr) def set_attr(self, obj, attr, value): + for key, nested_keys in self.split_nested_attr(attr): + if obj.attributes.has(key) and nested_keys: + acc_key = nested_keys[-1] + lookup_value = obj.attributes.get(key) + deep = self.do_nested_lookup(lookup_value, *nested_keys[:-1]) + if deep is not self.not_found: + # TODO - insert/append in lists + deep[acc_key] = value + value = lookup_value + attr = key + break + + verb = "Modified" if obj.attributes.has(attr) else "Created" try: - verb = "Modified" if obj.attributes.has(attr) else "Created" + obj.attributes.add(attr, value) return "\n%s attribute %s/%s = %s" % (verb, obj.name, attr, repr(value)) except SyntaxError: diff --git a/evennia/commands/default/tests.py b/evennia/commands/default/tests.py index 56e600e2b4..91d11bae13 100644 --- a/evennia/commands/default/tests.py +++ b/evennia/commands/default/tests.py @@ -541,6 +541,8 @@ class TestBuilding(CommandTest): self.call(building.CmdSetAttribute(), "Obj/test1", "Attribute Obj/test1 = [1, 2]") self.call(building.CmdSetAttribute(), "Obj/test1[0]", "Attribute Obj/test1[0] = 1") self.call(building.CmdSetAttribute(), "Obj/test1[1]", "Attribute Obj/test1[1] = 2") + self.call(building.CmdSetAttribute(), "Obj/test1[0] = 99", "Modified attribute Obj/test1 = [99, 2]") + self.call(building.CmdSetAttribute(), "Obj/test1[0]", "Attribute Obj/test1[0] = 99") # list delete self.call(building.CmdSetAttribute(), "Obj/test1[0] =", "Deleted attribute 'test1[0]' (= nested) from Obj.") @@ -553,12 +555,17 @@ class TestBuilding(CommandTest): self.call(building.CmdSetAttribute(), "Obj/test2", "Attribute Obj/test2 = {'one': 1, 'two': 2}") self.call(building.CmdSetAttribute(), "Obj/test2['one']", "Attribute Obj/test2['one'] = 1") self.call(building.CmdSetAttribute(), "Obj/test2['one]", "Attribute Obj/test2['one] = 1") + self.call(building.CmdSetAttribute(), + "Obj/test2['one']=99", "Modified attribute Obj/test2 = {'one': 99, 'two': 2}") + self.call(building.CmdSetAttribute(), "Obj/test2['one']", "Attribute Obj/test2['one'] = 99") self.call(building.CmdSetAttribute(), "Obj/test2['two']", "Attribute Obj/test2['two'] = 2") + self.call(building.CmdSetAttribute(), + "Obj/test2['three']=3", "Modified attribute Obj/test2 = {'one': 99, 'two': 2, 'three': 3}") # Dict delete self.call(building.CmdSetAttribute(), "Obj/test2['two'] =", "Deleted attribute 'test2['two']' (= nested) from Obj.") self.call(building.CmdSetAttribute(), "Obj/test2['two']", "Obj has no attribute 'test2['two']'.") - self.call(building.CmdSetAttribute(), "Obj/test2", "Attribute Obj/test2 = {'one': 1}") + self.call(building.CmdSetAttribute(), "Obj/test2", "Attribute Obj/test2 = {'one': 99, 'three': 3}") self.call(building.CmdSetAttribute(), "Obj/test2[0]", "Obj has no attribute 'test2[0]'.") # Deaper nesting