source: scripts/xml-stats/stats.py

Last change on this file was 3119, checked in by Александър Шопов, 9 years ago

stats.py: порт към Python3

  • Property svn:executable set to *
File size: 6.4 KB
Line 
1#!/usr/local/bin/python3
2# -*- coding: utf-8 -*-
3
4import urllib.request as r
5import xml.etree.ElementTree as ET
6import collections as col
7import sys
8
9
10Stat = col.namedtuple('Stat', ['count', 'name', 'branch', 'work',
11 'untranslated','fuzzy', 'translated', 'total'])
12
13titles = Stat(count=('Номер', 'rjust'), name=('Име', 'ljust'),
14 branch=('Клон', 'ljust'), work=('Работа', 'rjust'),
15 untranslated=('Непреведени', 'rjust'), fuzzy=('Мъгляви', 'rjust'),
16 translated=('Преведени', 'rjust'), total=('Всичко', 'rjust'))
17
18#titles = Stat(count=('Number', 'rjust'), name=('Name', 'ljust'),
19# branch=('Branch', 'ljust'), work=('Work', 'ljust'),
20# untranslated=('Untranslated', 'ljust'), fuzzy=('Fuzyy', 'rjust'),
21# translated=('Translated', 'rjust'), total=('All', 'rjust'))
22
23
24def get_versions():
25 versions_url = 'https://l10n.gnome.org/releases/xml'
26 versions_data = r.urlopen(versions_url)
27 versions_tree = ET.parse(versions_data)
28 versions_root = versions_tree.getroot()
29 versions_xpath = './object/field[@name="name"]'
30 version_elements = versions_root.findall(versions_xpath)
31 versions = [e.text for e in version_elements]
32 return versions
33
34
35def get_stats(version):
36 stats_url = 'https://l10n.gnome.org/languages/bg/{}/xml'.format(version)
37 stats_data = r.urlopen(stats_url)
38 stats_tree = ET.parse(stats_data)
39 stats_root = stats_tree.getroot()
40 stats_xpath = './category/module'
41 stats_elements = stats_root.findall(stats_xpath)
42 results = []
43 for stats_el in stats_elements:
44 stat_id = stats_el.attrib['id']
45 stat_branch = stats_el.attrib['branch']
46 domains = stats_el.findall('./domain')
47 for dom in domains:
48 dom_id = dom.attrib['id']
49 if dom_id == 'po':
50 name = stat_id
51 elif dom_id.startswith('po-'):
52 name = '{}-{}'.format(stat_id, dom_id[3:])
53 else:
54 name = '{}-{}'.format(stat_id ,dom_id)
55 translated = int(dom.findtext('./translated'))
56 fuzzy = int(dom.findtext('./fuzzy'))
57 untranslated = int(dom.findtext('./untranslated'))
58 work = fuzzy + untranslated
59 total = work + translated
60 s = Stat(count=None, name=name, branch=stat_branch,
61 translated=translated, fuzzy=fuzzy,
62 untranslated=untranslated, work=work, total=total)
63 results.append(s)
64 # sorts are stable
65 results.sort(key=lambda s: s.name)
66 results.sort(key=lambda s: s.fuzzy, reverse=True)
67 results.sort(key=lambda s: s.untranslated, reverse=True)
68 results.sort(key=lambda s: s.work, reverse=True)
69 for i, s in enumerate(results):
70 results[i] = s._replace(count=i+1)
71 return results
72
73
74def stats_max_lengths_sums(stats):
75 name = 0
76 branch = 0
77 sum_translated = 0
78 sum_fuzzy = 0
79 sum_untranslated = 0
80 sum_work = 0
81 sum_total = 0
82 for s in stats:
83 name = max(name, len(s.name))
84 branch = max(branch, len(s.branch))
85 sum_translated = sum_translated + s.translated
86 sum_fuzzy = sum_fuzzy + s.fuzzy
87 sum_untranslated = sum_untranslated + s.untranslated
88 sum_work = sum_work + s.work
89 sum_total = sum_total + s.total
90 max_len = Stat(count=len(str(len(stats))), name=name, branch=branch,
91 translated=len(str(sum_translated)), fuzzy=len(str(sum_fuzzy)),
92 untranslated=len(str(sum_untranslated)), work=len(str(sum_work)),
93 total=len(str(sum_total)))
94 sums = Stat(count=len(stats), name='', branch='', translated=sum_translated,
95 fuzzy=sum_fuzzy, untranslated=sum_untranslated, work=sum_work,
96 total=sum_total)
97 return {'max_len': max_len, 'sums': sums}
98
99
100def divider(s):
101 inner = '┼'.join(['─' * (f + 1) for f in s])
102 return '├' + inner + '┤'
103
104
105def start(s):
106 inner = '┬'.join(['─' * (f + 1) for f in s])
107 return '┌' + inner + '┐'
108
109
110def end(s):
111 inner = '┴'.join(['─' * (f + 1) for f in s])
112 return '└' + inner + '┘'
113
114
115def ellipsis(s):
116 inner = '┼'.join(['⋯' * (f + 1) for f in s])
117 return '├' + inner + '┤'
118
119
120def stat_line(max_len, s):
121 args = []
122 for i in range(len(max_len)):
123 width = max_len[i] + 1
124 method_name = 'rjust' if isinstance(s[i], int) else 'ljust'
125 part = getattr(str(s[i]), method_name)(width)[:width]
126 args.append(part)
127 result = '│{0}{1}{2}{3}{4}{5}{6}{7}│'.format(*tuple(args))
128 return result
129
130
131def title_line(max_len):
132 args = []
133 for i in range(len(max_len)):
134 width = max_len[i] + 1
135 method_name = titles[i][1]
136 part = getattr(titles[i][0], method_name)(width)[:width]
137 args.append(part)
138 result = '│{0}{1}{2}{3}{4}{5}{6}{7}│'.format(*tuple(args))
139 return result
140
141
142def main():
143 a = sys.argv
144 versions = get_versions()
145 #print('НАЛИЧНИ ВЕРСИИ')
146 #print(versions)
147 if not len(a) == 2 or a[1] not in versions:
148 print('Дайте максимум един аргумент, възможни стойности: {} '.format(versions))
149 print('Ще се ползва {}'.format(versions[0]))
150 version = versions[0]
151 else:
152 version = a[1]
153 stats = get_stats(version)
154 print('ВСИЧКИ МОДУЛИ')
155 sms = stats_max_lengths_sums(stats)
156 max_len = sms['max_len']
157 sums = sms['sums']
158
159 #print(max_len)
160 #print(sums)
161 s = start(max_len)
162 d = divider(max_len)
163 e = end(max_len)
164 el = ellipsis(max_len)
165 print(s)
166 print(title_line(max_len))
167 print(d)
168 for s in stats:
169 print(stat_line(max_len, s))
170 print(d)
171 print(stat_line(max_len, sums))
172 print(e)
173
174 print('НЕДОПРЕВЕДЕНИ МОДУЛИ')
175 stats = [s for s in stats if s.work > 0]
176 sms = stats_max_lengths_sums(stats)
177 max_len = sms['max_len']
178 sums = sms['sums']
179
180 #print(max_len)
181 #print(sums)
182 s = start(max_len)
183 d = divider(max_len)
184 e = end(max_len)
185 el = ellipsis(max_len)
186 print(s)
187 print(title_line(max_len))
188 print(d)
189 for s in stats:
190 print(stat_line(max_len, s))
191 print(el)
192 print(d)
193 print(stat_line(max_len, sums))
194 print(e)
195
196
197if __name__ == '__main__':
198 main()
199
200
201
202
Note: See TracBrowser for help on using the repository browser.