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

Commit f31e404

Browse files
chebee7iashwoods
authored andcommitted
Make BetterJSONEncoder use OrderedDict for namedtuples.
1 parent 8904c3b commit f31e404

2 files changed

Lines changed: 19 additions & 4 deletions

File tree

raven/utils/basic.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
from __future__ import absolute_import
22

3+
try:
4+
from collections.abc import Mapping
5+
except ImportError:
6+
# Python < 3.3
7+
from collections import Mapping
8+
39
from functools import update_wrapper
410
import threading
511

@@ -30,11 +36,11 @@ def varmap(func, var, context=None, name=None):
3036
return func(name, '<...>')
3137
context[objid] = 1
3238

33-
if isinstance(var, (list, tuple)):
39+
if isinstance(var, (list, tuple)) and not is_namedtuple(var):
3440
ret = [varmap(func, f, context, name) for f in var]
3541
else:
3642
ret = func(name, var)
37-
if isinstance(ret, dict):
43+
if isinstance(ret, Mapping):
3844
ret = dict((k, varmap(func, v, context, k))
3945
for k, v in iteritems(var))
4046
del context[objid]

raven/utils/json.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@
99
from __future__ import absolute_import
1010

1111
import codecs
12+
import collections
1213
import datetime
1314
import uuid
1415
import json
1516

17+
from .basic import is_namedtuple
18+
19+
1620
try:
1721
JSONDecodeError = json.JSONDecodeError
1822
except AttributeError:
@@ -25,12 +29,17 @@ class BetterJSONEncoder(json.JSONEncoder):
2529
datetime.datetime: lambda o: o.strftime('%Y-%m-%dT%H:%M:%SZ'),
2630
set: list,
2731
frozenset: list,
28-
bytes: lambda o: o.decode('utf-8', errors='replace')
32+
bytes: lambda o: o.decode('utf-8', errors='replace'),
33+
collections.namedtuple: lambda o: o._asdict(),
2934
}
3035

3136
def default(self, obj):
37+
obj_type = type(obj)
38+
if obj_type not in self.ENCODER_BY_TYPE and is_namedtuple(obj):
39+
obj_type = collections.namedtuple
40+
3241
try:
33-
encoder = self.ENCODER_BY_TYPE[type(obj)]
42+
encoder = self.ENCODER_BY_TYPE[obj_type]
3443
except KeyError:
3544
try:
3645
return super(BetterJSONEncoder, self).default(obj)

0 commit comments

Comments
 (0)