Coverage for glotter/report.py: 15%
62 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-09-13 19:09 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-09-13 19:09 +0000
1import csv
3from glotter.settings import Settings
4from glotter.source import get_sources
7def report(args):
8 filepath = args.output
9 reporter = Reporter()
10 if filepath is not None:
11 reporter.write_csv(filepath)
12 else:
13 reporter.write_stdout()
16class Reporter:
17 def __init__(self):
18 self._projects = sorted([p.display_name for p in Settings().projects.values()])
19 self._language_stats = self._collect_language_stats()
20 self._languages = sorted(self._language_stats.keys())
22 @staticmethod
23 def _get_project_display_name(key):
24 return Settings().projects[key].display_name
26 def _collect_language_stats(self):
27 language_stats = {}
28 sources_by_type = get_sources(Settings().source_root)
30 for project, sources in sources_by_type.items():
31 display_name = self._get_project_display_name(project)
32 for source in sources:
33 if source.language not in language_stats:
34 language_stats[source.language] = {p: "" for p in self._projects}
35 language_stats[source.language]["Name"] = source.language
36 language_stats[source.language][display_name] = f"{source.name}{source.extension}"
38 return language_stats
40 def write_csv(self, filepath=None):
41 filepath = filepath or "glotter-report.csv"
42 with open(filepath, "w", newline="", encoding="utf-8") as csv_file:
43 languages = sorted(self._language_stats.keys())
44 projects = ["Name"] + self._projects
45 writer = csv.DictWriter(csv_file, fieldnames=projects)
46 writer.writeheader()
47 for language in languages:
48 writer.writerow(self._language_stats[language])
49 print(f"Report written to {filepath}")
51 def write_stdout(self):
52 column_widths = self._get_column_widths()
53 lang_width = max(len(lang) for lang in self._languages)
55 header_line = f"| {{0:<{lang_width}}} | ".format("Language")
56 header_underline = "| " + ("-" * lang_width) + " | "
57 column_template = f"| {{Name:<{lang_width}}} | "
58 for project in self._projects:
59 header_line += f"{{0:<{column_widths[project]}}} | ".format(project)
60 header_underline += ("-" * column_widths[project]) + " | "
61 column_template += f"{{{project}:<{column_widths[project]}}} | "
63 print(header_line)
64 print(header_underline)
65 for lang in self._languages:
66 print(column_template.format(**self._language_stats[lang]))
68 def _get_column_widths(self):
69 column_widths = {}
70 for project in self._projects:
71 max_len = len(project)
72 for lang in self._languages:
73 if project in self._language_stats[lang]:
74 entry_len = len(self._language_stats[lang][project])
75 max_len = max(max_len, entry_len)
77 column_widths[project] = max_len
78 return column_widths