| 32 | |
| 33 | |
| 34 | class Parser: |
| 35 | def __init__(self, filename=None, timestamp=datetime.now(tz=None)): |
| 36 | self.counters = {} |
| 37 | self.warm_cache = False |
| 38 | self.repository = "" |
| 39 | self.current_timestamp = timestamp.replace(microsecond=0).isoformat() |
| 40 | self.seen_header = False |
| 41 | if filename is not None: |
| 42 | self.parse(filename) |
| 43 | |
| 44 | @staticmethod |
| 45 | def parse_boolean(string): |
| 46 | return string == "yes" or string == "true" \ |
| 47 | or string == "TRUE" or string == "True" |
| 48 | |
| 49 | def __parseline(self, line): |
| 50 | if line[0] == "#": |
| 51 | parameter = line[1:-1].replace(" ", "").split("=") |
| 52 | if parameter[0] == "warm_cache": |
| 53 | self.warm_cache = Parser.parse_boolean(parameter[1]) |
| 54 | elif parameter[0] == "repo": |
| 55 | self.repository = parameter[1].split(".")[0] |
| 56 | else: |
| 57 | # Parse only lines which come after the header line |
| 58 | if self.seen_header: |
| 59 | params = line.strip().split("|") |
| 60 | if len(params) == 3: |
| 61 | counter = Counter(params[0], params[1], params[2]) |
| 62 | if counter.name in self.counters: |
| 63 | self.counters[counter.name].values += counter.values |
| 64 | else: |
| 65 | self.counters[counter.name] = counter |
| 66 | elif line.strip() == "Name|Value|Description": |
| 67 | self.seen_header = True |
| 68 | |
| 69 | def parse(self, filename): |
| 70 | datafile = open(filename, "r") |
| 71 | for line in datafile: |
| 72 | self.__parseline(line) |
| 73 | datafile.close() |
| 74 | |
| 75 | def to_csv(self, filename): |
| 76 | csv = open(filename, "w") |
| 77 | |
| 78 | csv.write(self.current_timestamp + ";" + self.repository + "\n") |
| 79 | for counter in self.counters.values(): |
| 80 | csv.write(counter.name + ";" + str(counter.avg()) + "\n") |
| 81 | csv.close() |
| 82 | |
| 83 | @staticmethod |
| 84 | def to_csv_comparison(parser1, parser2, filename): |
| 85 | csv = open(filename, "w") |
| 86 | csv.write(";origin_avg;origin_std;external_avg;external_std\n") |
| 87 | for key in parser1.counters: |
| 88 | csv.write(parser1.counters[key].name + ";" + |
| 89 | str(parser1.counters[key].avg()).replace(".", ",") + ";" + |
| 90 | str(parser1.counters[key].std()).replace(".", ",") + ";" + |
| 91 | str(parser2.counters[key].avg()).replace(".", ",") + ";" + |
no outgoing calls
no test coverage detected