3
3
# Distributed under the terms of the Modified BSD License.
4
4
import datetime
5
5
import json
6
+ import numbers
6
7
from datetime import timedelta
7
8
from unittest import mock
8
9
16
17
REFERENCE_DATETIME = datetime .datetime (2013 , 7 , 3 , 16 , 34 , 52 , 249482 , tzlocal ())
17
18
18
19
20
+ class MyInt (object ):
21
+ def __int__ (self ):
22
+ return 389
23
+
24
+
25
+ numbers .Integral .register (MyInt )
26
+
27
+
28
+ class MyFloat (object ):
29
+ def __float__ (self ):
30
+ return 3.14
31
+
32
+
33
+ numbers .Real .register (MyFloat )
34
+
35
+
19
36
def test_extract_date_from_naive ():
20
37
ref = REFERENCE_DATETIME
21
38
timestamp = "2013-07-03T16:34:52.249482"
@@ -65,7 +82,7 @@ def test_parse_ms_precision():
65
82
assert isinstance (parsed , str )
66
83
67
84
68
- def test_json_default ():
85
+ def test_json_default_date ():
69
86
naive = datetime .datetime .now ()
70
87
local = tzoffset ("Local" , - 8 * 3600 )
71
88
other = tzoffset ("Other" , 2 * 3600 )
@@ -79,3 +96,35 @@ def test_json_default():
79
96
for dt in extracted .values ():
80
97
assert isinstance (dt , datetime .datetime )
81
98
assert dt .tzinfo is not None
99
+
100
+
101
+ def test_json_default ():
102
+ # list of input/expected output. Use None for the expected output if it
103
+ # can be the same as the input.
104
+ pairs = [
105
+ (1 , None ), # start with scalars
106
+ (1.123 , None ),
107
+ (1.0 , None ),
108
+ ('a' , None ),
109
+ (True , None ),
110
+ (False , None ),
111
+ (None , None ),
112
+ # Containers
113
+ ([1 , 2 ], None ),
114
+ ((1 , 2 ), [1 , 2 ]),
115
+ (set ([1 , 2 ]), [1 , 2 ]),
116
+ (dict (x = 1 ), None ),
117
+ ({'x' : 1 , 'y' : [1 , 2 , 3 ], '1' : 'int' }, None ),
118
+ # More exotic objects
119
+ ((x for x in range (3 )), [0 , 1 , 2 ]),
120
+ (iter ([1 , 2 ]), [1 , 2 ]),
121
+ (MyFloat (), 3.14 ),
122
+ (MyInt (), 389 ),
123
+ ]
124
+
125
+ for val , jval in pairs :
126
+ if jval is None :
127
+ jval = val
128
+ out = json .loads (json .dumps (val , default = jsonutil .json_default ))
129
+ # validate our cleanup
130
+ assert out == jval
0 commit comments