From dd8de4c9c606dc0bf05b084785229e8960019cbc Mon Sep 17 00:00:00 2001 From: Tyson Holub Date: Fri, 27 Mar 2020 15:12:22 -0400 Subject: [PATCH] implement better support for encoders default method --- RestResponse/__init__.py | 5 +++-- RestResponse/objects.py | 6 +++++- setup.py | 2 +- tests/test_objects.py | 26 ++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/RestResponse/__init__.py b/RestResponse/__init__.py index 9bc9e38..fd0e626 100644 --- a/RestResponse/__init__.py +++ b/RestResponse/__init__.py @@ -1,5 +1,6 @@ from .objects import ( - RestEncoder, RestResponse, RestObject, RestList, NoneProp, RestResponseObj, ApiModel, ApiCollection + RestEncoder, RestResponse, RestObject, RestList, NoneProp, RestResponseObj, ApiModel, ApiCollection, + RestEncoderSimple ) from . import orm @@ -8,5 +9,5 @@ __all__ = [ 'RestEncoder', 'RestResponse', 'RestObject', 'RestList', 'NoneProp', 'parse', 'loads', 'orm', - 'RestResponseObj', 'ApiModel', 'ApiCollection' + 'RestResponseObj', 'ApiModel', 'ApiCollection', 'RestEncoderSimple' ] diff --git a/RestResponse/objects.py b/RestResponse/objects.py index 8c864e3..143384c 100644 --- a/RestResponse/objects.py +++ b/RestResponse/objects.py @@ -13,8 +13,12 @@ def _encode_hook(opts): def _default(o): + if isinstance(o, RestObject): + return {k: _default(v) for k, v in o.items()} + elif isinstance(o, RestList) or isinstance(o, ApiCollection): + return [_default(x) for x in o] if isinstance(o, ApiModel): - return o._data + return _default(o._data) return utils.encode_item(o, **opts) return _default diff --git a/setup.py b/setup.py index 1881a6f..2d64ada 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ def read(fname): return open(os.path.join(os.path.dirname(__file__), fname)).read() -__version__ = '3.0.4' +__version__ = '3.0.5' setup( name='RestResponse', diff --git a/tests/test_objects.py b/tests/test_objects.py index b5e99e3..fd90f67 100644 --- a/tests/test_objects.py +++ b/tests/test_objects.py @@ -503,3 +503,29 @@ def test_api_collection(): m.ref_collection.append(ref) assert m.ref_collection[-1].id == ref.id assert m.ref_collection[-1].string == ref.string + + +def test_default(): + obj = RestResponse.parse({ + 'callable': lambda x: x + 1 + }) + + data = RestResponse.RestEncoder().default(obj) + assert data['callable'].startswith('__callable__') + assert RestResponse.utils.decode_item(data['callable'])(2) == 3 + + data = RestResponse.RestEncoderSimple().default(obj) + assert data['callable'].startswith('__callable__') + assert RestResponse.utils.decode_item(data['callable'])(2) == 3 + + obj = RestResponse.parse([ + lambda x: x + 1 + ]) + + data = RestResponse.RestEncoder().default(obj) + assert data[0].startswith('__callable__') + assert RestResponse.utils.decode_item(data[0])(2) == 3 + + data = RestResponse.RestEncoderSimple().default(obj) + assert data[0].startswith('__callable__') + assert RestResponse.utils.decode_item(data[0])(2) == 3