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
RevLine 
[3000]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
[3006]9import sys, codecs, locale
10sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
[3000]11
[3002]12Stat = col.namedtuple('Stat', ['count', 'name', 'branch', 'work',
13 'untranslated','fuzzy', 'translated', 'total'])
[3000]14
[3006]15titles = Stat(count=('Номер', 'rjust'), name=('Име', 'ljust'),
16 branch=('Клон', 'ljust'), work=('Работа', 'rjust'),
17 untranslated=('Непреведени', 'rjust'), fuzzy=('Мъгляви', 'rjust'),
18 translated=('Преведени', 'rjust'), total=('Всичко', 'rjust'))
[3002]19
[3006]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'))
[3002]24
25
[3000]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
[3002]37
[3000]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-'):
[3001]55 name = '{}-{}'.format(stat_id, dom_id[3:])
[3000]56 else:
[3001]57 name = '{}-{}'.format(stat_id ,dom_id)
[3000]58 translated = int(dom.findtext('./translated'))
59 fuzzy = int(dom.findtext('./fuzzy'))
60 untranslated = int(dom.findtext('./untranslated'))
61 work = fuzzy + untranslated
[3001]62 total = work + translated
[3002]63 s = Stat(count=None, name=name, branch=stat_branch,
64 translated=translated, fuzzy=fuzzy,
65 untranslated=untranslated, work=work, total=total)
[3000]66 results.append(s)
[3002]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)
[3000]74 return results
75
[3002]76
[3001]77def stats_max_lengths_sums(stats):
[3002]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
[3000]86 for s in stats:
[3002]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
[3000]94
[3002]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}
[3000]103
[3001]104
[3002]105def divider(s):
[3006]106 inner = '┼'.join(['─' * (f + 1) for f in s])
107 return '├' + inner + '┤'
[3001]108
[3006]109def start(s):
110 inner = '┬'.join(['─' * (f + 1) for f in s])
111 return '┌' + inner + '┐'
[3001]112
[3006]113def end(s):
114 inner = '┴'.join(['─' * (f + 1) for f in s])
115 return '└' + inner + '┘'
116
[3007]117def ellipsis(s):
118 inner = '┼'.join(['⋯' * (f + 1) for f in s])
119 return '├' + inner + '┤'
[3006]120
[3007]121
[3002]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)
[3001]129
[3006]130 result = '│{0}{1}{2}{3}{4}{5}{6}{7}│'.format(*tuple(args))
[3001]131 return result
132
[3002]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
[3006]142 result = '│{0}{1}{2}{3}{4}{5}{6}{7}│'.format(*tuple(args))
[3001]143 return result
144
[3002]145
[3000]146def main():
[3093]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)
[3007]157 print('ВСИЧКИ МОДУЛИ')
[3002]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)
[3006]164 s = start(max_len)
[3002]165 d = divider(max_len)
[3006]166 e = end(max_len)
[3007]167 el = ellipsis(max_len)
[3006]168 print(s)
[3002]169 print(title_line(max_len))
170 print(d)
[3001]171 for s in stats:
[3002]172 print(stat_line(max_len, s))
173 print(d)
174 print(stat_line(max_len, sums))
[3006]175 print(e)
[3007]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
[3000]202if __name__ == '__main__':
203 main()
204
205
206
207
Note: See TracBrowser for help on using the repository browser.