Adds myq_renderer.py
[kiosk.git] / renderer.py
1 import time
2 from datetime import datetime
3
4 class renderer(object):
5     """Base class for something that can render."""
6     def render(self):
7         pass
8
9 class abstaining_renderer(renderer):
10     """A renderer that doesn't do it all the time."""
11     def __init__(self, name_to_timeout_dict):
12         self.name_to_timeout_dict = name_to_timeout_dict;
13         self.last_runs = {}
14         for key in name_to_timeout_dict:
15             self.last_runs[key] = 0
16
17     def should_render(self, keys_to_skip):
18         now = time.time()
19         for key in self.name_to_timeout_dict:
20             if key in keys_to_skip:
21                 continue
22             if (now - self.last_runs[key]) > self.name_to_timeout_dict[key]:
23                 return key
24         return None
25
26     def render(self):
27         tries = {}
28         keys_to_skip = set()
29         while True:
30             key = self.should_render(keys_to_skip)
31             if key == None:
32                 break
33             if key in tries:
34                 tries[key] += 1
35             else:
36                 tries[key] = 0
37
38             if tries[key] > 5:
39                 print('Too many retries for "%s", giving up for now' % key)
40                 keys_to_skip.add(key)
41             else:
42                 msg = 'renderer: periodic render event for "%s"' % key
43                 if (tries[key] > 1):
44                     msg = msg + " (try %d)" % tries[key]
45                 print(msg)
46                 if (self.periodic_render(key)):
47                     self.last_runs[key] = time.time()
48
49     def periodic_render(self, key):
50         pass
51
52 class debuggable_abstaining_renderer(abstaining_renderer):
53     def __init__(self, name_to_timeout_dict, debug):
54         super(debuggable_abstaining_renderer, self).__init__(name_to_timeout_dict);
55         self.debug = debug
56
57     def debug_prefix(self):
58         return "none"
59
60     def being_debugged(self):
61         return self.debug
62
63     def debug_print(self, template, *args):
64         try:
65             if self.being_debugged():
66                 if args:
67                     msg = template.format(args)
68                 else:
69                     msg = template
70
71                 # current date and time
72                 now = datetime.now()
73                 timestamp = now.strftime("%d-%b-%Y (%H:%M:%S.%f)")
74                 print "%s(%s): %s" % (self.debug_prefix(), timestamp, msg)
75         except Exception as e:
76             print "Exception in debug_print!"
77             print e