diff options
author | chebee7i <chebee7i@gmail.com> | 2018-03-08 15:04:52 -0600 |
---|---|---|
committer | Ashley Camba <ashwoods@gmail.com> | 2018-05-02 19:36:28 +0200 |
commit | 8904c3ba7c87103e4aaac86bc84ad2233378ba6f (patch) | |
tree | 7edd948ff63ad9a98c1c207933e2db3d2a3e3e7e | |
parent | a1552e6d11386043b452d3fb2dced698ec764827 (diff) | |
download | raven-8904c3ba7c87103e4aaac86bc84ad2233378ba6f.tar.gz |
Add NamedtupleSerializer before IterableSerializer.
-rw-r--r-- | raven/utils/serializer/base.py | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/raven/utils/serializer/base.py b/raven/utils/serializer/base.py index 06753b2..92b2102 100644 --- a/raven/utils/serializer/base.py +++ b/raven/utils/serializer/base.py @@ -8,6 +8,7 @@ raven.utils.serializer.base """ from __future__ import absolute_import +import collections import itertools import types @@ -15,6 +16,8 @@ from raven.utils.compat import text_type, binary_type, string_types, iteritems, class_types, PY2, PY3 from raven.utils.encoding import to_unicode from .manager import manager as serialization_manager +from raven.utils import is_namedtuple + __all__ = ('Serializer',) @@ -65,6 +68,28 @@ class Serializer(object): _depth=_depth, **kwargs) +class NamedtupleSerializer(Serializer): + types = (collections.namedtuple,) + + def can(self, value): + """ + Given ``value``, return a boolean describing whether this + serializer can operate on the given type + """ + return is_namedtuple(value) + + def serialize(self, value, **kwargs): + list_max_length = kwargs.get('list_max_length') or float('inf') + less_than = lambda x: x[0] < list_max_length + items = value._asdict().items() + takewhile = itertools.takewhile + x = dict([ + (k, self.recurse(v, **kwargs)) + for n, (k, v) in takewhile(less_than, enumerate(items)) + ]) + return x + + class IterableSerializer(Serializer): types = (tuple, list, set, frozenset) @@ -176,6 +201,7 @@ if PY2: # register all serializers, order matters +serialization_manager.register(NamedtupleSerializer) serialization_manager.register(IterableSerializer) serialization_manager.register(DictSerializer) serialization_manager.register(UnicodeSerializer) |