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

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

Форматиран изход, да се оправят аргументи на командния ред

  • Property svn:executable set to *
File size: 5.2 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
10
11Stat = col.namedtuple('Stat', ['count', 'name', 'branch', 'work',
12 'untranslated','fuzzy', 'translated', 'total'])
13
14#titles = Stat(count='Номер', name='Име', branch='Клон', work='Работа',
15# untranslated='Непреведени', fuzzy='Мъгляви', translated='Преведени',
16# total='Всичко')
17
18titles = 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 = u2.urlopen(versions_url)
27
28 versions_tree = ET.parse(versions_data)
29 versions_root = versions_tree.getroot()
30 versions_xpath = './object/field[@name="name"]'
31 version_elements = versions_root.findall(versions_xpath)
32 versions = [e.text for e in version_elements]
33 return versions
34
35
36def get_stats(version):
37 stats_url = 'https://l10n.gnome.org/languages/bg/{}/xml'.format(version)
38 stats_data = u2.urlopen(stats_url)
39 stats_tree = ET.parse(stats_data)
40 stats_root = stats_tree.getroot()
41 stats_xpath = './category/module'
42 stats_elements = stats_root.findall(stats_xpath)
43 results = []
44 for stats_el in stats_elements:
45 stat_id = stats_el.attrib['id']
46 stat_branch = stats_el.attrib['branch']
47 domains = stats_el.findall('./domain')
48 for dom in domains:
49 dom_id = dom.attrib['id']
50 if dom_id == 'po':
51 name = stat_id
52 elif dom_id.startswith('po-'):
53 name = '{}-{}'.format(stat_id, dom_id[3:])
54 else:
55 name = '{}-{}'.format(stat_id ,dom_id)
56 translated = int(dom.findtext('./translated'))
57 fuzzy = int(dom.findtext('./fuzzy'))
58 untranslated = int(dom.findtext('./untranslated'))
59 work = fuzzy + untranslated
60 total = work + translated
61 s = Stat(count=None, name=name, branch=stat_branch,
62 translated=translated, fuzzy=fuzzy,
63 untranslated=untranslated, work=work, total=total)
64 results.append(s)
65 # sorts are stable
66 results.sort(key=lambda s: s.name)
67 results.sort(key=lambda s: s.fuzzy, reverse=True)
68 results.sort(key=lambda s: s.untranslated, reverse=True)
69 results.sort(key=lambda s: s.work, reverse=True)
70 for i, s in enumerate(results):
71 results[i] = s._replace(count=i+1)
72 return results
73
74
75def stats_max_lengths_sums(stats):
76 name = 0
77 branch = 0
78 sum_translated = 0
79 sum_fuzzy = 0
80 sum_untranslated = 0
81 sum_work = 0
82 sum_total = 0
83
84 for s in stats:
85 name = max(name, len(s.name))
86 branch = max(branch, len(s.branch))
87 sum_translated = sum_translated + s.translated
88 sum_fuzzy = sum_fuzzy + s.fuzzy
89 sum_untranslated = sum_untranslated + s.untranslated
90 sum_work = sum_work + s.work
91 sum_total = sum_total + s.total
92
93 max_len = Stat(count=len(str(len(stats))), name=name, branch=branch,
94 translated=len(str(sum_translated)), fuzzy=len(str(sum_fuzzy)),
95 untranslated=len(str(sum_untranslated)), work=len(str(sum_work)),
96 total=len(str(sum_total)))
97 sums = Stat(count=len(stats), name='', branch='', translated=sum_translated,
98 fuzzy=sum_fuzzy, untranslated=sum_untranslated, work=sum_work,
99 total=sum_total)
100 return {'max_len': max_len, 'sums': sums}
101
102
103def divider(s):
104 inner = '+'.join(['-' * (f + 1) for f in s])
105 return inner.join(['|'] * 2)
106
107
108def stat_line(max_len, s):
109 args = []
110 for i in range(len(max_len)):
111 width = max_len[i] + 1
112 method_name = 'rjust' if isinstance(s[i], int) else 'ljust'
113 part = getattr(str(s[i]), method_name)(width)[:width]
114 args.append(part)
115
116 result = '|{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|'.format(*tuple(args))
117 return result
118
119
120def title_line(max_len):
121 args = []
122 for i in range(len(max_len)):
123 width = max_len[i] + 1
124 method_name = titles[i][1]
125 part = getattr(titles[i][0], method_name)(width)[:width]
126 args.append(part)
127
128 result = '|{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|'.format(*tuple(args))
129 return result
130
131
132def main():
133 #a = sys.args
134 #versions = get_versions()
135 #if not len(a) == 1 or a[0] not in versions:
136 # print('Give single argument, one of: {} '.format(versions))
137 # print('Will use {}'.format(versions[0]))
138 stats = get_stats('gnome-3-18')
139 sms = stats_max_lengths_sums(stats)
140 max_len = sms['max_len']
141 sums = sms['sums']
142
143 print(max_len)
144 print(sums)
145 d = divider(max_len)
146 print(d)
147 print(title_line(max_len))
148 print(d)
149 for s in stats:
150 print(stat_line(max_len, s))
151 print(d)
152 print(stat_line(max_len, sums))
153
154if __name__ == '__main__':
155 main()
156
157
158
159
Note: See TracBrowser for help on using the repository browser.