@@ -65,7 +65,7 @@ def recreate_tx_config():
6565 )
6666 )
6767for resource in resources :
68- slug = resource [ ' slug' ]
68+ slug = resource . slug
6969name = RESOURCE_NAME_MAP .get (slug ,slug )
7070if slug == '0' :
7171continue
@@ -94,6 +94,15 @@ def recreate_tx_config():
9494 )
9595
9696
97+ @dataclass
98+ class Resource :
99+ slug :str
100+
101+ @classmethod
102+ def from_api_v3_entry (cls ,data :dict )-> Self :
103+ return cls (slug = data ['attributes' ]['slug' ])
104+
105+
97106@dataclass
98107class ResourceLanguageStatistics :
99108name :str
@@ -113,7 +122,7 @@ def from_api_v3_entry(cls, data: dict) -> Self:
113122 )
114123
115124
116- def _get_resources ( ):
125+ def _get_from_api_v3_with_cursor ( url : str , params : dict ):
117126from requests import get
118127
119128resources = []
@@ -125,19 +134,32 @@ def _get_resources():
125134transifex_api_key = os .getenv ('TX_TOKEN' )
126135while True :
127136response = get (
128- 'https://rest.api.transifex.com/resource_language_stats' ,
129- params = {
130- 'filter[project]' :f'o:python-doc:p:{ PROJECT_SLUG } ' ,'filter[language]' :f'l:{ LANGUAGE } '
131- }| ({'page[cursor]' :cursor }if cursor else {}),
137+ url ,
138+ params = params | ({'page[cursor]' :cursor }if cursor else {}),
132139headers = {'Authorization' :f'Bearer{ transifex_api_key } ' }
133140 )
134141response .raise_for_status ()
135142response_json = response .json ()
136143response_list = response_json ['data' ]
137144resources .extend (response_list )
138- if 'next' not in response_json ['links' ]:
145+ if not response_json ['links' ]. get ( 'next' ): # for stats no key, for list resources null
139146break
140147cursor = unquote (search ('page\[cursor]=([^&]*)' ,response_json ['links' ]['next' ]).group (1 ))
148+ return resources
149+
150+
151+ def _get_resources ():
152+ resources = _get_from_api_v3_with_cursor (
153+ 'https://rest.api.transifex.com/resources' , {'filter[project]' :f'o:python-doc:p:{ PROJECT_SLUG } ' }
154+ )
155+ return [Resource .from_api_v3_entry (entry )for entry in resources ]
156+
157+
158+ def _get_resource_language_stats ():
159+ resources = _get_from_api_v3_with_cursor (
160+ 'https://rest.api.transifex.com/resource_language_stats' ,
161+ {'filter[project]' :f'o:python-doc:p:{ PROJECT_SLUG } ' ,'filter[language]' :f'l:{ LANGUAGE } ' }
162+ )
141163return [ResourceLanguageStatistics .from_api_v3_entry (entry )for entry in resources ]
142164
143165
@@ -163,9 +185,9 @@ def language_switcher(entry):
163185def average (averages ,weights ):
164186return sum ([a * w for a ,w in zip (averages ,weights )])/ sum (weights )
165187
166- resources = _get_resources ()
188+ resources = _get_resource_language_stats ()
167189filtered = list (filter (language_switcher ,resources ))
168- average_list = [e .translated_words / e .total_words for e in filtered ]
190+ average_list = [e .translated_strings / e .total_strings for e in filtered ]
169191weights_list = [e .total_words for e in filtered ]
170192
171193language_switcher_status = average (average_list ,weights = weights_list )* 100