1212import itertools
1313import os
1414import sys
15+ from collections import defaultdict
1516
1617import click
1718
110111 is_flag = True ,
111112 help = "Use on disk cached PyPI indexes list of packages and versions and do not refetch if present." ,
112113)
114+ @click .option (
115+ "--sdist-only" ,
116+ "sdist_only" ,
117+ type = str ,
118+ metavar = "SDIST" ,
119+ default = tuple (),
120+ show_default = False ,
121+ multiple = True ,
122+ help = "Package name(s) that come only in sdist format (no wheels). "
123+ "The command will not fail and exit if no wheel exists for these names" ,
124+ )
125+ @click .option (
126+ "--wheel-only" ,
127+ "wheel_only" ,
128+ type = str ,
129+ metavar = "WHEEL" ,
130+ default = tuple (),
131+ show_default = False ,
132+ multiple = True ,
133+ help = "Package name(s) that come only in wheel format (no sdist). "
134+ "The command will not fail and exit if no sdist exists for these names" ,
135+ )
136+ @click .option (
137+ "--no-dist" ,
138+ "no_dist" ,
139+ type = str ,
140+ metavar = "DIST" ,
141+ default = tuple (),
142+ show_default = False ,
143+ multiple = True ,
144+ help = "Package name(s) that do not come either in wheel or sdist format. "
145+ "The command will not fail and exit if no distribution exists for these names" ,
146+ )
113147@click .help_option ("-h" , "--help" )
114148def fetch_thirdparty (
115149 requirements_files ,
@@ -122,6 +156,9 @@ def fetch_thirdparty(
122156 sdists ,
123157 index_urls ,
124158 use_cached_index ,
159+ sdist_only ,
160+ wheel_only ,
161+ no_dist ,
125162):
126163 """
127164 Download to --dest THIRDPARTY_DIR the PyPI wheels, source distributions,
@@ -204,58 +241,62 @@ def fetch_thirdparty(
204241 )
205242 repos .append (repo )
206243
207- wheels_fetched = []
208- wheels_not_found = []
209-
210- sdists_fetched = []
211- sdists_not_found = []
244+ wheels_or_sdist_not_found = defaultdict (list )
212245
213246 for name , version in sorted (required_name_versions ):
214247 nv = name , version
215248 print (f"Processing: { name } @ { version } " )
216249 if wheels :
217250 for environment in environments :
251+
218252 if TRACE :
219253 print (f" ==> Fetching wheel for envt: { environment } " )
220- fwfns = utils_thirdparty .download_wheel (
254+
255+ fetched = utils_thirdparty .download_wheel (
221256 name = name ,
222257 version = version ,
223258 environment = environment ,
224259 dest_dir = dest_dir ,
225260 repos = repos ,
226261 )
227- if fwfns :
228- wheels_fetched .extend (fwfns )
229- else :
230- wheels_not_found .append (f"{ name } =={ version } for: { environment } " )
262+ if not fetched :
263+ wheels_or_sdist_not_found [f"{ name } =={ version } " ].append (environment )
231264 if TRACE :
232265 print (f" NOT FOUND" )
233266
234- if sdists :
267+ if (sdists or
268+ (f"{ name } =={ version } " in wheels_or_sdist_not_found and name in sdist_only )
269+ ):
235270 if TRACE :
236271 print (f" ==> Fetching sdist: { name } =={ version } " )
272+
237273 fetched = utils_thirdparty .download_sdist (
238274 name = name ,
239275 version = version ,
240276 dest_dir = dest_dir ,
241277 repos = repos ,
242278 )
243- if fetched :
244- sdists_fetched .append (fetched )
245- else :
246- sdists_not_found .append (f"{ name } =={ version } " )
279+ if not fetched :
280+ wheels_or_sdist_not_found [f"{ name } =={ version } " ].append ("sdist" )
247281 if TRACE :
248282 print (f" NOT FOUND" )
249283
250- if wheels and wheels_not_found :
251- print (f"==> MISSING WHEELS" )
252- for wh in wheels_not_found :
253- print (f" { wh } " )
284+ mia = []
285+ for nv , dists in wheels_or_sdist_not_found .items ():
286+ name , _ , version = nv .partition ("==" )
287+ if name in no_dist :
288+ continue
289+ sdist_missing = sdists and "sdist" in dists and not name in wheel_only
290+ if sdist_missing :
291+ mia .append (f"SDist missing: { nv } { dists } " )
292+ wheels_missing = wheels and any (d for d in dists if d != "sdist" ) and not name in sdist_only
293+ if wheels_missing :
294+ mia .append (f"Wheels missing: { nv } { dists } " )
254295
255- if sdists and sdists_not_found :
256- print ( f"==> MISSING SDISTS" )
257- for sd in sdists_not_found :
258- print ( f" { sd } " )
296+ if mia :
297+ for m in mia :
298+ print ( m )
299+ raise Exception ( mia )
259300
260301 print (f"==> FETCHING OR CREATING ABOUT AND LICENSE FILES" )
261302 utils_thirdparty .fetch_abouts_and_licenses (dest_dir = dest_dir , use_cached_index = use_cached_index )
0 commit comments