@@ -52,26 +52,29 @@ def __init__(
5252 # Session-level resolution cache to avoid re-resolving same requirements
5353 self ._resolved_requirements : dict [str , tuple [str , Version ]] = {}
5454
55- def resolve_source (
55+ def resolve (
5656 self ,
5757 req : Requirement ,
5858 req_type : RequirementType ,
5959 parent_req : Requirement | None = None ,
60+ pre_built : bool | None = None ,
6061 ) -> tuple [str , Version ]:
61- """Resolve source package (sdist) .
62+ """Resolve package requirement .
6263
6364 Tries resolution strategies in order:
6465 1. Session cache (if previously resolved)
6566 2. Previous dependency graph
66- 3. PyPI source resolution
67+ 3. PyPI resolution ( source or prebuilt based on package build info)
6768
6869 Args:
6970 req: Package requirement (must NOT have URL)
7071 req_type: Type of requirement
7172 parent_req: Parent requirement from dependency chain
73+ pre_built: Optional override to force prebuilt (True) or source (False).
74+ If None (default), uses package build info to determine.
7275
7376 Returns:
74- Tuple of (source_url , resolved_version)
77+ Tuple of (url , resolved_version)
7578
7679 Raises:
7780 ValueError: If req contains a URL (must use Bootstrapper for git URLs)
@@ -87,84 +90,74 @@ def resolve_source(
8790 logger .debug (f"resolved { req } from cache" )
8891 return cached_result
8992
90- # Try graph
91- cached_resolution = self ._resolve_from_graph (
92- req = req ,
93- req_type = req_type ,
94- pre_built = False ,
95- parent_req = parent_req ,
96- )
97- if cached_resolution :
98- source_url , resolved_version = cached_resolution
99- logger .debug (f"resolved from previous bootstrap to { resolved_version } " )
100- else :
101- # Fallback to PyPI
102- source_url , resolved_version = sources .resolve_source (
103- ctx = self .ctx ,
104- req = req ,
105- sdist_server_url = resolver .PYPI_SERVER_URL ,
106- req_type = req_type ,
107- )
93+ # Resolve using strategies
94+ url , resolved_version = self ._resolve (req , req_type , parent_req , pre_built )
10895
10996 # Cache the result
110- result = (source_url , resolved_version )
97+ result = (url , resolved_version )
11198 self .cache_resolution (req , result )
112- return source_url , resolved_version
99+ return url , resolved_version
113100
114- def resolve_prebuilt (
101+ def _resolve (
115102 self ,
116103 req : Requirement ,
117104 req_type : RequirementType ,
118- parent_req : Requirement | None = None ,
105+ parent_req : Requirement | None ,
106+ pre_built : bool | None ,
119107 ) -> tuple [str , Version ]:
120- """Resolve pre-built package (wheels only) .
108+ """Internal resolution logic without caching .
121109
122110 Tries resolution strategies in order:
123- 1. Session cache (if previously resolved)
124- 2. Previous dependency graph
125- 3. PyPI wheel resolution
111+ 1. Previous dependency graph
112+ 2. PyPI resolution (source or prebuilt)
126113
127114 Args:
128115 req: Package requirement
129116 req_type: Type of requirement
130117 parent_req: Parent requirement from dependency chain
118+ pre_built: Optional override to force prebuilt (True) or source (False).
119+ If None, uses package build info to determine.
131120
132121 Returns:
133- Tuple of (source_url, resolved_version)
134-
135- Raises:
136- ValueError: If unable to resolve
122+ Tuple of (url, resolved_version)
137123 """
138- # Check session cache first
139- cached_result = self .get_cached_resolution (req )
140- if cached_result is not None :
141- logger .debug (f"resolved { req } from cache" )
142- return cached_result
124+ # Determine whether to resolve prebuilt or source
125+ if pre_built is None :
126+ pbi = self .ctx .package_build_info (req )
127+ pre_built = pbi .pre_built
143128
144129 # Try graph
145130 cached_resolution = self ._resolve_from_graph (
146131 req = req ,
147132 req_type = req_type ,
148- pre_built = True ,
133+ pre_built = pre_built ,
149134 parent_req = parent_req ,
150135 )
151136
152137 if cached_resolution and not req .url :
153- wheel_url , resolved_version = cached_resolution
138+ url , resolved_version = cached_resolution
154139 logger .debug (f"resolved from previous bootstrap to { resolved_version } " )
155- else :
156- # Fallback to PyPI prebuilt resolution
140+ return url , resolved_version
141+
142+ # Fallback to PyPI
143+ if pre_built :
144+ # Resolve prebuilt wheel
157145 servers = wheels .get_wheel_server_urls (
158146 self .ctx , req , cache_wheel_server_url = resolver .PYPI_SERVER_URL
159147 )
160- wheel_url , resolved_version = wheels .resolve_prebuilt_wheel (
148+ url , resolved_version = wheels .resolve_prebuilt_wheel (
161149 ctx = self .ctx , req = req , wheel_server_urls = servers , req_type = req_type
162150 )
151+ else :
152+ # Resolve source (sdist)
153+ url , resolved_version = sources .resolve_source (
154+ ctx = self .ctx ,
155+ req = req ,
156+ sdist_server_url = resolver .PYPI_SERVER_URL ,
157+ req_type = req_type ,
158+ )
163159
164- # Cache the result
165- result = (wheel_url , resolved_version )
166- self .cache_resolution (req , result )
167- return wheel_url , resolved_version
160+ return url , resolved_version
168161
169162 def get_cached_resolution (
170163 self ,
0 commit comments