Coverage for glotter/report.py: 15%

62 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-09-13 19:09 +0000

1import csv 

2 

3from glotter.settings import Settings 

4from glotter.source import get_sources 

5 

6 

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() 

14 

15 

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()) 

21 

22 @staticmethod 

23 def _get_project_display_name(key): 

24 return Settings().projects[key].display_name 

25 

26 def _collect_language_stats(self): 

27 language_stats = {} 

28 sources_by_type = get_sources(Settings().source_root) 

29 

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}" 

37 

38 return language_stats 

39 

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}") 

50 

51 def write_stdout(self): 

52 column_widths = self._get_column_widths() 

53 lang_width = max(len(lang) for lang in self._languages) 

54 

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]}}} | " 

62 

63 print(header_line) 

64 print(header_underline) 

65 for lang in self._languages: 

66 print(column_template.format(**self._language_stats[lang])) 

67 

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) 

76 

77 column_widths[project] = max_len 

78 return column_widths