Skip to content

Commit

Permalink
implement better support for encoders default method
Browse files Browse the repository at this point in the history
  • Loading branch information
Tyson Holub committed Mar 27, 2020
1 parent 4bc029c commit dd8de4c
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 4 deletions.
5 changes: 3 additions & 2 deletions 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

Expand All @@ -8,5 +9,5 @@

__all__ = [
'RestEncoder', 'RestResponse', 'RestObject', 'RestList', 'NoneProp', 'parse', 'loads', 'orm',
'RestResponseObj', 'ApiModel', 'ApiCollection'
'RestResponseObj', 'ApiModel', 'ApiCollection', 'RestEncoderSimple'
]
6 changes: 5 additions & 1 deletion RestResponse/objects.py
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -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',
Expand Down
26 changes: 26 additions & 0 deletions tests/test_objects.py
Expand Up @@ -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

0 comments on commit dd8de4c

Please sign in to comment.