diff --git a/pipenv/cli/command.py b/pipenv/cli/command.py index a8872338..57490249 100644 --- a/pipenv/cli/command.py +++ b/pipenv/cli/command.py @@ -740,9 +740,9 @@ def verify(state): ) @option("--hash", is_flag=True, default=False, help="Add package hashes.") @option("--exclude-markers", is_flag=True, default=False, help="Exclude markers.") -@option("--category", is_flag=False, default='', help="Only add requirement of the specified category.") +@option("--categories", is_flag=False, default='', help="Only add requirement of the specified categories.") @pass_state -def requirements(state, dev=False, dev_only=False, hash=False, exclude_markers=False, category=''): +def requirements(state, dev=False, dev_only=False, hash=False, exclude_markers=False, categories=''): from pipenv.utils.dependencies import convert_deps_to_pip @@ -753,9 +753,11 @@ def requirements(state, dev=False, dev_only=False, hash=False, exclude_markers=F echo(" ".join([prefix, package_index["url"]])) deps = {} + categories_list = categories.split(',') if categories else [] - if category: - deps.update(lockfile.get(category, {})) + if categories_list: + for category in categories_list: + deps.update(lockfile.get(category, {})) else: if dev or dev_only: deps.update(lockfile["develop"]) diff --git a/tests/integration/test_requirements.py b/tests/integration/test_requirements.py index fa8ddf6d..31d9a2b0 100644 --- a/tests/integration/test_requirements.py +++ b/tests/integration/test_requirements.py @@ -73,11 +73,13 @@ def test_requirements_generates_requirements_from_lockfile_multiple_sources(pipe @pytest.mark.requirements -def test_requirements_generates_requirements_from_lockfile_from_a_category(pipenv_instance_private_pypi): +def test_requirements_generates_requirements_from_lockfile_from_categories(pipenv_instance_private_pypi): with pipenv_instance_private_pypi(chdir=True) as p: packages = ('six', '1.12.0') dev_packages = ('itsdangerous', '1.1.0') test_packages = ('pytest', '7.1.3') + doc_packages = ('Sphinx', '5.3.0') + with open(p.pipfile_path, 'w') as f: contents = f""" [[source]] @@ -90,6 +92,8 @@ def test_requirements_generates_requirements_from_lockfile_from_a_category(pipen {dev_packages[0]}= "=={dev_packages[1]}" [test-packages] {test_packages[0]}= "=={test_packages[1]}" + [doc-packages] + {doc_packages[0]}= "=={doc_packages[1]}" """.strip() f.write(contents) l = p.pipenv('lock') @@ -101,11 +105,12 @@ def test_requirements_generates_requirements_from_lockfile_from_a_category(pipen assert f'{test_packages[0]}=={test_packages[1]}' not in c.stdout assert f'{dev_packages[0]}=={dev_packages[1]}' in c.stdout - d = p.pipenv('requirements --category test') + d = p.pipenv('requirements --category test,doc') assert d.returncode == 0 assert f'{packages[0]}=={packages[1]}' not in d.stdout assert f'{dev_packages[0]}=={dev_packages[1]}' not in c.stdout assert f'{test_packages[0]}=={test_packages[1]}' in d.stdout + assert f'{doc_packages[0]}=={doc_packages[1]}' in d.stdout @pytest.mark.requirements def test_requirements_with_git_requirements(pipenv_instance_pypi):