details: https://code.tryton.org/tryton/commit/af20060cb27b
branch: 7.8
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
(grafted from be1a4d3ecd9b77dfdfe4b8b17642c922a2b011d7)
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 7d61faae9d58 -r af20060cb27b 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 7d61faae9d58 -r af20060cb27b 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 7d61faae9d58 -r af20060cb27b 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__"