From 169eb17d3ca6aeb79da4faf32fb20bf01a8705f5 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Mon, 19 Sep 2022 11:20:20 -0400 Subject: [PATCH] Make keep-outdated work with multiple categories. --- pipenv/core.py | 29 +++++++++++++++-------------- pipenv/project.py | 7 +++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pipenv/core.py b/pipenv/core.py index 0ba35caa..528225d6 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -22,12 +22,14 @@ from pipenv.patched.pip._internal.req.constructors import ( ) from pipenv.patched.pip._internal.req.req_file import parse_requirements from pipenv.patched.pip._internal.utils.misc import split_auth_from_netloc +from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name from pipenv.project import Project from pipenv.utils.constants import MYPY_RUNNING from pipenv.utils.dependencies import ( convert_deps_to_pip, get_canonical_names, get_constraints_from_deps, + get_lockfile_section_using_pipfile_category, is_pinned, is_required_version, is_star, @@ -1090,25 +1092,24 @@ def do_lock( # Support for --keep-outdated... if keep_outdated: - from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name + for category_name in project.get_package_categories(): + category = project.get_pipfile_section(category_name) + lockfile_section = get_lockfile_section_using_pipfile_category(category_name) - for section_name, category in ( - ("default", project.packages), - ("develop", project.dev_packages), - ): for package_specified in category.keys(): if not is_pinned(category[package_specified]): canonical_name = canonicalize_name(package_specified) - if canonical_name in cached_lockfile[section_name]: - lockfile[section_name][canonical_name] = cached_lockfile[ - section_name + if canonical_name in cached_lockfile[lockfile_section]: + lockfile[lockfile_section][canonical_name] = cached_lockfile[ + lockfile_section ][canonical_name].copy() - for key in ["default", "develop"]: - packages = set(cached_lockfile[key].keys()) - new_lockfile = set(lockfile[key].keys()) - missing = packages - new_lockfile - for missing_pkg in missing: - lockfile[key][missing_pkg] = cached_lockfile[key][missing_pkg].copy() + packages = set(cached_lockfile[lockfile_section].keys()) + new_lockfile = set(lockfile[lockfile_section].keys()) + missing = packages - new_lockfile + for missing_pkg in missing: + lockfile[lockfile_section][missing_pkg] = cached_lockfile[ + lockfile_section + ][missing_pkg].copy() # Overwrite any develop packages with default packages. for category in lockfile_categories: if category == "default": diff --git a/pipenv/project.py b/pipenv/project.py index 64a85074..0e0b7dc9 100644 --- a/pipenv/project.py +++ b/pipenv/project.py @@ -695,10 +695,9 @@ class Project: ) if from_pipfile and self.pipfile_exists: - lockfile_dict = { - "default": self._lockfile["default"].copy(), - "develop": self._lockfile["develop"].copy(), - } + lockfile_dict = {} + for category in self.get_package_categories(for_lockfile=True): + lockfile_dict[category] = self._lockfile.get(category, {}).copy() lockfile_dict.update({"_meta": self.get_lockfile_meta()}) lockfile = Req_Lockfile.from_data( path=self.lockfile_location, data=lockfile_dict, meta_from_project=False