27
27
from _packagedcode .pypi import PythonSetupPyHandler
28
28
from _packagedcode .pypi import can_process_dependent_package
29
29
from python_inspector import dependencies
30
- from python_inspector import settings
30
+ from python_inspector import pyinspector_settings as settings
31
31
from python_inspector import utils
32
32
from python_inspector import utils_pypi
33
33
from python_inspector .package_data import get_pypi_data_from_purl
@@ -64,8 +64,7 @@ def to_dict(self, generic_paths=False):
64
64
# clean file paths
65
65
for file in files :
66
66
path = file ["path" ]
67
- file ["path" ] = utils .remove_test_data_dir_variable_prefix (
68
- path = path )
67
+ file ["path" ] = utils .remove_test_data_dir_variable_prefix (path = path )
69
68
return {
70
69
"files" : files ,
71
70
"packages" : [package for package in self .packages ],
@@ -102,19 +101,19 @@ def resolve_dependencies(
102
101
linux OS.
103
102
104
103
Download from the provided PyPI simple index_urls INDEX(s) URLs defaulting
105
- to PyPI.org
104
+ to PyPI.org or a configured setting.
106
105
"""
107
106
108
107
if not operating_system :
109
- raise Exception ("No operating system provided." )
108
+ raise Exception (f "No operating system provided." )
110
109
if operating_system not in PLATFORMS_BY_OS :
111
110
raise ValueError (
112
111
f"Invalid operating system: { operating_system } . "
113
112
f"Must be one of: { ', ' .join (PLATFORMS_BY_OS .keys ())} "
114
113
)
115
114
116
115
if not python_version :
117
- raise Exception ("No python version provided." )
116
+ raise Exception (f "No python version provided." )
118
117
if python_version not in valid_python_versions :
119
118
raise ValueError (
120
119
f"Invalid python version: { python_version } . "
@@ -149,22 +148,16 @@ def resolve_dependencies(
149
148
150
149
# requirements
151
150
for req_file in requirement_files :
152
- deps = dependencies .get_dependencies_from_requirements (
153
- requirements_file = req_file )
154
- for extra_data in dependencies .get_extra_data_from_requirements (
155
- requirements_file = req_file
156
- ):
157
- index_urls = (
158
- * index_urls , * tuple (extra_data .get ("extra_index_urls" ) or []))
159
- index_urls = (
160
- * index_urls , * tuple (extra_data .get ("index_url" ) or []))
151
+ deps = dependencies .get_dependencies_from_requirements (requirements_file = req_file )
152
+ for extra_data in dependencies .get_extra_data_from_requirements (requirements_file = req_file ):
153
+ index_urls = (* index_urls , * tuple (extra_data .get ("extra_index_urls" ) or []))
154
+ index_urls = (* index_urls , * tuple (extra_data .get ("index_url" ) or []))
161
155
direct_dependencies .extend (deps )
162
156
package_data = [
163
157
pkg_data .to_dict () for pkg_data in PipRequirementsFileHandler .parse (location = req_file )
164
158
]
165
159
if generic_paths :
166
- req_file = utils .remove_test_data_dir_variable_prefix (
167
- path = req_file )
160
+ req_file = utils .remove_test_data_dir_variable_prefix (path = req_file )
168
161
169
162
files .append (
170
163
dict (
@@ -217,15 +210,13 @@ def resolve_dependencies(
217
210
files = [setup_py_file ],
218
211
analyze_setup_py_insecurely = analyze_setup_py_insecurely ,
219
212
)
220
- setup_py_file_deps = list (
221
- get_dependent_packages_from_reqs (reqs ))
213
+ setup_py_file_deps = list (get_dependent_packages_from_reqs (reqs ))
222
214
direct_dependencies .extend (setup_py_file_deps )
223
215
224
216
package_data .dependencies = setup_py_file_deps
225
217
file_package_data = [package_data .to_dict ()]
226
218
if generic_paths :
227
- setup_py_file = utils .remove_test_data_dir_variable_prefix (
228
- path = setup_py_file )
219
+ setup_py_file = utils .remove_test_data_dir_variable_prefix (path = setup_py_file )
229
220
files .append (
230
221
dict (
231
222
type = "file" ,
@@ -254,29 +245,32 @@ def resolve_dependencies(
254
245
if verbose :
255
246
printer (f"environment: { environment } " )
256
247
257
- repos = []
248
+ repos_by_url = {}
258
249
if not use_pypi_json_api :
259
250
# Collect PyPI repos
251
+ use_only_confed = settings .USE_ONLY_CONFIGURED_INDEX_URLS
260
252
for index_url in index_urls :
261
253
index_url = index_url .strip ("/" )
262
- if index_url in settings .INDEX_URL :
263
- repos .append (PypiSimpleRepository (index_url ))
264
- else :
265
- credentials = None
266
- if parsed_netrc :
267
- login , password = utils .get_netrc_auth (
268
- index_url , parsed_netrc )
269
- credentials = (
270
- dict (login = login ,
271
- password = password ) if login and password else None
272
- )
273
- repo = PypiSimpleRepository (
274
- index_url = index_url ,
275
- use_cached_index = use_cached_index ,
276
- credentials = credentials ,
277
- )
278
- repos .append (repo )
254
+ if use_only_confed and index_url not in settings .INDEX_URL :
255
+ if verbose :
256
+ printer (f"Skipping index URL unknown in settings: { index_url !r} " )
257
+ continue
258
+ if index_url in repos_by_url :
259
+ continue
260
+
261
+ credentials = None
262
+ if parsed_netrc :
263
+ login , password = utils .get_netrc_auth (index_url , parsed_netrc )
264
+ if login and password :
265
+ credentials = dict (login = login , password = password )
266
+ repo = utils_pypi .PypiSimpleRepository (
267
+ index_url = index_url ,
268
+ use_cached_index = use_cached_index ,
269
+ credentials = credentials ,
270
+ )
271
+ repos_by_url [index_url ] = repo
279
272
273
+ repos = repos_by_url .values ()
280
274
if verbose :
281
275
printer ("repos:" )
282
276
for repo in repos :
@@ -363,8 +357,8 @@ def resolve(
363
357
364
358
def get_resolved_dependencies (
365
359
requirements : List [Requirement ],
366
- environment : Environment ,
367
- repos : Sequence [PypiSimpleRepository ] = tuple (),
360
+ environment : Environment = None ,
361
+ repos : Sequence [utils_pypi . PypiSimpleRepository ] = tuple (),
368
362
as_tree : bool = False ,
369
363
max_rounds : int = 200000 ,
370
364
pdt_output : bool = False ,
@@ -379,7 +373,6 @@ def get_resolved_dependencies(
379
373
Used the provided ``repos`` list of PypiSimpleRepository.
380
374
If empty, use instead the PyPI.org JSON API exclusively instead
381
375
"""
382
-
383
376
resolver = Resolver (
384
377
provider = PythonInputProvider (
385
378
environment = environment ,
@@ -389,12 +382,8 @@ def get_resolved_dependencies(
389
382
),
390
383
reporter = BaseReporter (),
391
384
)
392
-
393
- resolver_results = resolver .resolve (
394
- requirements = requirements , max_rounds = max_rounds )
395
-
385
+ resolver_results = resolver .resolve (requirements = requirements , max_rounds = max_rounds )
396
386
package_list = get_package_list (results = resolver_results )
397
-
398
387
if pdt_output :
399
388
return (format_pdt_tree (resolver_results ), package_list )
400
389
return (
0 commit comments