Skip to content

Commit f2b5e09

Browse files
authored
Merge pull request #51 from nexB/invalid_reqs
Ignore invalid requirement files
2 parents d765d89 + 3361022 commit f2b5e09

File tree

6 files changed

+57
-7
lines changed

6 files changed

+57
-7
lines changed

src/python_inspector/resolve_cli.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
#
1111

1212
import json
13+
import os
1314
from typing import List
1415

1516
import click
1617
from packaging.requirements import Requirement
1718
from tinynetrc import Netrc
1819

1920
from _packagedcode.models import DependentPackage
21+
from _packagedcode.pypi import PipRequirementsFileHandler
2022
from _packagedcode.pypi import can_process_dependent_package
2123
from python_inspector import dependencies
2224
from python_inspector import utils
@@ -183,15 +185,45 @@ def resolve_dependencies(
183185
if verbose:
184186
click.secho(f"Resolving dependencies...")
185187

186-
netrc = None
187188
if netrc_file:
189+
if not os.path.exists(netrc_file):
190+
raise Exception(f"Missing netrc file {netrc_file}")
191+
192+
if not netrc_file:
193+
netrc_file = os.path.join(os.path.expanduser("~"), ".netrc")
194+
if not os.path.exists(netrc_file):
195+
netrc_file = os.path.join(os.path.expanduser("~"), "_netrc")
196+
if not os.path.exists(netrc_file):
197+
netrc_file = None
198+
199+
if netrc_file:
200+
if verbose:
201+
click.secho(f"Using netrc file {netrc_file}")
188202
netrc = Netrc(file=netrc_file)
203+
else:
204+
netrc = None
205+
189206
# TODO: deduplicate me
190207
direct_dependencies = []
191208

192209
if PYPI_SIMPLE_URL not in index_urls:
193210
index_urls = tuple([PYPI_SIMPLE_URL]) + tuple(index_urls)
194211

212+
invalid_requirement_files = []
213+
214+
for req_file in requirement_files:
215+
if not PipRequirementsFileHandler.is_datafile(location=req_file):
216+
invalid_requirement_files.append(req_file)
217+
218+
if invalid_requirement_files:
219+
invalid_requirement_files = "\n".join(invalid_requirement_files)
220+
click.secho(
221+
"The following requirement files are not valid pip "
222+
f"requirement file names: \n{invalid_requirement_files}",
223+
err=True,
224+
)
225+
ctx.exit(1)
226+
195227
for req_file in requirement_files:
196228
deps = dependencies.get_dependencies_from_requirements(requirements_file=req_file)
197229
for extra_data in dependencies.get_extra_data_from_requirements(requirements_file=req_file):

tests/data/frozen-requirements-pdt-expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@
336336
{
337337
"key": "pip",
338338
"package_name": "pip",
339-
"installed_version": "22.2.1",
339+
"installed_version": "22.2.2",
340340
"dependencies": []
341341
}
342342
]
File renamed without changes.

tests/data/single-url-except-simple-expected.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"sdist_url": "https://files.pythonhosted.org/packages/59/87/84326af34517fca8c58418d148f2403df25303e02736832403587318e9e8/click-8.1.3.tar.gz"
3838
},
3939
{
40-
"package": "pkg:pypi/flask@2.1.3",
40+
"package": "pkg:pypi/flask@2.2.1",
4141
"dependencies": [
4242
"pkg:pypi/click@8.1.3",
4343
"pkg:pypi/importlib-metadata@4.12.0",
@@ -46,9 +46,9 @@
4646
"pkg:pypi/werkzeug@2.2.1"
4747
],
4848
"wheel_urls": [
49-
"https://files.pythonhosted.org/packages/af/6a/00d144ac1626fbb44c4ff36519712e258128985a5d0ae43344778ae5cbb9/Flask-2.1.3-py3-none-any.whl"
49+
"https://files.pythonhosted.org/packages/3c/96/6c896f80f466b7f5e2cfd6d632fe5b0464dcb412757c595a663e59589a93/Flask-2.2.1-py3-none-any.whl"
5050
],
51-
"sdist_url": "https://files.pythonhosted.org/packages/5b/77/3accd62b8771954e9584beb03f080385b32ddcad30009d2a4fe4068a05d9/Flask-2.1.3.tar.gz"
51+
"sdist_url": "https://files.pythonhosted.org/packages/4b/4f/50888944490f2263bd70171e8298c9626675fd3dfd750694a7beaa3484fb/Flask-2.2.1.tar.gz"
5252
},
5353
{
5454
"package": "pkg:pypi/importlib-metadata@4.12.0",

tests/test_cli.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def test_cli_with_default_urls():
4444

4545
@pytest.mark.online
4646
def test_pdt_output():
47-
requirements_file = test_env.get_test_loc("pdt.txt")
47+
requirements_file = test_env.get_test_loc("pdt-requirements.txt")
4848
expected_file = test_env.get_test_loc("pdt-expected.json", must_exist=False)
4949
extra_options = []
5050
check_requirements_resolution(
@@ -212,6 +212,24 @@ def test_passing_of_json_pdt_and_json_flags():
212212
run_cli(options=options, expected_rc=1)
213213

214214

215+
def test_passing_of_netrc_file_that_does_not_exist():
216+
options = ["--specifier", "foo", "--netrc", "bar.txt", "--json", "-"]
217+
run_cli(options=options, expected_rc=2)
218+
219+
220+
def test_passing_of_wrong_requiremts_file():
221+
test_file = test_env.get_temp_file(file_name="pdt.txt", extension="")
222+
with open(test_file, "w") as f:
223+
f.write("")
224+
test_file_2 = test_env.get_temp_file(file_name="setup.py", extension="")
225+
with open(test_file_2, "w") as f:
226+
f.write("")
227+
options = ["--requirement", test_file, "--json", "-", "--requirement", test_file_2]
228+
result = run_cli(options=options, expected_rc=1)
229+
assert "pdt.txt" in result.output
230+
assert "setup.py" in result.output
231+
232+
215233
def test_passing_of_no_json_output_flag():
216234
options = ["--specifier", "foo"]
217235
run_cli(options=options, expected_rc=1)

tests/test_resolution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def test_without_supported_wheels():
145145
"pkg:pypi/hyperlink@21.0.0",
146146
"pkg:pypi/idna@3.3",
147147
"pkg:pypi/pycparser@2.21",
148-
"pkg:pypi/setuptools@63.3.0",
148+
"pkg:pypi/setuptools@63.4.1",
149149
"pkg:pypi/txaio@22.2.1",
150150
]
151151

0 commit comments

Comments
 (0)