Coverage for glotter/report.py: 14%
63 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-12 02:25 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-12 02:25 +0000
1import csv
3from glotter.source import get_sources
4from glotter.settings import Settings
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][
37 display_name
38 ] = f"{source.name}{source.extension}"
40 return language_stats
42 def write_csv(self, filepath=None):
43 filepath = filepath or "glotter-report.csv"
44 with open(filepath, "w", newline="", encoding="utf-8") as csv_file:
45 languages = sorted(self._language_stats.keys())
46 projects = ["Name"] + self._projects
47 writer = csv.DictWriter(csv_file, fieldnames=projects)
48 writer.writeheader()
49 for language in languages:
50 writer.writerow(self._language_stats[language])
51 print(f"Report written to {filepath}")
53 def write_stdout(self):
54 column_widths = self._get_column_widths()
55 lang_width = max(len(lang) for lang in self._languages)
57 header_line = f"| {{0:<{lang_width}}} | ".format("Language")
58 header_underline = "| " + ("-" * lang_width) + " | "
59 column_template = f"| {{Name:<{lang_width}}} | "
60 for project in self._projects:
61 header_line += f"{{0:<{column_widths[project]}}} | ".format(project)
62 header_underline += ("-" * column_widths[project]) + " | "
63 column_template += f"{{{project}:<{column_widths[project]}}} | "
65 print(header_line)
66 print(header_underline)
67 for lang in self._languages:
68 print(column_template.format(**self._language_stats[lang]))
70 def _get_column_widths(self):
71 column_widths = {}
72 for project in self._projects:
73 max_len = len(project)
74 for lang in self._languages:
75 if project in self._language_stats[lang]:
76 entry_len = len(self._language_stats[lang][project])
77 if entry_len > max_len:
78 max_len = entry_len
80 column_widths[project] = max_len
81 return column_widths