2 from datetime import datetime
4 class renderer(object):
5 """Base class for something that can render."""
10 return self.__class__.__name__
12 class abstaining_renderer(renderer):
13 """A renderer that doesn't do it all the time."""
14 def __init__(self, name_to_timeout_dict):
15 self.name_to_timeout_dict = name_to_timeout_dict;
17 for key in name_to_timeout_dict:
18 self.last_runs[key] = 0
20 def should_render(self, keys_to_skip):
22 for key in self.name_to_timeout_dict:
23 if (((now - self.last_runs[key]) > self.name_to_timeout_dict[key]) and
24 key not in keys_to_skip):
32 key = self.should_render(keys_to_skip)
36 if key in tries_per_key:
37 tries_per_key[key] += 1
39 tries_per_key[key] = 0
41 if tries_per_key[key] >= 3:
42 print('renderer: Too many failures for "%s.%s", giving up' % (
43 self.get_name(), key))
46 msg = 'renderer: executing "%s.%s"' % (self.get_name(), key)
47 if (tries_per_key[key] > 1):
48 msg = msg + " (retry #%d)" % tries_per_key[key]
50 if (self.periodic_render(key)):
51 self.last_runs[key] = time.time()
53 def periodic_render(self, key):
56 class debuggable_abstaining_renderer(abstaining_renderer):
57 def __init__(self, name_to_timeout_dict, debug):
58 super(debuggable_abstaining_renderer, self).__init__(name_to_timeout_dict);
61 def debug_prefix(self):
62 return self.get_name()
64 def being_debugged(self):
67 def debug_print(self, template, *args):
69 if self.being_debugged():
71 msg = template.format(args)
75 # current date and time
77 timestamp = now.strftime("%d-%b-%Y (%H:%M:%S.%f)")
78 print("%s(%s): %s" % (self.debug_prefix(), timestamp, msg))
79 except Exception as e:
80 print("Exception in debug_print!")