From d5c916ecc3f61971451b590a47d8c74e7526f630 Mon Sep 17 00:00:00 2001 From: Owllex Date: Thu, 14 Apr 2022 23:35:04 -0700 Subject: [PATCH 1/3] Fix issue with init_evennia_properties. --- evennia/objects/tests.py | 12 +++++++++++- evennia/typeclasses/models.py | 5 +++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/evennia/objects/tests.py b/evennia/objects/tests.py index 6fe443cab8..95d3c20e3f 100644 --- a/evennia/objects/tests.py +++ b/evennia/objects/tests.py @@ -241,11 +241,17 @@ class TestObjectPropertiesClass(DefaultObject): testalias = AliasProperty() testperm = PermissionProperty() + @property + def base_property(self): + self.property_initialized = True + + class TestProperties(EvenniaTestCase): """ Test Properties. """ + def setUp(self): self.obj = create.create_object(TestObjectPropertiesClass, key="testobj") @@ -270,7 +276,7 @@ class TestProperties(EvenniaTestCase): self.assertFalse(obj.attributes.has("attr3")) self.assertEqual(obj.attr3, "attr3") - obj.attr3 = "attr3b" # stores it in db! + obj.attr3 = "attr3b" # stores it in db! self.assertEqual(obj.db.attr3, "attr3b") self.assertTrue(obj.attributes.has("attr3")) @@ -280,3 +286,7 @@ class TestProperties(EvenniaTestCase): self.assertTrue(obj.aliases.has("testalias")) self.assertTrue(obj.permissions.has("testperm")) + + # Verify that regular properties do not get fetched in init_evennia_properties, + # only Attribute or TagProperties. + self.assertFalse(hasattr(obj, "property_initialized")) diff --git a/evennia/typeclasses/models.py b/evennia/typeclasses/models.py index 2a71835e0c..44677aff05 100644 --- a/evennia/typeclasses/models.py +++ b/evennia/typeclasses/models.py @@ -39,11 +39,12 @@ from django.utils.text import slugify from evennia.typeclasses.attributes import ( Attribute, AttributeHandler, + AttributeProperty, ModelAttributeBackend, InMemoryAttributeBackend, ) from evennia.typeclasses.attributes import DbHolder -from evennia.typeclasses.tags import Tag, TagHandler, AliasHandler, PermissionHandler +from evennia.typeclasses.tags import Tag, TagHandler, AliasHandler, PermissionHandler, TagProperty from evennia.utils.idmapper.models import SharedMemoryModel, SharedMemoryModelBase from evennia.server.signals import SIGNAL_TYPED_OBJECT_POST_RENAME @@ -331,7 +332,7 @@ class TypedObject(SharedMemoryModel): by fetching them once. """ for propkey, prop in self.__class__.__dict__.items(): - if hasattr(prop, "__set_name__"): + if isinstance(prop, (AttributeProperty, TagProperty)): try: getattr(self, propkey) except Exception: From 014ae2e6e1150824151454728a0bda20ccd199f5 Mon Sep 17 00:00:00 2001 From: Owllex Date: Fri, 15 Apr 2022 08:34:20 -0700 Subject: [PATCH 2/3] Update to support subclasses. --- evennia/objects/tests.py | 15 +++++++++++++++ evennia/typeclasses/models.py | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/evennia/objects/tests.py b/evennia/objects/tests.py index 95d3c20e3f..a718d9b01b 100644 --- a/evennia/objects/tests.py +++ b/evennia/objects/tests.py @@ -232,12 +232,22 @@ class TestContentHandler(BaseEvenniaTest): self.assertEqual(self.room2.contents, [self.obj1, self.obj2]) +class SubAttributeProperty(AttributeProperty): + pass + + +class SubTagProperty(TagProperty): + pass + + class TestObjectPropertiesClass(DefaultObject): attr1 = AttributeProperty(default="attr1") attr2 = AttributeProperty(default="attr2", category="attrcategory") attr3 = AttributeProperty(default="attr3", autocreate=False) + attr4 = SubAttributeProperty(default="attr4") tag1 = TagProperty() tag2 = TagProperty(category="tagcategory") + tag3 = SubTagProperty() testalias = AliasProperty() testperm = PermissionProperty() @@ -276,6 +286,10 @@ class TestProperties(EvenniaTestCase): self.assertFalse(obj.attributes.has("attr3")) self.assertEqual(obj.attr3, "attr3") + self.assertEqual(obj.db.attr4, "attr4") + self.assertEqual(obj.attributes.get("attr4"), "attr4") + self.assertEqual(obj.attr4, "attr4") + obj.attr3 = "attr3b" # stores it in db! self.assertEqual(obj.db.attr3, "attr3b") @@ -283,6 +297,7 @@ class TestProperties(EvenniaTestCase): self.assertTrue(obj.tags.has("tag1")) self.assertTrue(obj.tags.has("tag2", category="tagcategory")) + self.assertTrue(obj.tags.has("tag3")) self.assertTrue(obj.aliases.has("testalias")) self.assertTrue(obj.permissions.has("testperm")) diff --git a/evennia/typeclasses/models.py b/evennia/typeclasses/models.py index 44677aff05..ca2be2fc03 100644 --- a/evennia/typeclasses/models.py +++ b/evennia/typeclasses/models.py @@ -332,7 +332,7 @@ class TypedObject(SharedMemoryModel): by fetching them once. """ for propkey, prop in self.__class__.__dict__.items(): - if isinstance(prop, (AttributeProperty, TagProperty)): + if inherits_from(prop, AttributeProperty) or inherits_from(prop, TagProperty): try: getattr(self, propkey) except Exception: From 667b12830c68ef38c1aa070f040a9a93b9961e29 Mon Sep 17 00:00:00 2001 From: Owllex Date: Fri, 15 Apr 2022 13:56:37 -0700 Subject: [PATCH 3/3] Revert back to using isinstance. --- evennia/typeclasses/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evennia/typeclasses/models.py b/evennia/typeclasses/models.py index ca2be2fc03..44677aff05 100644 --- a/evennia/typeclasses/models.py +++ b/evennia/typeclasses/models.py @@ -332,7 +332,7 @@ class TypedObject(SharedMemoryModel): by fetching them once. """ for propkey, prop in self.__class__.__dict__.items(): - if inherits_from(prop, AttributeProperty) or inherits_from(prop, TagProperty): + if isinstance(prop, (AttributeProperty, TagProperty)): try: getattr(self, propkey) except Exception: