Skip to content

Commit e795332

Browse files
author
Matt George
committed
Merge branch 'master' of git://github.com/lentil/pyres
2 parents a515d28 + 736da73 commit e795332

File tree

6 files changed

+97
-8
lines changed

6 files changed

+97
-8
lines changed

pyres/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
__version__ = '0.5.0'
22

33
from redis import Redis
4-
import simplejson
4+
import pyres.json_parser as json
55

66
import types
77

@@ -181,12 +181,12 @@ def close(self):
181181

182182
@classmethod
183183
def encode(cls, item):
184-
return simplejson.dumps(item)
184+
return json.dumps(item)
185185

186186
@classmethod
187187
def decode(cls, item):
188188
if item:
189-
ret = simplejson.loads(item)
189+
ret = json.loads(item)
190190
return ret
191191
return None
192192

pyres/json_parser.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from datetime import datetime
2+
try:
3+
import simplejson as json
4+
except ImportError:
5+
import json
6+
7+
8+
DATE_FORMAT = '%Y-%m-%dT%H:%M:%S'
9+
DATE_PREFIX = '@D:'
10+
11+
12+
class CustomJSONEncoder(json.JSONEncoder):
13+
14+
def default(self, o):
15+
if isinstance(o, datetime):
16+
return o.strftime(DATE_PREFIX + DATE_FORMAT)
17+
return json.JSONEncoder.default(self, o)
18+
19+
20+
class CustomJSONDecoder(json.JSONDecoder):
21+
22+
def decode(self, json_string):
23+
decoded = json.loads(json_string)
24+
return self.convert(decoded)
25+
26+
def convert(self, value):
27+
if isinstance(value, basestring) and value.startswith(DATE_PREFIX):
28+
try:
29+
return datetime.strptime(value[len(DATE_PREFIX):], DATE_FORMAT)
30+
except ValueError:
31+
return value
32+
elif isinstance(value, dict):
33+
for k, v in value.iteritems():
34+
new = self.convert(v)
35+
if new != v:
36+
value[k] = new
37+
elif isinstance(value, list):
38+
for k, v in enumerate(value):
39+
new = self.convert(v)
40+
if new != v:
41+
value[k] = new
42+
return value
43+
44+
45+
def dumps(values):
46+
return json.dumps(values, cls=CustomJSONEncoder)
47+
48+
49+
def loads(string):
50+
return json.loads(string, cls=CustomJSONDecoder)

pyres/worker.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import datetime
66
import os, sys
77
import time
8-
import simplejson
8+
import json_parser as json
99

1010
class Worker(object):
1111
"""
@@ -162,7 +162,7 @@ def working_on(self, job):
162162
'run_at': str(datetime.datetime.now()),
163163
'payload': job._payload
164164
}
165-
data = simplejson.dumps(data)
165+
data = json.dumps(data)
166166
self.resq.redis["resque:worker:%s" % str(self)] = data
167167
print "worker:%s" % str(self)
168168
print self.resq.redis["resque:worker:%s" % str(self)]

tests/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ def perform(name):
1111
print s
1212
return s
1313

14+
class ReturnAllArgsJob(object):
15+
queue = 'basic'
16+
17+
@staticmethod
18+
def perform(*args):
19+
return args
20+
1421
class TestProcess(object):
1522
queue = 'high'
1623

@@ -49,4 +56,4 @@ def setUp(self):
4956
def tearDown(self):
5057
self.redis.flush(True)
5158
del self.redis
52-
del self.resq
59+
del self.resq

tests/test_jobs.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from tests import PyResTests, Basic, TestProcess
1+
from datetime import datetime
2+
from tests import PyResTests, Basic, TestProcess, ReturnAllArgsJob
23
from pyres.job import Job
34
class JobTests(PyResTests):
45
def test_reserve(self):
@@ -21,4 +22,11 @@ def test_fail(self):
2122
job = Job.reserve('basic',self.resq)
2223
assert self.redis.llen('resque:failed') == 0
2324
job.fail("problem")
24-
assert self.redis.llen('resque:failed') == 1
25+
assert self.redis.llen('resque:failed') == 1
26+
27+
def test_date_arg_type(self):
28+
dt = datetime.now().replace(microsecond=0)
29+
self.resq.enqueue(ReturnAllArgsJob, dt)
30+
job = Job.reserve('basic',self.resq)
31+
result = job.perform()
32+
assert result[0] == dt

tests/test_json.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from datetime import datetime
2+
from tests import PyResTests
3+
import pyres.json_parser as json
4+
5+
class JSONTests(PyResTests):
6+
def test_encode_decode_date(self):
7+
dt = datetime(1972, 1, 22);
8+
encoded = json.dumps({'dt': dt})
9+
decoded = json.loads(encoded)
10+
assert decoded['dt'] == dt
11+
12+
def test_dates_in_lists(self):
13+
dates = [datetime.now() for i in range(50)]
14+
decoded = json.loads(json.dumps(dates))
15+
for value in dates:
16+
assert isinstance(value, datetime)
17+
18+
def test_dates_in_dict(self):
19+
dates = dict((i, datetime.now()) for i in range(50))
20+
decoded = json.loads(json.dumps(dates))
21+
for i, value in dates.items():
22+
assert isinstance(i, int)
23+
assert isinstance(value, datetime)
24+

0 commit comments

Comments
 (0)