diff --git a/src/wuttaweb/util.py b/src/wuttaweb/util.py index 1080820..a708398 100644 --- a/src/wuttaweb/util.py +++ b/src/wuttaweb/util.py @@ -654,6 +654,13 @@ def make_json_safe(value, key=None, warn=True): parent[i] = make_json_safe(v, key=key, warn=warn) value = parent + elif isinstance(value, set): + # recursively convert set (as list) + parent = list(value) + for i, v in enumerate(parent): + parent[i] = make_json_safe(v, key=key, warn=warn) + value = parent + elif isinstance(value, _uuid.UUID): # convert UUID to str value = value.hex diff --git a/tests/test_util.py b/tests/test_util.py index 0be2911..b9c7490 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -735,6 +735,30 @@ class TestMakeJsonSafe(TestCase): ], ) + def test_set(self): + model = self.app.model + person = model.Person(full_name="Betty Boop") + + data = { + "foo", + "bar", + person, + } + + self.assertRaises(TypeError, json.dumps, data) + value = mod.make_json_safe(data) + self.assertNotIsInstance(value, set) + self.assertIsInstance(value, list) + # nb. must sort values, otherwise comparison may fail + self.assertEqual( + sorted(value), + [ + "Betty Boop", # nb. upper-case sorts first + "bar", + "foo", + ], + ) + class TestRenderVueFinalize(TestCase):