-
Notifications
You must be signed in to change notification settings - Fork 811
/
Copy pathgenerate_coverage.py
executable file
·67 lines (53 loc) · 1.97 KB
/
generate_coverage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/env python3
from __future__ import annotations
from collections import defaultdict
from pathlib import Path
import orjson
from lxml import etree
ROOT = Path(__file__).resolve().parent.parent
PACKAGES = {"src/bentoml/": "bentoml"}
def main() -> int:
coverage_report = ROOT / "coverage.xml"
root = etree.fromstring(coverage_report.read_text())
raw_package_data: defaultdict[str, dict[str, int]] = defaultdict(
lambda: {"hits": 0, "misses": 0}
)
for package in root.find("packages"):
for module in package.find("classes"):
filename = module.attrib["filename"]
for relative_path, package_name in PACKAGES.items():
if filename.startswith(relative_path):
data = raw_package_data[package_name]
break
else:
message = f"unknown package: {module}"
raise ValueError(message)
for line in module.find("lines"):
if line.attrib["hits"] == "1":
data["hits"] += 1
else:
data["misses"] += 1
total_statements_covered = 0
total_statements = 0
coverage_data = {}
for package_name, data in sorted(raw_package_data.items()):
statements_covered = data["hits"]
statements = statements_covered + data["misses"]
total_statements_covered += statements_covered
total_statements += statements
coverage_data[package_name] = {
"statements_covered": statements_covered,
"statements": statements,
}
coverage_data["total"] = {
"statements_covered": total_statements_covered,
"statements": total_statements,
}
coverage_summary = ROOT / "coverage-summary.json"
coverage_summary.write_text(
orjson.dumps(coverage_data, option=orjson.OPT_INDENT_2).decode(),
encoding="utf-8",
)
return 0
if __name__ == "__main__":
raise SystemExit(main())