From 1acb2c6981f6a77e204cae9172f69996a17f509a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl>
Date: Wed, 23 Oct 2024 11:47:49 +0200
Subject: [PATCH] * DictObject will no longer announce it's presence via
 __str__ and __repr__ * nested creation of DictObject's was optimized

---
 CHANGELOG.md                                        |  6 ++++--
 satella/__init__.py                                 |  2 +-
 .../coding/structures/dictionaries/dict_object.py   | 13 +++++++------
 tests/test_coding/test_structures.py                |  7 +++++--
 4 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f74d876b..c8e20a2f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,8 @@
-# v2.25.10
+# v2.26.0
 
-* _TBA_
+* **breaking change**: DictObject will no longer announce it's presence via __str__ and __repr__. It will just display
+  it's dictionary.
+* nested creation of DictObject's was optimized
 
 # v2.25.9
 
diff --git a/satella/__init__.py b/satella/__init__.py
index f5c827dd..4e71e9ad 100644
--- a/satella/__init__.py
+++ b/satella/__init__.py
@@ -1 +1 @@
-__version__ = '2.25.10a1'
+__version__ = '2.26.0'
diff --git a/satella/coding/structures/dictionaries/dict_object.py b/satella/coding/structures/dictionaries/dict_object.py
index 97578f74..38ef3663 100644
--- a/satella/coding/structures/dictionaries/dict_object.py
+++ b/satella/coding/structures/dictionaries/dict_object.py
@@ -22,18 +22,19 @@ class DictObject(dict):
     >>> self.assertEqual(a['test'], 5)
     """
 
+    def __new__(cls, *args, **kwargs):
+        if not kwargs and len(args) == 1:
+            arg, = args
+            if isinstance(arg, DictObject):
+                return arg
+        return super().__new__(cls, *args, **kwargs)
+
     def __copy__(self):
         return DictObject(copy.copy(super()))
 
     def __deepcopy__(self, memo=None):
         return DictObject(copy.deepcopy(super(), memo=memo))
 
-    def __str__(self) -> str:
-        return 'DictObject(%s)' % (super().__str__(),)
-
-    def __repr__(self) -> str:
-        return 'DictObject(%s)' % (super().__repr__(),)
-
     @rethrow_as(KeyError, AttributeError)
     def __getattr__(self, item):
         return self[item]
diff --git a/tests/test_coding/test_structures.py b/tests/test_coding/test_structures.py
index bb01d1b3..4ab45170 100644
--- a/tests/test_coding/test_structures.py
+++ b/tests/test_coding/test_structures.py
@@ -503,6 +503,11 @@ class TestStructures(unittest.TestCase):
         self.assertEqual(cd[2], [])
         self.assertEqual(cd[2], [])
 
+    def test_new_dictobject(self):
+        a = DictObject(a=5, k=3)
+        b = DictObject(a)
+        self.assertIs(a, b)
+
     def test_dictobject_dictobject(self):
         a = DictObject(a=5, k=3)
         b = DictObject(a)
@@ -514,8 +519,6 @@ class TestStructures(unittest.TestCase):
         self.assertEqual(b.c, 4)
         self.assertEqual(b['c'], 4)
 
-        self.assertIn('DictObject', str(b))
-        self.assertIn('DictObject', repr(b))
         self.assertIn('a', b.keys())
         self.assertIn(5, b.values())
         self.assertIn(('a', 5), b.items())
-- 
GitLab