3 from datetime import datetime, timedelta
7 ### more generic code for waiting for any number of things
8 ### within a given timeframe i.e. given some timeout/silent/period
9 ### takes in argument a list of tasks that are instances
10 ### of a CompleterTask subclass
12 def __init__ (self, tasks, verbose=True):
15 def run (self, timeout_timedelta, silent_timedelta, period=None):
16 timeout = datetime.now()+timeout_timedelta
17 timeout_minutes = timeout_timedelta.total_seconds()/60
18 graceout = datetime.now()+silent_timedelta
19 silent_minutes = silent_timedelta.total_seconds()/60
20 period_seconds=int(period.total_seconds())
22 utils.header("max timeout is %d minutes, silent for %d minutes (period is %s s)"%\
23 (timeout_minutes,silent_minutes,period_seconds))
28 success=task.run (silent=datetime.now() <= graceout)
29 if success: fine.append(task)
30 for task in fine: tasks.remove(task)
31 if not tasks: return True
32 if datetime.now() > timeout:
34 print task.failure_message()
35 task.failure_epilogue()
38 print '%ds..'%period_seconds,
39 time.sleep(period_seconds)
44 #################### CompleterTask
45 ### . run(silent) (return True or False)
46 ### silent is an input boolean indicating if we're within the silent period
47 ### . failure() (print a message)
49 ########## expectations (+ first arg self)
50 # failure() (to describe which went wrong once it's over)
58 def run (self, silent):
59 result=self.actual_run()
61 print '+' if result else '.',
64 print self.message(),"->","OK" if result else "KO"
66 def message (self): return "you-need-to-redefine-message"
67 def failure_message (self): return "you-need-to-redefine-failure_message"
68 def failure_epilogue (self): pass
71 class TaskTest (CompleterTask):
73 def __init__ (self,max):
75 self.counter=TaskTest.counter
77 self.delay=random.random()*max
78 self.fire=datetime.now()+timedelta(seconds=self.delay)
80 return datetime.now()>=self.fire
82 return "Task %d - delay was %d s"%(self.counter,self.delay)
84 def failure_message (self): return "BOTTOM LINE: FAILURE with task (%s)"%self.counter
89 print "Usage: <command> number_tasks max_random timeout_s silent_s period_s"
91 [number,max,timeout,silent,period]= [ int(x) for x in sys.argv[1:]]
92 tasks = [ TaskTest(max) for i in range(number)]
93 success=Completer(tasks,verbose=True).run(timedelta(seconds=timeout),
94 timedelta(seconds=silent),
95 timedelta(seconds=period))
96 print "OVERALL",success
98 if __name__ == '__main__':