diff --git a/piptools/scripts/compile.py b/piptools/scripts/compile.py index 5b14bc43..d1622259 100755 --- a/piptools/scripts/compile.py +++ b/piptools/scripts/compile.py @@ -205,6 +205,10 @@ def cli( ).format(", ".join(DEFAULT_REQUIREMENTS_FILES)) ) + if all_extras and extras: + msg = "--extra has no effect when used with --all-extras" + raise click.BadParameter(msg) + if not output_file: # An output file must be provided for stdin if src_files == ("-",): @@ -372,10 +376,7 @@ def cli( if not only_build_deps: constraints.extend(metadata.requirements) if all_extras: - if extras: - msg = "--extra has no effect when used with --all-extras" - raise click.BadParameter(msg) - extras = metadata.extras + extras += metadata.extras if build_deps_targets: constraints.extend(metadata.build_requirements) else: diff --git a/tests/test_cli_compile.py b/tests/test_cli_compile.py index c65d1ed8..eba8cb05 100644 --- a/tests/test_cli_compile.py +++ b/tests/test_cli_compile.py @@ -3002,6 +3002,40 @@ def test_cli_compile_strip_extras(runner, make_package, make_sdist, tmpdir): assert "[more]" not in out.stderr +def test_cli_compile_all_extras_with_multiple_packages( + runner, make_package, make_sdist, tmpdir +): + """ + Assures that ``--all-extras`` works when multiple sources are specified. + """ + test_package_1 = make_package( + "test_package_1", + version="0.1", + extras_require={"more": []}, + ) + test_package_2 = make_package( + "test_package_2", + version="0.1", + extras_require={"more": []}, + ) + + out = runner.invoke( + cli, + [ + "--all-extras", + "--output-file", + "requirements.txt", + str(test_package_1 / "setup.py"), + str(test_package_2 / "setup.py"), + ], + ) + + assert out.exit_code == 0, out + assert "--all-extras" in out.stderr + assert f"test_package_1{os.path.sep}0.1{os.path.sep}setup.py" in out.stderr + assert f"test_package_2{os.path.sep}0.1{os.path.sep}setup.py" in out.stderr + + @pytest.mark.parametrize( ("package_specs", "constraints", "existing_reqs", "expected_reqs"), (