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

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

статистика и подредба, липсва антетка и крайни стойности

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