1515"""This module is for implementing PEP508 compliant METADATA deps parsing. 
1616""" 
1717
18- load ("@pythons_hub//:versions.bzl" , "DEFAULT_PYTHON_VERSION" , "MINOR_MAPPING" )
19- load ("//python/private:full_version.bzl" , "full_version" )
2018load ("//python/private:normalize_name.bzl" , "normalize_name" )
21- load (":pep508_env.bzl" , "env" )
2219load (":pep508_evaluate.bzl" , "evaluate" )
23- load (":pep508_platform.bzl" , "platform" , "platform_from_str" )
2420load (":pep508_requirement.bzl" , "requirement" )
2521
2622def  deps (
2723        name ,
2824        * ,
2925        requires_dist ,
30-         platforms  =  [],
3126        extras  =  [],
3227        excludes  =  [],
33-         default_python_version  =  None ,
34-         minor_mapping  =  MINOR_MAPPING ):
28+         include  =  []):
3529    """Parse the RequiresDist from wheel METADATA 
3630
3731    Args: 
3832        name: {type}`str` the name of the wheel. 
3933        requires_dist: {type}`list[str]` the list of RequiresDist lines from the 
4034            METADATA file. 
4135        excludes: {type}`list[str]` what packages should we exclude. 
36+         include: {type}`list[str]` what packages should we exclude. If it is not 
37+             specified, then we will include all deps from `requires_dist`. 
4238        extras: {type}`list[str]` the requested extras to generate targets for. 
43-         platforms: {type}`list[str]` the list of target platform strings. 
44-         default_python_version: {type}`str` the host python version. 
45-         minor_mapping: {type}`type[str, str]` the minor mapping to use when 
46-             resolving to the full python version as DEFAULT_PYTHON_VERSION can by 
47-             of format `3.x`. 
4839
4940    Returns: 
5041        A struct with attributes: 
@@ -60,39 +51,20 @@ def deps(
6051    deps_select  =  {}
6152    name  =  normalize_name (name )
6253    want_extras  =  _resolve_extras (name , reqs , extras )
54+     include  =  [normalize_name (n ) for  n  in  include ]
6355
6456    # drop self edges 
6557    excludes  =  [name ] +  [normalize_name (x ) for  x  in  excludes ]
6658
67-     default_python_version  =  default_python_version  or  DEFAULT_PYTHON_VERSION 
68-     if  default_python_version :
69-         # if it is not bzlmod, then DEFAULT_PYTHON_VERSION may be unset 
70-         default_python_version  =  full_version (
71-             version  =  default_python_version ,
72-             minor_mapping  =  minor_mapping ,
73-         )
74-     platforms  =  [
75-         platform_from_str (p , python_version  =  default_python_version )
76-         for  p  in  platforms 
77-     ]
78- 
79-     abis  =  sorted ({p .abi : True  for  p  in  platforms  if  p .abi })
80-     if  default_python_version  and  len (abis ) >  1 :
81-         _ , _ , tail  =  default_python_version .partition ("." )
82-         default_abi  =  "cp3"  +  tail 
83-     elif  len (abis ) >  1 :
84-         fail (
85-             "all python versions need to be specified explicitly, got: {}" .format (platforms ),
86-         )
87-     else :
88-         default_abi  =  None 
89- 
9059    reqs_by_name  =  {}
9160
9261    for  req  in  reqs :
9362        if  req .name_  in  excludes :
9463            continue 
9564
65+         if  include  and  req .name_  not  in   include :
66+             continue 
67+ 
9668        reqs_by_name .setdefault (req .name , []).append (req )
9769
9870    for  name , reqs  in  reqs_by_name .items ():
@@ -102,55 +74,25 @@ def deps(
10274            normalize_name (name ),
10375            reqs ,
10476            extras  =  want_extras ,
105-             platforms  =  platforms ,
106-             default_abi  =  default_abi ,
10777        )
10878
10979    return  struct (
11080        deps  =  sorted (deps ),
11181        deps_select  =  {
112-             _platform_str ( p ):  sorted ( deps ) 
113-             for  p ,  deps  in  deps_select .items ()
82+             d :  markers 
83+             for  d ,  markers  in  sorted ( deps_select .items () )
11484        },
11585    )
11686
117- def  _platform_str (self ):
118-     if  self .abi  ==  None :
119-         return  "{}_{}" .format (self .os , self .arch )
120- 
121-     return  "{}_{}_{}" .format (
122-         self .abi ,
123-         self .os  or  "anyos" ,
124-         self .arch  or  "anyarch" ,
125-     )
126- 
127- def  _add (deps , deps_select , dep , platform ):
87+ def  _add (deps , deps_select , dep , markers  =  None ):
12888    dep  =  normalize_name (dep )
12989
130-     if  platform   ==   None :
90+     if  not   markers :
13191        deps [dep ] =  True 
132- 
133-         # If the dep is in the platform-specific list, remove it from the select. 
134-         pop_keys  =  []
135-         for  p , _deps  in  deps_select .items ():
136-             if  dep  not  in   _deps :
137-                 continue 
138- 
139-             _deps .pop (dep )
140-             if  not  _deps :
141-                 pop_keys .append (p )
142- 
143-         for  p  in  pop_keys :
144-             deps_select .pop (p )
145-         return 
146- 
147-     if  dep  in  deps :
148-         # If the dep is already in the main dependency list, no need to add it in the 
149-         # platform-specific dependency list. 
150-         return 
151- 
152-     # Add the platform-specific branch 
153-     deps_select .setdefault (platform , {})[dep ] =  True 
92+     elif  len (markers ) ==  1 :
93+         deps_select [dep ] =  markers [0 ]
94+     else :
95+         deps_select [dep ] =  "({})" .format (") or (" .join (sorted (markers )))
15496
15597def  _resolve_extras (self_name , reqs , extras ):
15698    """Resolve extras which are due to depending on self[some_other_extra]. 
@@ -207,37 +149,24 @@ def _resolve_extras(self_name, reqs, extras):
207149    # Poor mans set 
208150    return  sorted ({x : None  for  x  in  extras })
209151
210- def  _add_reqs (deps , deps_select , dep , reqs , * , extras ,  platforms ,  default_abi   =   None ):
152+ def  _add_reqs (deps , deps_select , dep , reqs , * , extras ):
211153    for  req  in  reqs :
212154        if  not  req .marker :
213-             _add (deps , deps_select , dep ,  None )
155+             _add (deps , deps_select , dep )
214156            return 
215157
216-     platforms_to_add  =  {}
217-     for  plat  in  platforms :
218-         if  plat  in  platforms_to_add :
219-             # marker evaluation is more expensive than this check 
220-             continue 
221- 
222-         added  =  False 
223-         for  extra  in  extras :
224-             if  added :
158+     markers  =  {}
159+     for  req  in  reqs :
160+         for  x  in  extras :
161+             m  =  evaluate (req .marker , env  =  {"extra" : x }, strict  =  False )
162+             if  m  ==  False :
163+                 continue 
164+             elif  m  ==  True :
165+                 _add (deps , deps_select , dep )
225166                break 
167+             else :
168+                 markers [m ] =  None 
169+                 continue 
226170
227-             for  req  in  reqs :
228-                 if  evaluate (req .marker , env  =  env (target_platform  =  plat , extra  =  extra )):
229-                     platforms_to_add [plat ] =  True 
230-                     added  =  True 
231-                     break 
232- 
233-     if  len (platforms_to_add ) ==  len (platforms ):
234-         # the dep is in all target platforms, let's just add it to the regular 
235-         # list 
236-         _add (deps , deps_select , dep , None )
237-         return 
238- 
239-     for  plat  in  platforms_to_add :
240-         if  default_abi :
241-             _add (deps , deps_select , dep , plat )
242-         if  plat .abi  ==  default_abi  or  not  default_abi :
243-             _add (deps , deps_select , dep , platform (os  =  plat .os , arch  =  plat .arch ))
171+     if  markers :
172+         _add (deps , deps_select , dep , sorted (markers ))
0 commit comments