Skip to content

Commit 3434f0a

Browse files
committed
Use Transifex API v3 for generating .tx/config
Base on per string calculations for stats in README 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 e8fee97 commit 3434f0a

File tree

1 file changed

+31
-9
lines changed

1 file changed

+31
-9
lines changed

manage_translation.py

+31-9
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def recreate_tx_config():
6161
'host = https://www.transifex.com\n',
6262
))
6363
for resource in resources:
64-
slug = resource['slug']
64+
slug = resource.slug
6565
name = RESOURCE_NAME_MAP.get(slug, slug)
6666
if slug == '0':
6767
continue
@@ -86,6 +86,15 @@ def recreate_tx_config():
8686
))
8787

8888

89+
@dataclass
90+
class Resource:
91+
slug: str
92+
93+
@classmethod
94+
def from_api_v3_entry(cls, data: dict) -> Self:
95+
return cls(slug=data['attributes']['slug'])
96+
97+
8998
@dataclass
9099
class ResourceLanguageStatistics:
91100
name: str
@@ -105,7 +114,7 @@ def from_api_v3_entry(cls, data: dict) -> Self:
105114
)
106115

107116

108-
def _get_resources():
117+
def _get_from_api_v3_with_cursor(url: str, params: dict):
109118
from requests import get
110119
resources = []
111120
cursor = None
@@ -116,19 +125,32 @@ def _get_resources():
116125
transifex_api_key = os.getenv('TX_TOKEN')
117126
while True:
118127
response = get(
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 {}),
128+
url,
129+
params=params | ({'page[cursor]': cursor} if cursor else {}),
123130
headers={'Authorization': f'Bearer {transifex_api_key}'}
124131
)
125132
response.raise_for_status()
126133
response_json = response.json()
127134
response_list = response_json['data']
128135
resources.extend(response_list)
129-
if 'next' not in response_json['links']:
136+
if not response_json['links'].get('next'): # for stats no key, for list resources null
130137
break
131138
cursor = unquote(search('page\[cursor]=([^&]*)', response_json['links']['next']).group(1))
139+
return resources
140+
141+
142+
def _get_resources():
143+
resources = _get_from_api_v3_with_cursor(
144+
'https://rest.api.transifex.com/resources', {'filter[project]': f'o:python-doc:p:{PROJECT_SLUG}'}
145+
)
146+
return [Resource.from_api_v3_entry(entry) for entry in resources]
147+
148+
149+
def _get_resource_language_stats():
150+
resources = _get_from_api_v3_with_cursor(
151+
'https://rest.api.transifex.com/resource_language_stats',
152+
{'filter[project]': f'o:python-doc:p:{PROJECT_SLUG}', 'filter[language]': f'l:{LANGUAGE}'}
153+
)
132154
return [ResourceLanguageStatistics.from_api_v3_entry(entry) for entry in resources]
133155

134156

@@ -154,9 +176,9 @@ def language_switcher(entry):
154176
def average(averages, weights):
155177
return sum([a * w for a, w in zip(averages, weights)]) / sum(weights)
156178

157-
resources = _get_resources()
179+
resources = _get_resource_language_stats()
158180
filtered = list(filter(language_switcher, resources))
159-
average_list = [e.translated_words / e.total_words for e in filtered]
181+
average_list = [e.translated_strings / e.total_strings for e in filtered]
160182
weights_list = [e.total_words for e in filtered]
161183

162184
language_switcher_status = average(average_list, weights=weights_list) * 100

0 commit comments

Comments
 (0)