Coverage for glotter/report.py: 14%

63 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-04-12 02:25 +0000

1import csv 

2 

3from glotter.source import get_sources 

4from glotter.settings import Settings 

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][ 

37 display_name 

38 ] = f"{source.name}{source.extension}" 

39 

40 return language_stats 

41 

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

52 

53 def write_stdout(self): 

54 column_widths = self._get_column_widths() 

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

56 

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

64 

65 print(header_line) 

66 print(header_underline) 

67 for lang in self._languages: 

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

69 

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 

79 

80 column_widths[project] = max_len 

81 return column_widths