Skip to content
This repository was archived by the owner on Oct 23, 2023. It is now read-only.

Commit 8904c3b

Browse files
chebee7iashwoods
authored andcommitted
Add NamedtupleSerializer before IterableSerializer.
1 parent a1552e6 commit 8904c3b

1 file changed

Lines changed: 26 additions & 0 deletions

File tree

raven/utils/serializer/base.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@
88
"""
99
from __future__ import absolute_import
1010

11+
import collections
1112
import itertools
1213
import types
1314

1415
from raven.utils.compat import text_type, binary_type, string_types, iteritems, \
1516
class_types, PY2, PY3
1617
from raven.utils.encoding import to_unicode
1718
from .manager import manager as serialization_manager
19+
from raven.utils import is_namedtuple
20+
1821

1922
__all__ = ('Serializer',)
2023

@@ -65,6 +68,28 @@ def recurse(self, value, max_depth=6, _depth=0, **kwargs):
6568
_depth=_depth, **kwargs)
6669

6770

71+
class NamedtupleSerializer(Serializer):
72+
types = (collections.namedtuple,)
73+
74+
def can(self, value):
75+
"""
76+
Given ``value``, return a boolean describing whether this
77+
serializer can operate on the given type
78+
"""
79+
return is_namedtuple(value)
80+
81+
def serialize(self, value, **kwargs):
82+
list_max_length = kwargs.get('list_max_length') or float('inf')
83+
less_than = lambda x: x[0] < list_max_length
84+
items = value._asdict().items()
85+
takewhile = itertools.takewhile
86+
x = dict([
87+
(k, self.recurse(v, **kwargs))
88+
for n, (k, v) in takewhile(less_than, enumerate(items))
89+
])
90+
return x
91+
92+
6893
class IterableSerializer(Serializer):
6994
types = (tuple, list, set, frozenset)
7095

@@ -176,6 +201,7 @@ def serialize(self, value, **kwargs):
176201

177202

178203
# register all serializers, order matters
204+
serialization_manager.register(NamedtupleSerializer)
179205
serialization_manager.register(IterableSerializer)
180206
serialization_manager.register(DictSerializer)
181207
serialization_manager.register(UnicodeSerializer)

0 commit comments

Comments
 (0)