@@ -202,8 +202,12 @@ def _create_whl_repos(
202202        logger  =  logger ,
203203    )
204204
205-     for  whl_name , requirements  in  requirements_by_platform .items ():
206-         group_name  =  whl_group_mapping .get (whl_name )
205+     exposed_packages  =  {}
206+     for  whl  in  requirements_by_platform :
207+         if  whl .is_exposed :
208+             exposed_packages [whl .name ] =  None 
209+ 
210+         group_name  =  whl_group_mapping .get (whl .name )
207211        group_deps  =  requirement_cycles .get (group_name , [])
208212
209213        # Construct args separately so that the lock file can be smaller and does not include unused 
@@ -214,7 +218,7 @@ def _create_whl_repos(
214218        maybe_args  =  dict (
215219            # The following values are safe to omit if they have false like values 
216220            add_libdir_to_library_search_path  =  pip_attr .add_libdir_to_library_search_path ,
217-             annotation  =  whl_modifications .get (whl_name ),
221+             annotation  =  whl_modifications .get (whl . name ),
218222            download_only  =  pip_attr .download_only ,
219223            enable_implicit_namespace_pkgs  =  pip_attr .enable_implicit_namespace_pkgs ,
220224            environment  =  pip_attr .environment ,
@@ -226,7 +230,7 @@ def _create_whl_repos(
226230            python_interpreter_target  =  python_interpreter_target ,
227231            whl_patches  =  {
228232                p : json .encode (args )
229-                 for  p , args  in  whl_overrides .get (whl_name , {}).items ()
233+                 for  p , args  in  whl_overrides .get (whl . name , {}).items ()
230234            },
231235        )
232236        if  not  enable_pipstar :
@@ -245,119 +249,99 @@ def _create_whl_repos(
245249            if  v  !=  default 
246250        })
247251
248-         for  requirement  in  requirements :
249-             for   repo_name , ( args ,  config_setting )  in   _whl_repos (
250-                 requirement  =  requirement ,
252+         for  src  in  whl . srcs :
253+             repo   =   _whl_repo (
254+                 src  =  src ,
251255                whl_library_args  =  whl_library_args ,
252256                download_only  =  pip_attr .download_only ,
253257                netrc  =  pip_attr .netrc ,
254258                auth_patterns  =  pip_attr .auth_patterns ,
255259                python_version  =  major_minor ,
256-                 multiple_requirements_for_whl  =  len ( requirements )  >   1. ,
260+                 is_multiple_versions  =  whl . is_multiple_versions ,
257261                enable_pipstar  =  enable_pipstar ,
258-             ).items ():
259-                 repo_name  =  "{}_{}" .format (pip_name , repo_name )
260-                 if  repo_name  in  whl_libraries :
261-                     fail ("Attempting to creating a duplicate library {} for {}" .format (
262-                         repo_name ,
263-                         whl_name ,
264-                     ))
262+             )
265263
266-                 whl_libraries [repo_name ] =  args 
267-                 whl_map .setdefault (whl_name , {})[config_setting ] =  repo_name 
264+             repo_name  =  "{}_{}" .format (pip_name , repo .repo_name )
265+             if  repo_name  in  whl_libraries :
266+                 fail ("Attempting to creating a duplicate library {} for {}" .format (
267+                     repo_name ,
268+                     whl .name ,
269+                 ))
270+ 
271+             whl_libraries [repo_name ] =  repo .args 
272+             whl_map .setdefault (whl .name , {})[repo .config_setting ] =  repo_name 
268273
269274    return  struct (
270275        whl_map  =  whl_map ,
271-         exposed_packages  =  {
272-             whl_name : None 
273-             for  whl_name , requirements  in  requirements_by_platform .items ()
274-             if  len ([r  for  r  in  requirements  if  r .is_exposed ]) >  0 
275-         },
276+         exposed_packages  =  exposed_packages ,
276277        extra_aliases  =  extra_aliases ,
277278        whl_libraries  =  whl_libraries ,
278279    )
279280
280- def  _whl_repos (* , requirement , whl_library_args , download_only , netrc , auth_patterns , multiple_requirements_for_whl  =  False , python_version , enable_pipstar  =  False ):
281-     ret  =  {}
282- 
283-     dists  =  requirement .whls 
284-     if  not  download_only  and  requirement .sdist :
285-         dists  =  dists  +  [requirement .sdist ]
286- 
287-     for  distribution  in  dists :
288-         args  =  dict (whl_library_args )
289-         if  netrc :
290-             args ["netrc" ] =  netrc 
291-         if  auth_patterns :
292-             args ["auth_patterns" ] =  auth_patterns 
293- 
294-         if  not  distribution .filename .endswith (".whl" ):
295-             # pip is not used to download wheels and the python 
296-             # `whl_library` helpers are only extracting things, however 
297-             # for sdists, they will be built by `pip`, so we still 
298-             # need to pass the extra args there. 
299-             args ["extra_pip_args" ] =  requirement .extra_pip_args 
300- 
301-         # This is no-op because pip is not used to download the wheel. 
302-         args .pop ("download_only" , None )
303- 
304-         args ["requirement" ] =  requirement .line 
305-         args ["urls" ] =  [distribution .url ]
306-         args ["sha256" ] =  distribution .sha256 
307-         args ["filename" ] =  distribution .filename 
308-         if  not  enable_pipstar :
309-             args ["experimental_target_platforms" ] =  [
310-                 # Get rid of the version fot the target platforms because we are 
311-                 # passing the interpreter any way. Ideally we should search of ways 
312-                 # how to pass the target platforms through the hub repo. 
313-                 p .partition ("_" )[2 ]
314-                 for  p  in  requirement .target_platforms 
315-             ]
316- 
317-         # Pure python wheels or sdists may need to have a platform here 
318-         target_platforms  =  None 
319-         if  distribution .filename .endswith (".whl" ) and  not  distribution .filename .endswith ("-any.whl" ):
320-             pass 
321-         elif  multiple_requirements_for_whl :
322-             target_platforms  =  requirement .target_platforms 
323- 
324-         repo_name  =  whl_repo_name (
325-             distribution .filename ,
326-             distribution .sha256 ,
327-         )
328-         ret [repo_name ] =  (
329-             args ,
330-             whl_config_setting (
281+ def  _whl_repo (* , src , whl_library_args , is_multiple_versions , download_only , netrc , auth_patterns , python_version , enable_pipstar  =  False ):
282+     args  =  dict (whl_library_args )
283+     args ["requirement" ] =  src .requirement_line 
284+     is_whl  =  src .filename .endswith (".whl" )
285+ 
286+     if  src .extra_pip_args  and  not  is_whl :
287+         # pip is not used to download wheels and the python 
288+         # `whl_library` helpers are only extracting things, however 
289+         # for sdists, they will be built by `pip`, so we still 
290+         # need to pass the extra args there, so only pop this for whls 
291+         args ["extra_pip_args" ] =  src .extra_pip_args 
292+ 
293+     if  not  src .url  or  (not  is_whl  and  download_only ):
294+         # Fallback to a pip-installed wheel 
295+         target_platforms  =  src .target_platforms  if  is_multiple_versions  else  []
296+         return  struct (
297+             repo_name  =  pypi_repo_name (
298+                 normalize_name (src .distribution ),
299+                 * target_platforms 
300+             ),
301+             args  =  args ,
302+             config_setting  =  whl_config_setting (
331303                version  =  python_version ,
332-                 filename  =  distribution .filename ,
333-                 target_platforms  =  target_platforms ,
304+                 target_platforms  =  target_platforms  or  None ,
334305            ),
335306        )
336307
337-     if  ret :
338-         return  ret 
339- 
340-     # Fallback to a pip-installed wheel 
341-     args  =  dict (whl_library_args )  # make a copy 
342-     args ["requirement" ] =  requirement .line 
343-     if  requirement .extra_pip_args :
344-         args ["extra_pip_args" ] =  requirement .extra_pip_args 
308+     # This is no-op because pip is not used to download the wheel. 
309+     args .pop ("download_only" , None )
310+ 
311+     if  netrc :
312+         args ["netrc" ] =  netrc 
313+     if  auth_patterns :
314+         args ["auth_patterns" ] =  auth_patterns 
315+ 
316+     args ["urls" ] =  [src .url ]
317+     args ["sha256" ] =  src .sha256 
318+     args ["filename" ] =  src .filename 
319+     if  not  enable_pipstar :
320+         args ["experimental_target_platforms" ] =  [
321+             # Get rid of the version fot the target platforms because we are 
322+             # passing the interpreter any way. Ideally we should search of ways 
323+             # how to pass the target platforms through the hub repo. 
324+             p .partition ("_" )[2 ]
325+             for  p  in  src .target_platforms 
326+         ]
327+ 
328+     # Pure python wheels or sdists may need to have a platform here 
329+     target_platforms  =  None 
330+     if  is_whl  and  not  src .filename .endswith ("-any.whl" ):
331+         pass 
332+     elif  is_multiple_versions :
333+         target_platforms  =  src .target_platforms 
345334
346-     target_platforms  =  requirement .target_platforms  if  multiple_requirements_for_whl  else  []
347-     repo_name  =  pypi_repo_name (
348-         normalize_name (requirement .distribution ),
349-         * target_platforms 
350-     )
351-     ret [repo_name ] =  (
352-         args ,
353-         whl_config_setting (
335+     return  struct (
336+         repo_name  =  whl_repo_name (src .filename , src .sha256 ),
337+         args  =  args ,
338+         config_setting  =  whl_config_setting (
354339            version  =  python_version ,
355-             target_platforms  =  target_platforms  or  None ,
340+             filename  =  src .filename ,
341+             target_platforms  =  target_platforms ,
356342        ),
357343    )
358344
359-     return  ret 
360- 
361345def  parse_modules (
362346        module_ctx ,
363347        _fail  =  fail ,
0 commit comments