@@ -136,46 +136,108 @@ def __get_testflight_latest_build_info(
136136 self ,
137137 pre_release_versions : List [_ResourceVersion ],
138138 build_expired_status : Optional [bool ],
139- all_versions : bool = False ,
140139 ) -> Optional [_LatestBuildInfo ]:
141- candidates : List [_LatestBuildInfo ] = []
142140 for pre_release_version in pre_release_versions :
143141 max_build = self .__get_pre_release_version_max_build (pre_release_version .id , build_expired_status )
144142 if not max_build :
145143 continue
146- candidate = _LatestBuildInfo (
144+ return _LatestBuildInfo (
147145 build_id = max_build .id ,
148146 build_number = max_build .version ,
149147 pre_release_version = pre_release_version .version ,
150148 )
151- if not all_versions :
152- return candidate
153- candidates .append (candidate )
154- if not candidates :
155- return None
156- return max (candidates , key = lambda info : versions .sorting_key (info .build_number ))
149+ return None
157150
158151 def __get_app_store_latest_build_info (
159152 self ,
160153 app_store_versions : List [_ResourceVersion ],
161- all_versions : bool = False ,
162154 ) -> Optional [_LatestBuildInfo ]:
163- candidates : List [_LatestBuildInfo ] = []
164155 for app_store_version in app_store_versions :
165156 max_build_data = self .api_client .app_store_versions .read_build_data (
166157 ResourceId (app_store_version .id ),
167158 fields = ("version" ,),
168159 )
169160 if not max_build_data :
170161 continue
171- candidate = _LatestBuildInfo (
162+ return _LatestBuildInfo (
172163 build_id = ResourceId (max_build_data ["id" ]),
173164 build_number = max_build_data ["attributes" ]["version" ],
174165 app_store_version = app_store_version .version ,
175166 )
176- if not all_versions :
177- return candidate
178- candidates .append (candidate )
167+ return None
168+
169+ def __get_app_store_latest_build_info_all_versions (
170+ self ,
171+ application_id : ResourceId ,
172+ platform : Optional [Platform ],
173+ ) -> Optional [_LatestBuildInfo ]:
174+ versions_filter = self .api_client .app_store_versions .Filter (platform = platform )
175+ result = self .api_client .apps .list_app_store_versions_data_with_include (
176+ application_id ,
177+ include = "build" ,
178+ resource_filter = versions_filter ,
179+ extra_params = {
180+ "fields[appStoreVersions]" : "versionString,build" ,
181+ "fields[builds]" : "version" ,
182+ },
183+ page_size = 200 ,
184+ )
185+ builds_by_id = {b ["id" ]: b for b in result .included }
186+ candidates : List [_LatestBuildInfo ] = []
187+ for asv in result .data :
188+ build_ref = asv .get ("relationships" , {}).get ("build" , {}).get ("data" )
189+ if not build_ref :
190+ continue
191+ build = builds_by_id .get (build_ref ["id" ])
192+ if not build :
193+ continue
194+ candidates .append (
195+ _LatestBuildInfo (
196+ build_id = ResourceId (build ["id" ]),
197+ build_number = build ["attributes" ]["version" ],
198+ app_store_version = asv ["attributes" ]["versionString" ],
199+ ),
200+ )
201+ if not candidates :
202+ return None
203+ return max (candidates , key = lambda info : versions .sorting_key (info .build_number ))
204+
205+ def __get_testflight_latest_build_info_all_versions (
206+ self ,
207+ application_id : ResourceId ,
208+ platform : Optional [Platform ],
209+ build_expired_status : Optional [bool ],
210+ ) -> Optional [_LatestBuildInfo ]:
211+ builds_filter = self .api_client .builds .Filter (
212+ app = application_id ,
213+ expired = build_expired_status ,
214+ pre_release_version_platform = platform ,
215+ )
216+ result = self .api_client .builds .list_data_with_include (
217+ include = "preReleaseVersion" ,
218+ resource_filter = builds_filter ,
219+ extra_params = {
220+ "fields[builds]" : "version,preReleaseVersion" ,
221+ "fields[preReleaseVersions]" : "version" ,
222+ },
223+ page_size = 200 ,
224+ )
225+ prvs_by_id = {p ["id" ]: p for p in result .included }
226+ candidates : List [_LatestBuildInfo ] = []
227+ for build in result .data :
228+ prv_ref = build .get ("relationships" , {}).get ("preReleaseVersion" , {}).get ("data" )
229+ if not prv_ref :
230+ continue
231+ prv = prvs_by_id .get (prv_ref ["id" ])
232+ if not prv :
233+ continue
234+ candidates .append (
235+ _LatestBuildInfo (
236+ build_id = ResourceId (build ["id" ]),
237+ build_number = build ["attributes" ]["version" ],
238+ pre_release_version = prv ["attributes" ]["version" ],
239+ ),
240+ )
179241 if not candidates :
180242 return None
181243 return max (candidates , key = lambda info : versions .sorting_key (info .build_number ))
@@ -189,16 +251,18 @@ def _get_testflight_latest_build_info(
189251 all_versions : bool = False ,
190252 ) -> Optional [_LatestBuildInfo ]:
191253 try :
254+ if all_versions :
255+ return self .__get_testflight_latest_build_info_all_versions (
256+ application_id ,
257+ platform ,
258+ build_expired_status ,
259+ )
192260 pre_release_version_numbers = self .__get_ordered_pre_release_version_numbers (
193261 application_id ,
194262 pre_release_version ,
195263 platform ,
196264 )
197- return self .__get_testflight_latest_build_info (
198- pre_release_version_numbers ,
199- build_expired_status ,
200- all_versions = all_versions ,
201- )
265+ return self .__get_testflight_latest_build_info (pre_release_version_numbers , build_expired_status )
202266 except AppStoreConnectApiError as api_error :
203267 raise AppStoreConnectError (str (api_error ))
204268
@@ -210,15 +274,14 @@ def _get_app_store_latest_build_info(
210274 all_versions : bool = False ,
211275 ) -> Optional [_LatestBuildInfo ]:
212276 try :
277+ if all_versions :
278+ return self .__get_app_store_latest_build_info_all_versions (application_id , platform )
213279 app_store_version_numbers = self .__get_ordered_app_store_version_numbers (
214280 application_id ,
215281 version_string ,
216282 platform ,
217283 )
218- return self .__get_app_store_latest_build_info (
219- app_store_version_numbers ,
220- all_versions = all_versions ,
221- )
284+ return self .__get_app_store_latest_build_info (app_store_version_numbers )
222285 except AppStoreConnectApiError as api_error :
223286 raise AppStoreConnectError (str (api_error ))
224287
0 commit comments