source: scripts/xml-stats/stats.py

Last change on this file was 3119, checked in by Александър Шопов, 2 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.