From 3d5943a8a43a721bea1f3e33dc669a581a095c53 Mon Sep 17 00:00:00 2001 From: Bruno Soares Date: Wed, 12 Sep 2018 15:49:46 -0300 Subject: [PATCH] Fix: Circular reference detected error (#332) * Rename function name * Add uuid handler on json dumps * Add myself to authors --- AUTHORS | 1 + tablib/formats/_json.py | 10 +++++----- test_tablib.py | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/AUTHORS b/AUTHORS index 8afb539..65463bd 100644 --- a/AUTHORS +++ b/AUTHORS @@ -34,3 +34,4 @@ Patches and Suggestions - Mathias Loesch - Tushar Makkar - Andrii Soldatenko +- Bruno Soares diff --git a/tablib/formats/_json.py b/tablib/formats/_json.py index a3d6cc3..a3b88f8 100644 --- a/tablib/formats/_json.py +++ b/tablib/formats/_json.py @@ -3,6 +3,7 @@ """ Tablib - JSON Support """ import decimal +from uuid import UUID import tablib @@ -15,24 +16,23 @@ title = 'json' extensions = ('json', 'jsn') -def date_handler(obj): - if isinstance(obj, decimal.Decimal): +def serialize_objects_handler(obj): + if isinstance(obj, decimal.Decimal) or isinstance(obj, UUID): return str(obj) elif hasattr(obj, 'isoformat'): return obj.isoformat() else: return obj - # return obj.isoformat() if hasattr(obj, 'isoformat') else obj def export_set(dataset): """Returns JSON representation of Dataset.""" - return json.dumps(dataset.dict, default=date_handler) + return json.dumps(dataset.dict, default=serialize_objects_handler) def export_book(databook): """Returns JSON representation of Databook.""" - return json.dumps(databook._package(), default=date_handler) + return json.dumps(databook._package(), default=serialize_objects_handler) def import_set(dset, in_stream): diff --git a/test_tablib.py b/test_tablib.py index 84cc46a..b945a2d 100755 --- a/test_tablib.py +++ b/test_tablib.py @@ -6,6 +6,7 @@ import doctest import json import unittest import sys +from uuid import uuid4 import datetime @@ -226,6 +227,22 @@ class TablibTestCase(unittest.TestCase): # Delete from invalid index self.assertRaises(IndexError, self.founders.__delitem__, 3) + + def test_json_export(self): + """Verify exporting dataset object as JSON""" + + address_id = uuid4() + headers = self.headers + ('address_id',) + founders = tablib.Dataset(headers=headers, title='Founders') + founders.append(('John', 'Adams', 90, address_id)) + founders_json = founders.export('json') + + expected_json = ( + '[{"first_name": "John", "last_name": "Adams", "gpa": 90, ' + '"address_id": "%s"}]' % str(address_id) + ) + + self.assertEqual(founders_json, expected_json) def test_csv_export(self): """Verify exporting dataset object as CSV."""