| 1 | #!/usr/bin/python
|
|---|
| 2 | # -*- coding: utf-8 -*-
|
|---|
| 3 |
|
|---|
| 4 | from __future__ import unicode_literals, print_function
|
|---|
| 5 |
|
|---|
| 6 | import urllib2 as u2
|
|---|
| 7 | import xml.etree.ElementTree as ET
|
|---|
| 8 | import collections as col
|
|---|
| 9 | import sys
|
|---|
| 10 |
|
|---|
| 11 | titles = {'count': 'Номе',
|
|---|
| 12 | 'name': 'Име',
|
|---|
| 13 | 'branch': 'Клон',
|
|---|
| 14 | 'work':'Работ',
|
|---|
| 15 | 'untranslated': 'Непре',
|
|---|
| 16 | 'fuzzy': 'Мъгля',
|
|---|
| 17 | 'translated': 'Превед',
|
|---|
| 18 | 'total': 'Всичко'}
|
|---|
| 19 |
|
|---|
| 20 | def 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 |
|
|---|
| 31 | def 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-'):
|
|---|
| 48 | name = '{}-{}'.format(stat_id, dom_id[3:])
|
|---|
| 49 | else:
|
|---|
| 50 | name = '{}-{}'.format(stat_id ,dom_id)
|
|---|
| 51 | translated = int(dom.findtext('./translated'))
|
|---|
| 52 | fuzzy = int(dom.findtext('./fuzzy'))
|
|---|
| 53 | untranslated = int(dom.findtext('./untranslated'))
|
|---|
| 54 | work = fuzzy + untranslated
|
|---|
| 55 | total = work + translated
|
|---|
| 56 | s = {'name': name,
|
|---|
| 57 | 'branch': stat_branch,
|
|---|
| 58 | 'translated': translated,
|
|---|
| 59 | 'fuzzy': fuzzy,
|
|---|
| 60 | 'untranslated': untranslated,
|
|---|
| 61 | 'work': work,
|
|---|
| 62 | 'total': total}
|
|---|
| 63 | results.append(s)
|
|---|
| 64 | return results
|
|---|
| 65 |
|
|---|
| 66 | def 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}
|
|---|
| 71 | for s in stats:
|
|---|
| 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}
|
|---|
| 74 |
|
|---|
| 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
|
|---|
| 79 |
|
|---|
| 80 | def display_max_lengths(lengths):
|
|---|
| 81 | result = {k:max(len(titles[k]), lengths[k]) for k,v in titles.items()}
|
|---|
| 82 | return result
|
|---|
| 83 |
|
|---|
| 84 | def 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 |
|
|---|
| 97 | def ljust(length, sth):
|
|---|
| 98 | s = str(sth)
|
|---|
| 99 | result = (s + ' ' * length)[:length+1]
|
|---|
| 100 | #print('ljust', length, sth, '>'+result+'<')
|
|---|
| 101 | return result
|
|---|
| 102 |
|
|---|
| 103 | def rjust(length, sth):
|
|---|
| 104 | s = str(sth)
|
|---|
| 105 | result = (' ' * length + s)[-length:]
|
|---|
| 106 | #print('rjust', length, sth, '>'+result+'<')
|
|---|
| 107 | return result
|
|---|
| 108 |
|
|---|
| 109 | def 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 |
|
|---|
| 120 | def 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')
|
|---|
| 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)
|
|---|
| 132 | print(stats)
|
|---|
| 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)
|
|---|
| 145 |
|
|---|
| 146 | if __name__ == '__main__':
|
|---|
| 147 | main()
|
|---|
| 148 |
|
|---|
| 149 |
|
|---|
| 150 |
|
|---|
| 151 |
|
|---|