summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchebee7i <chebee7i@gmail.com>2018-03-08 15:04:52 -0600
committerAshley Camba <ashwoods@gmail.com>2018-05-02 19:36:28 +0200
commit8904c3ba7c87103e4aaac86bc84ad2233378ba6f (patch)
tree7edd948ff63ad9a98c1c207933e2db3d2a3e3e7e
parenta1552e6d11386043b452d3fb2dced698ec764827 (diff)
downloadraven-8904c3ba7c87103e4aaac86bc84ad2233378ba6f.tar.gz
Add NamedtupleSerializer before IterableSerializer.
-rw-r--r--raven/utils/serializer/base.py26
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)