@@ -61,7 +61,7 @@ def recreate_tx_config():
6161'host = https://www.transifex.com\n ' ,
6262 ))
6363for resource in resources :
64- slug = resource [ ' slug' ]
64+ slug = resource . slug
6565name = RESOURCE_NAME_MAP .get (slug ,slug )
6666if slug == '0' :
6767continue
@@ -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
9099class ResourceLanguageStatistics :
91100name :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 ):
109118from requests import get
110119resources = []
111120cursor = None
@@ -116,19 +125,32 @@ def _get_resources():
116125transifex_api_key = os .getenv ('TX_TOKEN' )
117126while True :
118127response = 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 {}),
123130headers = {'Authorization' :f'Bearer{ transifex_api_key } ' }
124131 )
125132response .raise_for_status ()
126133response_json = response .json ()
127134response_list = response_json ['data' ]
128135resources .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
130137break
131138cursor = 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+ )
132154return [ResourceLanguageStatistics .from_api_v3_entry (entry )for entry in resources ]
133155
134156
@@ -154,9 +176,9 @@ def language_switcher(entry):
154176def average (averages ,weights ):
155177return sum ([a * w for a ,w in zip (averages ,weights )])/ sum (weights )
156178
157- resources = _get_resources ()
179+ resources = _get_resource_language_stats ()
158180filtered = 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 ]
160182weights_list = [e .total_words for e in filtered ]
161183
162184language_switcher_status = average (average_list ,weights = weights_list )* 100