diff --git a/news/5540.bugfix.rst b/news/5540.bugfix.rst new file mode 100644 index 0000000000..da5c5b60a7 --- /dev/null +++ b/news/5540.bugfix.rst @@ -0,0 +1 @@ +Fix: `update --outdated` raises NonExistentKey with outdated dev packages diff --git a/pipenv/core.py b/pipenv/core.py index 771e8eea7b..677845853c 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -2081,7 +2081,9 @@ def do_outdated(project, pypi_mirror=None, pre=False, clear=False): ) if name_in_pipfile: required = "" - version = get_version(project.packages[name_in_pipfile]) + version = get_version( + project.get_pipfile_section(category)[name_in_pipfile] + ) rdeps = reverse_deps.get(canonicalize_name(package)) if isinstance(rdeps, Mapping) and "required" in rdeps: required = " {} required".format(rdeps["required"]) diff --git a/pyproject.toml b/pyproject.toml index 3b12f890ba..5c0eb6cdf3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,6 +78,7 @@ filterwarnings = [ # `pipenv run pytest --markers` will list all markers inlcuding these markers = [ "install: tests having to do with `pipenv install`", + "update: tests having to do with `pipenv update`", "needs_internet: integration tests that require internet to pass", "basic: basic pipenv tests grouping", "dev: tests having to do with dev and dev packages", diff --git a/tests/integration/test_update.py b/tests/integration/test_update.py new file mode 100644 index 0000000000..e9db40b9fe --- /dev/null +++ b/tests/integration/test_update.py @@ -0,0 +1,12 @@ +import pytest + +@pytest.mark.parametrize("cmd_option", ["", "--dev"]) +@pytest.mark.basic +@pytest.mark.update +def test_update_outdated_with_outdated_package(pipenv_instance_private_pypi, cmd_option): + with pipenv_instance_private_pypi() as p: + package_name = "six" + p.pipenv(f"install {cmd_option} {package_name}==1.11") + c = p.pipenv("update --outdated") + assert isinstance(c.exception, SystemExit) + assert c.stdout_bytes.decode("utf-8").startswith(f"Package '{package_name}' out-of-date:")