2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
3
from __future__ import with_statement
6
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
7
__docformat__ = 'restructuredtext en'
11
import time, cStringIO
12
from Queue import Queue, Empty
14
class BaseJob(object):
20
def __init__(self, description, done=lambda x: x):
25
self.description = description
30
self.start_time = None
34
self.notifications = Queue()
36
self._run_state = self.WAITING
39
self._status_text = _('Waiting...')
40
self._done_called = False
42
def update(self, consume_notifications=True):
43
if self.duration is not None:
44
self._run_state = self.FINISHED
47
self._status_text = _('Stopped')
49
self._status_text = _('Error') if self.failed else _('Finished')
50
if not self._done_called:
51
self._done_called = True
57
if callable(self.done2):
61
elif self.start_time is not None:
62
self._run_state = self.RUNNING
63
self._status_text = _('Working...')
65
while consume_notifications:
67
self.percent, self._message = self.notifications.get_nowait()
73
def status_text(self):
74
if self._run_state == self.FINISHED or not self._message:
75
return self._status_text
80
return self._run_state
83
def running_time(self):
84
if self.duration is not None:
86
if self.start_time is not None:
87
return time.time() - self.start_time
91
def is_finished(self):
92
return self._run_state == self.FINISHED
96
return self._run_state != self.WAITING
100
return self.is_started and not self.is_finished
102
def __cmp__(self, other):
103
if self.is_finished == other.is_finished:
104
if self.start_time is None:
105
if other.start_time is None: # Both waiting
106
return cmp(other.id, self.id)
110
if other.start_time is None:
113
return cmp(other.start_time, self.start_time)
116
return 1 if self.is_finished else -1
122
return open(self.log_path, 'rb')
123
return cStringIO.StringIO(_('No details available.'))
127
return self.log_file.read().decode('utf-8')
130
class ParallelJob(BaseJob):
132
def __init__(self, name, description, done, args=[], kwargs={}):
133
self.name, self.args, self.kwargs = name, args, kwargs
134
BaseJob.__init__(self, description, done)