]> scripts.mit.edu Git - wizard.git/blob - wizard/report.py
Set admin e-mail address properly on MediaWiki >= 1.18.0
[wizard.git] / wizard / report.py
1 """
2 Classes and functions for recording machine friendly data
3 about the overall distribution about what happened to
4 installations.  This is a strict superset of :mod:`wizard.seen`
5 functionality, as it records seen autoinstallers in finer
6 granularity.
7
8 .. warning::
9
10     This code relies on indexes not being changed while using
11     the same directory.  We should probably add some sanity
12     checks for this.
13 """
14
15 import os
16 import errno
17
18 class ReportSet(object):
19     #: Dictionary of names to reports
20     reports = None
21     def __init__(self, reports):
22         self.reports = reports
23     def write(self, name, i, *entry):
24         self.reports[name].write(i, *entry)
25
26 class Report(object):
27     #: File object to this report
28     file = None
29     #: Set of indexes
30     values = None
31     def __init__(self, file, values=None):
32         self.file = file
33         self.values = set() if values is None else values
34     def write(self, i, *entry):
35         self.file.write("%04d %s\n" % (i, ' '.join(entry)))
36         self.values.add(i)
37         self.file.flush()
38
39 def make(log_dir, *names):
40     reports = {}
41     for name in names:
42         filename = os.path.join(log_dir, "%s.txt" % name)
43         values = set()
44         try:
45             for line in open(filename):
46                 if not line: continue
47                 values.add(int(line.partition(' ')[0]))
48         except IOError as e:
49             if e.errno == errno.ENOENT:
50                 pass
51             else:
52                 raise
53         file = open(filename, "a")
54         reports[name] = Report(file, values)
55     return ReportSet(reports)
56
57 def make_fresh(log_dir, *names):
58     reports = {}
59     for name in names:
60         file = open(os.path.join(log_dir, "%s.txt" % name), "w")
61         reports[name] = Report(file)
62     return ReportSet(reports)