From 98c8060f0a89453655afa71fd8dad2b707da1a5c Mon Sep 17 00:00:00 2001 From: Zhuyi Xue Date: Sat, 16 Oct 2021 10:33:09 -0700 Subject: [PATCH 1/3] re-resolve dependencies of combined install_requirement --- piptools/resolver.py | 3 ++ tests/test_cli_compile.py | 64 +++++++++++++++++++++++++++++++++++++++ tests/test_resolver.py | 10 ++++++ 3 files changed, 77 insertions(+) diff --git a/piptools/resolver.py b/piptools/resolver.py index c759b0ab0..91358a547 100644 --- a/piptools/resolver.py +++ b/piptools/resolver.py @@ -72,6 +72,9 @@ def combine_install_requirements( # deepcopy the accumulator so as to not modify the inputs combined_ireq = copy.deepcopy(source_ireqs[0]) + # combined install_requirement needs to be prepared again, i.e. to have its + # dependencies be resolved again. + combined_ireq.prepared = False for ireq in source_ireqs[1:]: # NOTE we may be losing some info on dropped reqs here diff --git a/tests/test_cli_compile.py b/tests/test_cli_compile.py index a56aefafc..096cc0e70 100644 --- a/tests/test_cli_compile.py +++ b/tests/test_cli_compile.py @@ -1759,6 +1759,70 @@ def test_combine_extras(pip_conf, runner, make_package): assert "small-fake-b==" in out.stderr +def test_combine_different_extras_of_the_same_package( + pip_conf, runner, tmpdir, make_package, make_wheel +): + """ + Loosely based on the example from https://github.com/jazzband/pip-tools/issues/1511. + """ + pkgs = [ + make_package( + "fake-colorful", + version="0.3", + ), + make_package( + "fake-tensorboardX", + version="0.5", + ), + make_package( + "fake-ray", + version="0.1", + extras_require={ + "default": ["fake-colorful==0.3"], + "tune": ["fake-tensorboardX==0.5"], + }, + ), + make_package( + "fake-tune-sklearn", + version="0.7", + install_requires=[ + "fake-ray[tune]==0.1", + ], + ), + ] + + dists_dir = tmpdir / "dists" + for pkg in pkgs: + make_wheel(pkg, dists_dir) + + with open("requirements.in", "w") as req_in: + req_in.writelines( + [ + f"fake-ray[default]==0.1\n", + "fake-tune-sklearn==0.7\n", + ] + ) + + out = runner.invoke(cli, ["--find-links", str(dists_dir)]) + + assert out.exit_code == 0 + assert ( + """\ +fake-colorful==0.3 + # via fake-ray +fake-ray[default,tune]==0.1 + # via + # -r requirements.in + # fake-tune-sklearn +fake-tensorboardx==0.5 + # via fake-ray +fake-tune-sklearn==0.7 + # via -r requirements.in +""" + in out.stderr + ) + + @pytest.mark.parametrize( ("pkg2_install_requires", "req_in_content", "out_expected_content"), ( diff --git a/tests/test_resolver.py b/tests/test_resolver.py index bf28ed6e4..da75299f2 100644 --- a/tests/test_resolver.py +++ b/tests/test_resolver.py @@ -341,6 +341,16 @@ def test_combine_install_requirements_extras_no_req( ) +def test_combine_install_requirements_with_multiple_extras_reset_prepared(repository, from_line): + """Regression test for https://github.com/jazzband/pip-tools/pull/1512/files.""" + pkg1 = from_line("ray[default]==1.1.1") + pkg1.prepared = True + pkg2 = from_line("ray[tune]==1.1.1") + combined = combine_install_requirements(repository, [pkg1, pkg2]) + + assert str(combined) == 'ray[default,tune]==1.1.1' + assert combined.prepared is False + def test_compile_failure_shows_provenance(resolver, from_line): """ Provenance of conflicting dependencies should be printed on failure. From 2f8abf56881cff696be080a3db942323329b2763 Mon Sep 17 00:00:00 2001 From: Zhuyi Xue Date: Sat, 16 Oct 2021 17:18:02 -0700 Subject: [PATCH 2/3] reformatting --- tests/test_cli_compile.py | 2 +- tests/test_resolver.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_cli_compile.py b/tests/test_cli_compile.py index 096cc0e70..bfd483e25 100644 --- a/tests/test_cli_compile.py +++ b/tests/test_cli_compile.py @@ -1798,7 +1798,7 @@ def test_combine_different_extras_of_the_same_package( with open("requirements.in", "w") as req_in: req_in.writelines( [ - f"fake-ray[default]==0.1\n", + "fake-ray[default]==0.1\n", "fake-tune-sklearn==0.7\n", ] ) diff --git a/tests/test_resolver.py b/tests/test_resolver.py index da75299f2..1db5e74bb 100644 --- a/tests/test_resolver.py +++ b/tests/test_resolver.py @@ -341,16 +341,19 @@ def test_combine_install_requirements_extras_no_req( ) -def test_combine_install_requirements_with_multiple_extras_reset_prepared(repository, from_line): +def test_combine_install_requirements_with_multiple_extras_reset_prepared( + repository, from_line +): """Regression test for https://github.com/jazzband/pip-tools/pull/1512/files.""" pkg1 = from_line("ray[default]==1.1.1") pkg1.prepared = True pkg2 = from_line("ray[tune]==1.1.1") combined = combine_install_requirements(repository, [pkg1, pkg2]) - assert str(combined) == 'ray[default,tune]==1.1.1' + assert str(combined) == "ray[default,tune]==1.1.1" assert combined.prepared is False + def test_compile_failure_shows_provenance(resolver, from_line): """ Provenance of conflicting dependencies should be printed on failure. From 9266d57014ead886eb359375db12a44f2ff8b1ae Mon Sep 17 00:00:00 2001 From: Zhuyi Xue Date: Sat, 16 Oct 2021 17:19:17 -0700 Subject: [PATCH 3/3] rename test --- tests/test_resolver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_resolver.py b/tests/test_resolver.py index 1db5e74bb..624b9af0d 100644 --- a/tests/test_resolver.py +++ b/tests/test_resolver.py @@ -341,7 +341,7 @@ def test_combine_install_requirements_extras_no_req( ) -def test_combine_install_requirements_with_multiple_extras_reset_prepared( +def test_combine_install_requirements_for_one_package_with_multiple_extras_reset_prepared( repository, from_line ): """Regression test for https://github.com/jazzband/pip-tools/pull/1512/files."""