#!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import unicode_literals, print_function import urllib2 as u2 import xml.etree.ElementTree as ET import collections as col import sys Stat = col.namedtuple('Stat', ['count', 'name', 'branch', 'work', 'untranslated','fuzzy', 'translated', 'total']) #titles = Stat(count='Номер', name='Име', branch='Клон', work='Работа', # untranslated='Непреведени', fuzzy='Мъгляви', translated='Преведени', # total='Всичко') titles = Stat(count=('Number', 'rjust'), name=('Name', 'ljust'), branch=('Branch', 'ljust'), work=('Work', 'ljust'), untranslated=('Untranslated', 'ljust'), fuzzy=('Fuzyy', 'rjust'), translated=('Translated', 'rjust'), total=('All', 'rjust')) def get_versions(): versions_url = 'https://l10n.gnome.org/releases/xml' versions_data = u2.urlopen(versions_url) versions_tree = ET.parse(versions_data) versions_root = versions_tree.getroot() versions_xpath = './object/field[@name="name"]' version_elements = versions_root.findall(versions_xpath) versions = [e.text for e in version_elements] return versions def get_stats(version): stats_url = 'https://l10n.gnome.org/languages/bg/{}/xml'.format(version) stats_data = u2.urlopen(stats_url) stats_tree = ET.parse(stats_data) stats_root = stats_tree.getroot() stats_xpath = './category/module' stats_elements = stats_root.findall(stats_xpath) results = [] for stats_el in stats_elements: stat_id = stats_el.attrib['id'] stat_branch = stats_el.attrib['branch'] domains = stats_el.findall('./domain') for dom in domains: dom_id = dom.attrib['id'] if dom_id == 'po': name = stat_id elif dom_id.startswith('po-'): name = '{}-{}'.format(stat_id, dom_id[3:]) else: name = '{}-{}'.format(stat_id ,dom_id) translated = int(dom.findtext('./translated')) fuzzy = int(dom.findtext('./fuzzy')) untranslated = int(dom.findtext('./untranslated')) work = fuzzy + untranslated total = work + translated s = Stat(count=None, name=name, branch=stat_branch, translated=translated, fuzzy=fuzzy, untranslated=untranslated, work=work, total=total) results.append(s) # sorts are stable results.sort(key=lambda s: s.name) results.sort(key=lambda s: s.fuzzy, reverse=True) results.sort(key=lambda s: s.untranslated, reverse=True) results.sort(key=lambda s: s.work, reverse=True) for i, s in enumerate(results): results[i] = s._replace(count=i+1) return results def stats_max_lengths_sums(stats): name = 0 branch = 0 sum_translated = 0 sum_fuzzy = 0 sum_untranslated = 0 sum_work = 0 sum_total = 0 for s in stats: name = max(name, len(s.name)) branch = max(branch, len(s.branch)) sum_translated = sum_translated + s.translated sum_fuzzy = sum_fuzzy + s.fuzzy sum_untranslated = sum_untranslated + s.untranslated sum_work = sum_work + s.work sum_total = sum_total + s.total max_len = Stat(count=len(str(len(stats))), name=name, branch=branch, translated=len(str(sum_translated)), fuzzy=len(str(sum_fuzzy)), untranslated=len(str(sum_untranslated)), work=len(str(sum_work)), total=len(str(sum_total))) sums = Stat(count=len(stats), name='', branch='', translated=sum_translated, fuzzy=sum_fuzzy, untranslated=sum_untranslated, work=sum_work, total=sum_total) return {'max_len': max_len, 'sums': sums} def divider(s): inner = '+'.join(['-' * (f + 1) for f in s]) return inner.join(['|'] * 2) def stat_line(max_len, s): args = [] for i in range(len(max_len)): width = max_len[i] + 1 method_name = 'rjust' if isinstance(s[i], int) else 'ljust' part = getattr(str(s[i]), method_name)(width)[:width] args.append(part) result = '|{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|'.format(*tuple(args)) return result def title_line(max_len): args = [] for i in range(len(max_len)): width = max_len[i] + 1 method_name = titles[i][1] part = getattr(titles[i][0], method_name)(width)[:width] args.append(part) result = '|{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|'.format(*tuple(args)) return result def main(): #a = sys.args #versions = get_versions() #if not len(a) == 1 or a[0] not in versions: # print('Give single argument, one of: {} '.format(versions)) # print('Will use {}'.format(versions[0])) stats = get_stats('gnome-3-18') sms = stats_max_lengths_sums(stats) max_len = sms['max_len'] sums = sms['sums'] print(max_len) print(sums) d = divider(max_len) print(d) print(title_line(max_len)) print(d) for s in stats: print(stat_line(max_len, s)) print(d) print(stat_line(max_len, sums)) if __name__ == '__main__': main()