details:   https://code.tryton.org/tryton/commit/be1a4d3ecd9b
branch:    default
user:      Cédric Krier <[email protected]>
date:      Thu Dec 18 19:18:12 2025 +0100
description:
        Register a set and frozenset marshalling function for both JSON-RPC and 
XML-RPC

        This completes 0a0f4db765fb for #14387
diffstat:

 trytond/trytond/protocols/jsonrpc.py    |   2 ++
 trytond/trytond/protocols/xmlrpc.py     |   2 ++
 trytond/trytond/tests/test_protocols.py |  26 +++++++++++++++++++-------
 3 files changed, 23 insertions(+), 7 deletions(-)

diffs (86 lines):

diff -r 1c5e18f30156 -r be1a4d3ecd9b trytond/trytond/protocols/jsonrpc.py
--- a/trytond/trytond/protocols/jsonrpc.py      Thu Dec 18 23:36:13 2025 +0100
+++ b/trytond/trytond/protocols/jsonrpc.py      Thu Dec 18 19:18:12 2025 +0100
@@ -101,6 +101,8 @@
         'seconds': o.total_seconds(),
         })
 JSONEncoder.register(MappingProxyType, dict)
+JSONEncoder.register(set, tuple)
+JSONEncoder.register(frozenset, tuple)
 
 
 def _bytes_encoder(o):
diff -r 1c5e18f30156 -r be1a4d3ecd9b trytond/trytond/protocols/xmlrpc.py
--- a/trytond/trytond/protocols/xmlrpc.py       Thu Dec 18 23:36:13 2025 +0100
+++ b/trytond/trytond/protocols/xmlrpc.py       Thu Dec 18 19:18:12 2025 +0100
@@ -86,6 +86,8 @@
 client.Marshaller.dispatch[dict] = dump_struct
 client.Marshaller.dispatch[ImmutableDict] = dump_struct
 client.Marshaller.dispatch[MappingProxyType] = dump_struct
+client.Marshaller.dispatch[set] = client.Marshaller.dump_array
+client.Marshaller.dispatch[frozenset] = client.Marshaller.dump_array
 
 
 class XMLRPCDecoder(object):
diff -r 1c5e18f30156 -r be1a4d3ecd9b trytond/trytond/tests/test_protocols.py
--- a/trytond/trytond/tests/test_protocols.py   Thu Dec 18 23:36:13 2025 +0100
+++ b/trytond/trytond/tests/test_protocols.py   Thu Dec 18 19:18:12 2025 +0100
@@ -11,9 +11,13 @@
 from trytond.tools.immutabledict import ImmutableDict
 
 
+def _identity(x):
+    return x
+
+
 class DumpsLoadsMixin:
 
-    def dumps_loads(self, value):
+    def dumps_loads(self, value, test=_identity):
         raise NotImplementedError
 
     def test_datetime(self):
@@ -49,6 +53,14 @@
         "Test ImmutableDict"
         self.dumps_loads(ImmutableDict(foo='bar'))
 
+    def test_set(self):
+        "Test set"
+        self.dumps_loads(set(range(10)), list)
+
+    def test_frozenset(self):
+        "Test set"
+        self.dumps_loads(frozenset(range(10)), list)
+
     def test_none(self):
         'Test None'
         self.dumps_loads(None)
@@ -67,10 +79,11 @@
         self.assertEqual(req.rpc_method, 'method')
         self.assertEqual(req.rpc_params, ['foo', 'bar'])
 
-    def dumps_loads(self, value):
+    def dumps_loads(self, value, type=_identity):
         self.assertEqual(json.loads(
                 json.dumps(value, cls=JSONEncoder),
-                object_hook=JSONDecoder()), value)
+                object_hook=JSONDecoder()),
+            type(value))
 
 
 class XMLTestCase(DumpsLoadsMixin, TestCase):
@@ -95,11 +108,10 @@
         self.assertEqual(req.rpc_method, 'method')
         self.assertEqual(req.rpc_params, ('foo', 'bar'))
 
-    def dumps_loads(self, value):
+    def dumps_loads(self, value, type=_identity):
         s = client.dumps((value,), allow_none=True)
-        result, _ = client.loads(s)
-        result, = result
-        self.assertEqual(value, result)
+        (result,), _ = client.loads(s)
+        self.assertEqual(result, type(value))
 
     def test_decimal_class_load(self):
         "Test load Decimal as __class__"

Reply via email to