source: scripts/xml-stats/stats.py@ 3093

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

stats.py - правилно подаване на версия на GNOME и правилна стандартна версия

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