From 6f90dd5a1f489e148a0ad2abff67a0eadcb5c2d4 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Mon, 2 Nov 2020 14:25:28 -0600 Subject: [PATCH 1/8] use self.__class__.__name__ instead of hardcoding class names when overriding __repr__ --- traits/adaptation/adaptation_offer.py | 5 +++-- traits/trait_dict_object.py | 8 ++++++-- traits/trait_list_object.py | 8 ++++++-- traits/trait_set_object.py | 7 +++++-- traits/util/weakiddict.py | 4 +++- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/traits/adaptation/adaptation_offer.py b/traits/adaptation/adaptation_offer.py index a78181a83..cf2c41c03 100644 --- a/traits/adaptation/adaptation_offer.py +++ b/traits/adaptation/adaptation_offer.py @@ -28,12 +28,13 @@ class AdaptationOffer(HasTraits): def __repr__(self): """ Return a string representation of the object. """ - template = " '{to}'>" + template = "<{class_name}: '{from_}' -> '{to}'>" + class_name = self.__class__.__name__ from_ = self.from_protocol_name to = self.to_protocol_name - return template.format(from_=from_, to=to) + return template.format(class_name=class_name, from_=from_, to=to) #### 'AdaptationOffer' protocol ########################################### diff --git a/traits/trait_dict_object.py b/traits/trait_dict_object.py index fcf929b8b..d93688a44 100644 --- a/traits/trait_dict_object.py +++ b/traits/trait_dict_object.py @@ -53,8 +53,12 @@ def __init__(self, *, removed=None, added=None, changed=None): self.changed = changed def __repr__(self): - return "TraitDictEvent(removed={!r}, added={!r}, changed={!r})".format( - self.removed, self.added, self.changed + return ( + "{event.__class__.__name__}(" + "removed={event.removed!r}, " + "added={event.added!r}, " + "changed={event.changed!r}" + ")".format(event=self) ) diff --git a/traits/trait_list_object.py b/traits/trait_list_object.py index 3c74848c0..d61af60a0 100644 --- a/traits/trait_list_object.py +++ b/traits/trait_list_object.py @@ -54,8 +54,12 @@ def __init__(self, index=0, removed=None, added=None): self.added = added def __repr__(self): - return "TraitListEvent(index={!r}, removed={!r}, added={!r})".format( - self.index, self.removed, self.added + return ( + "{event.__class__.__name__}(" + "index={event.index!r}, " + "removed={event.removed!r}, " + "added={event.added!r}" + ")".format(event=self) ) diff --git a/traits/trait_set_object.py b/traits/trait_set_object.py index bc63131d0..1f2aa7e25 100644 --- a/traits/trait_set_object.py +++ b/traits/trait_set_object.py @@ -47,8 +47,11 @@ def __init__(self, *, removed=None, added=None): self.added = added def __repr__(self): - return "TraitSetEvent(removed={!r}, added={!r})".format( - self.removed, self.added + return ( + "{event.__class__.__name__}(" + "removed={event.removed!r}, " + "added={event.added!r}" + ")".format(event=self) ) diff --git a/traits/util/weakiddict.py b/traits/util/weakiddict.py index 8e358365d..cd8844e21 100644 --- a/traits/util/weakiddict.py +++ b/traits/util/weakiddict.py @@ -43,7 +43,9 @@ def __init__(self, dict=None): self.update(dict) def __repr__(self): - return "".format(id(self)) + return "<{self.__class__.__name__} at 0x{0:x}>".format( + id(self), self=self + ) def __delitem__(self, key): del self.data[id(key)] From 129d2b533cbe8b5cf2b733fdc2aae91b2bc42c31 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Mon, 2 Nov 2020 14:48:29 -0600 Subject: [PATCH 2/8] adding trivial tests for the reprs --- traits/adaptation/tests/test_adaptation_offer.py | 15 +++++++++++++++ traits/tests/test_trait_dict_object.py | 12 +++++++++++- traits/tests/test_trait_list_object.py | 7 +++++++ traits/tests/test_trait_set_object.py | 12 +++++++++++- traits/util/tests/test_weakidddict.py | 7 +++++++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/traits/adaptation/tests/test_adaptation_offer.py b/traits/adaptation/tests/test_adaptation_offer.py index 29d8852d8..48a0c48ab 100644 --- a/traits/adaptation/tests/test_adaptation_offer.py +++ b/traits/adaptation/tests/test_adaptation_offer.py @@ -56,3 +56,18 @@ def test_lazy_loading(self): from traits.adaptation.tests.lazy_examples import IFoo self.assertIs(to_protocol, IFoo) + + def test_adaptation_offer_str_representation(self): + """ test string representation of the AdaptationOffer class. """ + + class Foo: + pass + + class Bar: + pass + + desired_repr = (" 'test_adaptation_offer.Bar'>") + adaptation_offer = AdaptationOffer(from_protocol=Foo, to_protocol=Bar) + self.assertEqual(desired_repr, str(adaptation_offer)) + self.assertEqual(desired_repr, repr(adaptation_offer)) diff --git a/traits/tests/test_trait_dict_object.py b/traits/tests/test_trait_dict_object.py index 5e185c83f..29c2a34c1 100644 --- a/traits/tests/test_trait_dict_object.py +++ b/traits/tests/test_trait_dict_object.py @@ -15,7 +15,7 @@ from unittest import mock from traits.api import HasTraits -from traits.trait_dict_object import TraitDict, TraitDictObject +from traits.trait_dict_object import TraitDict, TraitDictEvent, TraitDictObject from traits.trait_errors import TraitError from traits.trait_types import Dict, Int, Str @@ -433,3 +433,13 @@ def test_trait_dict_object_pickle(self): tdo_unpickled.value_validator("1") tdo_unpickled.value_validator(1) tdo_unpickled.value_validator(True) + + +class TestTraitDictEvent(unittest.TestCase): + + def test_trait_dict_event_str_representation(self): + """ test string representation of the TraitDictEvent class. """ + desired_repr = "TraitDictEvent(removed={}, added={}, changed={})" + trait_dict_event = TraitDictEvent() + self.assertEqual(desired_repr, str(trait_dict_event)) + self.assertEqual(desired_repr, repr(trait_dict_event)) diff --git a/traits/tests/test_trait_list_object.py b/traits/tests/test_trait_list_object.py index 8af740cb4..65523907a 100644 --- a/traits/tests/test_trait_list_object.py +++ b/traits/tests/test_trait_list_object.py @@ -93,6 +93,13 @@ def test_defaults(self): self.assertEqual(event.removed, []) self.assertEqual(event.added, []) + def test_trait_list_event_str_representation(self): + """ test string representation of the TraitListEvent class. """ + desired_repr = "TraitListEvent(index=0, removed=[], added=[])" + trait_list_event = TraitListEvent() + self.assertEqual(desired_repr, str(trait_list_event)) + self.assertEqual(desired_repr, repr(trait_list_event)) + class TestTraitList(unittest.TestCase): diff --git a/traits/tests/test_trait_set_object.py b/traits/tests/test_trait_set_object.py index 4f17dda76..8748cb04c 100644 --- a/traits/tests/test_trait_set_object.py +++ b/traits/tests/test_trait_set_object.py @@ -14,7 +14,7 @@ from traits.api import HasTraits, Set, Str from traits.trait_base import _validate_everything from traits.trait_errors import TraitError -from traits.trait_set_object import TraitSet +from traits.trait_set_object import TraitSet, TraitSetEvent from traits.trait_types import _validate_int @@ -516,3 +516,13 @@ class Foo(HasTraits): # then notifier.assert_not_called() + + +class TestTraitSetEvent(unittest.TestCase): + + def test_trait_set_event_str_representation(self): + """ test string representation of the TraitSetEvent class. """ + desired_repr = "TraitSetEvent(removed=set(), added=set())" + trait_set_event = TraitSetEvent() + self.assertEqual(desired_repr, str(trait_set_event)) + self.assertEqual(desired_repr, repr(trait_set_event)) diff --git a/traits/util/tests/test_weakidddict.py b/traits/util/tests/test_weakidddict.py index a9d85864a..86a2bc1e2 100644 --- a/traits/util/tests/test_weakidddict.py +++ b/traits/util/tests/test_weakidddict.py @@ -123,3 +123,10 @@ def test_weak_keys_values(self): self.assertEqual(len(wd), 1) del values[0:2] self.assertEqual(len(wd), 0) + + def test_weak_id_dict_str_representation(self): + """ test string representation of the WeakIDDict class. """ + weak_id_dict = WeakIDDict() + desired_repr = "".format(id(weak_id_dict)) + self.assertEqual(desired_repr, str(weak_id_dict)) + self.assertEqual(desired_repr, repr(weak_id_dict)) From ffdbe80b91bcd621a0f2163b893d33e13ca31994 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Mon, 2 Nov 2020 17:02:45 -0600 Subject: [PATCH 3/8] making test not so hardcoded so that it still passes on CI --- traits/adaptation/tests/test_adaptation_offer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/traits/adaptation/tests/test_adaptation_offer.py b/traits/adaptation/tests/test_adaptation_offer.py index 48a0c48ab..69bb64142 100644 --- a/traits/adaptation/tests/test_adaptation_offer.py +++ b/traits/adaptation/tests/test_adaptation_offer.py @@ -66,8 +66,10 @@ class Foo: class Bar: pass - desired_repr = (" 'test_adaptation_offer.Bar'>") adaptation_offer = AdaptationOffer(from_protocol=Foo, to_protocol=Bar) + desired_repr = " '{}'>".format( + adaptation_offer.from_protocol_name, + adaptation_offer.to_protocol_name + ) self.assertEqual(desired_repr, str(adaptation_offer)) self.assertEqual(desired_repr, repr(adaptation_offer)) From ed308c67149bd2a72bb7ca68c9b01dc7afa2d0d8 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 3 Nov 2020 07:48:38 -0600 Subject: [PATCH 4/8] using f strings and capitalizing docstrings --- traits/adaptation/adaptation_offer.py | 9 ++------- traits/tests/test_trait_dict_object.py | 2 +- traits/tests/test_trait_list_object.py | 2 +- traits/tests/test_trait_set_object.py | 2 +- traits/trait_dict_object.py | 9 ++++----- traits/trait_list_object.py | 9 ++++----- traits/trait_set_object.py | 7 +++---- traits/util/weakiddict.py | 4 +--- 8 files changed, 17 insertions(+), 27 deletions(-) diff --git a/traits/adaptation/adaptation_offer.py b/traits/adaptation/adaptation_offer.py index cf2c41c03..4dea6cdfe 100644 --- a/traits/adaptation/adaptation_offer.py +++ b/traits/adaptation/adaptation_offer.py @@ -28,13 +28,8 @@ class AdaptationOffer(HasTraits): def __repr__(self): """ Return a string representation of the object. """ - template = "<{class_name}: '{from_}' -> '{to}'>" - - class_name = self.__class__.__name__ - from_ = self.from_protocol_name - to = self.to_protocol_name - - return template.format(class_name=class_name, from_=from_, to=to) + return (f"<{self.__class__.__name__}: '{self.from_protocol_name}' " + f"-> '{self.to_protocol_name}'>") #### 'AdaptationOffer' protocol ########################################### diff --git a/traits/tests/test_trait_dict_object.py b/traits/tests/test_trait_dict_object.py index 29c2a34c1..d8e0601ff 100644 --- a/traits/tests/test_trait_dict_object.py +++ b/traits/tests/test_trait_dict_object.py @@ -438,7 +438,7 @@ def test_trait_dict_object_pickle(self): class TestTraitDictEvent(unittest.TestCase): def test_trait_dict_event_str_representation(self): - """ test string representation of the TraitDictEvent class. """ + """ Test string representation of the TraitDictEvent class. """ desired_repr = "TraitDictEvent(removed={}, added={}, changed={})" trait_dict_event = TraitDictEvent() self.assertEqual(desired_repr, str(trait_dict_event)) diff --git a/traits/tests/test_trait_list_object.py b/traits/tests/test_trait_list_object.py index 65523907a..0883d3a28 100644 --- a/traits/tests/test_trait_list_object.py +++ b/traits/tests/test_trait_list_object.py @@ -94,7 +94,7 @@ def test_defaults(self): self.assertEqual(event.added, []) def test_trait_list_event_str_representation(self): - """ test string representation of the TraitListEvent class. """ + """ Test string representation of the TraitListEvent class. """ desired_repr = "TraitListEvent(index=0, removed=[], added=[])" trait_list_event = TraitListEvent() self.assertEqual(desired_repr, str(trait_list_event)) diff --git a/traits/tests/test_trait_set_object.py b/traits/tests/test_trait_set_object.py index 8748cb04c..e2a156787 100644 --- a/traits/tests/test_trait_set_object.py +++ b/traits/tests/test_trait_set_object.py @@ -521,7 +521,7 @@ class Foo(HasTraits): class TestTraitSetEvent(unittest.TestCase): def test_trait_set_event_str_representation(self): - """ test string representation of the TraitSetEvent class. """ + """ Test string representation of the TraitSetEvent class. """ desired_repr = "TraitSetEvent(removed=set(), added=set())" trait_set_event = TraitSetEvent() self.assertEqual(desired_repr, str(trait_set_event)) diff --git a/traits/trait_dict_object.py b/traits/trait_dict_object.py index d93688a44..6b26eefa7 100644 --- a/traits/trait_dict_object.py +++ b/traits/trait_dict_object.py @@ -54,11 +54,10 @@ def __init__(self, *, removed=None, added=None, changed=None): def __repr__(self): return ( - "{event.__class__.__name__}(" - "removed={event.removed!r}, " - "added={event.added!r}, " - "changed={event.changed!r}" - ")".format(event=self) + f"{self.__class__.__name__}(" + f"removed={self.removed!r}, " + f"added={self.added!r}, " + f"changed={self.changed!r})" ) diff --git a/traits/trait_list_object.py b/traits/trait_list_object.py index d61af60a0..e4d448ee1 100644 --- a/traits/trait_list_object.py +++ b/traits/trait_list_object.py @@ -55,11 +55,10 @@ def __init__(self, index=0, removed=None, added=None): def __repr__(self): return ( - "{event.__class__.__name__}(" - "index={event.index!r}, " - "removed={event.removed!r}, " - "added={event.added!r}" - ")".format(event=self) + f"{self.__class__.__name__}(" + f"index={self.index!r}, " + f"removed={self.removed!r}, " + f"added={self.added!r})" ) diff --git a/traits/trait_set_object.py b/traits/trait_set_object.py index 1f2aa7e25..4b9264e81 100644 --- a/traits/trait_set_object.py +++ b/traits/trait_set_object.py @@ -48,10 +48,9 @@ def __init__(self, *, removed=None, added=None): def __repr__(self): return ( - "{event.__class__.__name__}(" - "removed={event.removed!r}, " - "added={event.added!r}" - ")".format(event=self) + f"{self.__class__.__name__}(" + f"removed={self.removed!r}, " + f"added={self.added!r})" ) diff --git a/traits/util/weakiddict.py b/traits/util/weakiddict.py index cd8844e21..fb7a3462c 100644 --- a/traits/util/weakiddict.py +++ b/traits/util/weakiddict.py @@ -43,9 +43,7 @@ def __init__(self, dict=None): self.update(dict) def __repr__(self): - return "<{self.__class__.__name__} at 0x{0:x}>".format( - id(self), self=self - ) + return f"<{self.__class__.__name__} at 0x{id(self):x}>" def __delitem__(self, key): del self.data[id(key)] From f8038b9ae6cce1a805e651780f0e70ea7433e53c Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 3 Nov 2020 07:56:57 -0600 Subject: [PATCH 5/8] adding tests for subclass reprs --- traits/tests/test_trait_dict_object.py | 12 ++++++++++++ traits/tests/test_trait_list_object.py | 12 ++++++++++++ traits/tests/test_trait_set_object.py | 12 ++++++++++++ 3 files changed, 36 insertions(+) diff --git a/traits/tests/test_trait_dict_object.py b/traits/tests/test_trait_dict_object.py index d8e0601ff..0de71c20b 100644 --- a/traits/tests/test_trait_dict_object.py +++ b/traits/tests/test_trait_dict_object.py @@ -443,3 +443,15 @@ def test_trait_dict_event_str_representation(self): trait_dict_event = TraitDictEvent() self.assertEqual(desired_repr, str(trait_dict_event)) self.assertEqual(desired_repr, repr(trait_dict_event)) + + def test_trait_dict_event_subclass_str_representation(self): + """ Test string representation of a subclass of the TraitDictEvent + class. """ + + class DifferentName(TraitDictEvent): + pass + + desired_repr = "DifferentName(removed={}, added={}, changed={})" + differnt_name_subclass = DifferentName() + self.assertEqual(desired_repr, str(differnt_name_subclass)) + self.assertEqual(desired_repr, repr(differnt_name_subclass)) diff --git a/traits/tests/test_trait_list_object.py b/traits/tests/test_trait_list_object.py index 0883d3a28..ac79344bc 100644 --- a/traits/tests/test_trait_list_object.py +++ b/traits/tests/test_trait_list_object.py @@ -100,6 +100,18 @@ def test_trait_list_event_str_representation(self): self.assertEqual(desired_repr, str(trait_list_event)) self.assertEqual(desired_repr, repr(trait_list_event)) + def test_trait_list_event_subclass_str_representation(self): + """ Test string representation of a subclass of the TraitListEvent + class. """ + + class DifferentName(TraitListEvent): + pass + + desired_repr = "DifferentName(index=0, removed=[], added=[])" + different_name_subclass = DifferentName() + self.assertEqual(desired_repr, str(different_name_subclass)) + self.assertEqual(desired_repr, repr(different_name_subclass)) + class TestTraitList(unittest.TestCase): diff --git a/traits/tests/test_trait_set_object.py b/traits/tests/test_trait_set_object.py index e2a156787..64bf41e2a 100644 --- a/traits/tests/test_trait_set_object.py +++ b/traits/tests/test_trait_set_object.py @@ -526,3 +526,15 @@ def test_trait_set_event_str_representation(self): trait_set_event = TraitSetEvent() self.assertEqual(desired_repr, str(trait_set_event)) self.assertEqual(desired_repr, repr(trait_set_event)) + + def test_trait_set_event_subclass_str_representation(self): + """ Test string representation of a subclass of the TraitSetEvent + class. """ + + class DifferentName(TraitSetEvent): + pass + + desired_repr = "DifferentName(removed=set(), added=set())" + different_name_subclass = DifferentName() + self.assertEqual(desired_repr, str(different_name_subclass)) + self.assertEqual(desired_repr, repr(different_name_subclass)) From fbc56cbbcb59cb251f8a623e19719fa268be520d Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 3 Nov 2020 08:01:06 -0600 Subject: [PATCH 6/8] one more subclass repr test --- traits/util/tests/test_weakidddict.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/traits/util/tests/test_weakidddict.py b/traits/util/tests/test_weakidddict.py index 86a2bc1e2..1a3ed1b26 100644 --- a/traits/util/tests/test_weakidddict.py +++ b/traits/util/tests/test_weakidddict.py @@ -130,3 +130,10 @@ def test_weak_id_dict_str_representation(self): desired_repr = "".format(id(weak_id_dict)) self.assertEqual(desired_repr, str(weak_id_dict)) self.assertEqual(desired_repr, repr(weak_id_dict)) + + def test_weak_id_key_dict_str_representation(self): + """ test string representation of the WeakIDKeyDict class. """ + weak_id_key_dict = WeakIDKeyDict() + desired_repr = "".format(id(weak_id_key_dict)) + self.assertEqual(desired_repr, str(weak_id_key_dict)) + self.assertEqual(desired_repr, repr(weak_id_key_dict)) From 770e3d3c3503c2364534599ca27dbdfd4508bb45 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 3 Nov 2020 08:02:55 -0600 Subject: [PATCH 7/8] updating _something_changed_event reprs to also use f strings --- traits/observation/_dict_change_event.py | 9 ++++----- traits/observation/_list_change_event.py | 11 +++++------ traits/observation/_set_change_event.py | 9 ++++----- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/traits/observation/_dict_change_event.py b/traits/observation/_dict_change_event.py index d4b0c11ec..bf6f98c31 100644 --- a/traits/observation/_dict_change_event.py +++ b/traits/observation/_dict_change_event.py @@ -44,11 +44,10 @@ def __init__(self, *, object, removed, added): def __repr__(self): return ( - "{event.__class__.__name__}(" - "object={event.object!r}, " - "removed={event.removed!r}, " - "added={event.added!r}" - ")".format(event=self) + f"{self.__class__.__name__}(" + f"object={self.object!r}, " + f"removed={self.removed!r}, " + f"added={self.added!r})" ) diff --git a/traits/observation/_list_change_event.py b/traits/observation/_list_change_event.py index 1eaf3a2d1..c08f38e54 100644 --- a/traits/observation/_list_change_event.py +++ b/traits/observation/_list_change_event.py @@ -39,12 +39,11 @@ def __init__(self, *, object, index, removed, added): def __repr__(self): return ( - "{event.__class__.__name__}(" - "object={event.object!r}, " - "index={event.index!r}, " - "removed={event.removed!r}, " - "added={event.added!r}" - ")".format(event=self) + f"{self.__class__.__name__}(" + f"object={self.object!r}, " + f"index={self.index!r}, " + f"removed={self.removed!r}, " + f"added={self.added!r})" ) diff --git a/traits/observation/_set_change_event.py b/traits/observation/_set_change_event.py index 2ddb447d1..935fde5d1 100644 --- a/traits/observation/_set_change_event.py +++ b/traits/observation/_set_change_event.py @@ -34,11 +34,10 @@ def __init__(self, *, object, removed, added): def __repr__(self): return ( - "{event.__class__.__name__}(" - "object={event.object!r}, " - "removed={event.removed!r}, " - "added={event.added!r}" - ")".format(event=self) + f"{self.__class__.__name__}(" + f"object={self.object!r}, " + f"removed={self.removed!r}, " + f"added={self.added!r})" ) From f7492c6ec4986467bcd57e75338ab8e6374da388 Mon Sep 17 00:00:00 2001 From: Aaron Ayres Date: Tue, 3 Nov 2020 08:04:48 -0600 Subject: [PATCH 8/8] flake8 / use fstring in test --- traits/util/tests/test_weakidddict.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/traits/util/tests/test_weakidddict.py b/traits/util/tests/test_weakidddict.py index 1a3ed1b26..9bc55c1b6 100644 --- a/traits/util/tests/test_weakidddict.py +++ b/traits/util/tests/test_weakidddict.py @@ -134,6 +134,6 @@ def test_weak_id_dict_str_representation(self): def test_weak_id_key_dict_str_representation(self): """ test string representation of the WeakIDKeyDict class. """ weak_id_key_dict = WeakIDKeyDict() - desired_repr = "".format(id(weak_id_key_dict)) + desired_repr = f"" self.assertEqual(desired_repr, str(weak_id_key_dict)) self.assertEqual(desired_repr, repr(weak_id_key_dict))