Skip to content

Commit 0af35f6

Browse files
author
Matt George
committed
updated tests
added some tests, worker, and failure changes that came about because of tests.
1 parent 3f1029c commit 0af35f6

File tree

3 files changed

+77
-17
lines changed

3 files changed

+77
-17
lines changed

src/pyres/failure.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,35 @@
11
import datetime
2-
from pyres import ResQ
2+
from pyres import ResQ
3+
import sys, traceback
34
class Failure(object):
45
def __init__(self, exp, queue, payload):
5-
self._exception = exp
6+
excc, _, tb = sys.exc_info()
7+
8+
self._exception = excc
9+
self._traceback = tb
610
#self._worker = worker
711
self._queue = queue
812
self._payload = payload
913

14+
def _parse_traceback(self, trace):
15+
"""Return the given traceback string formatted for a notification."""
16+
p_traceback = [ "%s:%d:in `%s'" % (filename, lineno, funcname)
17+
for filename, lineno, funcname, _
18+
in traceback.extract_tb(trace) ]
19+
p_traceback.reverse()
20+
21+
return p_traceback
22+
23+
def _parse_message(self, exc):
24+
"""Return a message for a notification from the given exception."""
25+
return '%s: %s' % (exc.__class__.__name__, str(exc))
26+
1027
def save(self, resq):
1128
data = {
1229
'failed_at' : str(datetime.datetime.now()),
1330
'payload' : self._payload,
14-
'error' : self._exception,
31+
'error' : self._parse_message(self._exception),
32+
'backtrace' : self._parse_traceback(self._traceback),
1533
'queue' : self._queue
1634
}
1735
data = ResQ.encode(data)
@@ -21,7 +39,4 @@ def save(self, resq):
2139
def count(cls, resq):
2240
return int(resq.redis.llen('failed'))
2341

24-
@classmethod
25-
def create(cls, options={}):
26-
pass
2742

src/pyres/worker.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,6 @@ def working_on(self, job):
110110
data = simplejson.dumps(data)
111111
self.resq.redis["worker:%s" % str(self)] = data
112112

113-
def job(self):
114-
return ResQ.decode(self.resq.redis.get("worker:%s" % self)) or {}
115-
116113
def done_working(self):
117114
self.processed()
118115
self.resq.redis.delete("worker:%s" % str(self))

src/tests.py

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import unittest
22
import os
3-
from pyres import ResQ, str_to_class
3+
from pyres import ResQ, str_to_class, Stat
44
from pyres.job import Job
55
from pyres.worker import Worker
66
class Basic(object):
@@ -22,7 +22,7 @@ def perform():
2222
return 'Done Sleeping'
2323

2424

25-
class ErrorObjcet(object):
25+
class ErrorObject(object):
2626
queue = 'basic'
2727

2828
@staticmethod
@@ -224,11 +224,59 @@ def test_signals(self):
224224
assert not worker.kill_child(frame, signal.SIGUSR1)
225225

226226
def test_job_failure(self):
227-
self.resq.enqueue(ErrorObjcet)
227+
self.resq.enqueue(ErrorObject)
228228
worker = Worker(['basic'])
229-
#worker.process()
229+
worker.process()
230+
name = "%s:%s:%s" % (os.uname()[1],os.getpid(),'basic')
231+
assert not self.redis.get('worker:%s' % worker)
232+
assert self.redis.get("stat:failed") == 1
233+
assert self.redis.get("stat:failed:%s" % name) == 1
234+
235+
def test_get_job(self):
236+
worker = Worker(['basic'])
237+
self.resq.enqueue(Basic,"test1")
238+
job = Job.reserve('basic', self.resq)
239+
worker.working_on(job)
230240
name = "%s:%s:%s" % (os.uname()[1],os.getpid(),'basic')
231-
#assert not self.redis.get('worker:%s' % worker)
232-
#assert self.redis.get("stat:failed")
233-
#assert self.redis.get("stat:failed:%s" % name)
234-
assert False
241+
assert worker.job() == ResQ.decode(self.redis.get('worker:%s' % name))
242+
worker.done_working()
243+
w2 = Worker(['basic'])
244+
print w2.job()
245+
assert w2.job() == {}
246+
247+
248+
class StatTests(PyResTests):
249+
def test_incr(self):
250+
stat_obj = Stat('test_stat', self.resq)
251+
stat_obj.incr()
252+
assert self.redis.get('stat:test_stat') == 1
253+
stat_obj.incr()
254+
assert self.redis.get('stat:test_stat') == 2
255+
stat_obj.incr(2)
256+
assert self.redis.get('stat:test_stat') == 4
257+
258+
def test_decr(self):
259+
stat_obj = Stat('test_stat', self.resq)
260+
stat_obj.incr()
261+
stat_obj.incr()
262+
assert self.redis.get('stat:test_stat') == 2
263+
stat_obj.decr()
264+
assert self.redis.get('stat:test_stat') == 1
265+
stat_obj.incr()
266+
stat_obj.decr(2)
267+
assert self.redis.get('stat:test_stat') == 0
268+
269+
def test_get(self):
270+
stat_obj = Stat('test_stat', self.resq)
271+
stat_obj.incr()
272+
stat_obj.incr()
273+
assert stat_obj.get() == 2
274+
275+
def test_clear(self):
276+
stat_obj = Stat('test_stat', self.resq)
277+
stat_obj.incr()
278+
stat_obj.incr()
279+
assert self.redis.exists('stat:test_stat')
280+
stat_obj.clear()
281+
assert not self.redis.exists('stat:test_stat')
282+

0 commit comments

Comments
 (0)