Skip to content

Commit e8fee97

Browse files
committed
Use Transifex API v3 for getting stats
Base on per string calculations for backwards compatibility -- this gives 55.39 today vs 48.01 on per word calculations Old Transifex API stopped to work on Feb 13 at 10AM CET
1 parent 9c8e4c3 commit e8fee97

File tree

1 file changed

+40
-14
lines changed

1 file changed

+40
-14
lines changed

manage_translation.py

+40-14
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@
1515
from argparse import ArgumentParser
1616
from collections import Counter
1717
import os
18-
from re import match
18+
from dataclasses import dataclass
19+
from re import match, search
1920
from subprocess import call, run
2021
import sys
22+
from typing import Self
23+
from urllib.parse import unquote
2124

2225
LANGUAGE = 'pl'
2326

@@ -83,27 +86,50 @@ def recreate_tx_config():
8386
))
8487

8588

89+
@dataclass
90+
class ResourceLanguageStatistics:
91+
name: str
92+
total_words: int
93+
translated_words: int
94+
total_strings: int
95+
translated_strings: int
96+
97+
@classmethod
98+
def from_api_v3_entry(cls, data: dict) -> Self:
99+
return cls(
100+
name=search('r:([^:]*)', data['id']).group(1),
101+
total_words=data['attributes']['total_words'],
102+
translated_words=data['attributes']['translated_words'],
103+
total_strings=data['attributes']['total_strings'],
104+
translated_strings=data['attributes']['translated_strings'],
105+
)
106+
107+
86108
def _get_resources():
87109
from requests import get
88110
resources = []
89-
offset = 0
111+
cursor = None
90112
if os.path.exists('.tx/api-key'):
91113
with open('.tx/api-key') as f:
92114
transifex_api_key = f.read()
93115
else:
94116
transifex_api_key = os.getenv('TX_TOKEN')
95117
while True:
96118
response = get(
97-
f'https://api.transifex.com/organizations/python-doc/projects/{PROJECT_SLUG}/resources/',
98-
params={'language_code': LANGUAGE, 'offset': offset},
99-
auth=('api', transifex_api_key))
119+
'https://rest.api.transifex.com/resource_language_stats',
120+
params={
121+
'filter[project]': f'o:python-doc:p:{PROJECT_SLUG}', 'filter[language]': f'l:{LANGUAGE}'
122+
} | ({'page[cursor]': cursor} if cursor else {}),
123+
headers={'Authorization': f'Bearer {transifex_api_key}'}
124+
)
100125
response.raise_for_status()
101-
response_list = response.json()
126+
response_json = response.json()
127+
response_list = response_json['data']
102128
resources.extend(response_list)
103-
if len(response_list) < 100:
129+
if 'next' not in response_json['links']:
104130
break
105-
offset += len(response_list)
106-
return resources
131+
cursor = unquote(search('page\[cursor]=([^&]*)', response_json['links']['next']).group(1))
132+
return [ResourceLanguageStatistics.from_api_v3_entry(entry) for entry in resources]
107133

108134

109135
def _get_number_of_translators():
@@ -121,17 +147,17 @@ def _get_number_of_translators():
121147

122148
def recreate_readme():
123149
def language_switcher(entry):
124-
return (entry['name'].startswith('bugs') or
125-
entry['name'].startswith('tutorial') or
126-
entry['name'].startswith('library--functions'))
150+
return (entry.name.startswith('bugs') or
151+
entry.name.startswith('tutorial') or
152+
entry.name.startswith('library--functions'))
127153

128154
def average(averages, weights):
129155
return sum([a * w for a, w in zip(averages, weights)]) / sum(weights)
130156

131157
resources = _get_resources()
132158
filtered = list(filter(language_switcher, resources))
133-
average_list = [e['stats']['translated']['percentage'] for e in filtered]
134-
weights_list = [e['wordcount'] for e in filtered]
159+
average_list = [e.translated_words / e.total_words for e in filtered]
160+
weights_list = [e.total_words for e in filtered]
135161

136162
language_switcher_status = average(average_list, weights=weights_list) * 100
137163
number_of_translators = _get_number_of_translators()

0 commit comments

Comments
 (0)