Skip to content

Commit 184683c

Browse files
committed
Convert outdated off pkg_resource to importlib.metadata.
1 parent 201bbb8 commit 184683c

File tree

2 files changed

+38
-24
lines changed

2 files changed

+38
-24
lines changed

pipenv/environment.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import importlib
55
import importlib.metadata
66
import importlib.util
7-
import itertools
87
import json
98
import os
109
import site
@@ -21,6 +20,7 @@
2120
from pipenv.patched.pip._internal.req.req_install import InstallRequirement
2221
from pipenv.patched.pip._vendor.packaging.specifiers import SpecifierSet
2322
from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
23+
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
2424
from pipenv.utils import console
2525
from pipenv.utils.fileutils import normalize_path, temp_path
2626
from pipenv.utils.funktools import chunked, unnest
@@ -557,7 +557,6 @@ def get_package_info(
557557

558558
with self.get_finder() as finder:
559559
for dist in packages:
560-
typ = "unknown"
561560
all_candidates = finder.find_all_candidates(dist.name)
562561
if not self.pipfile.get("pre", finder.allow_all_prereleases):
563562
# Remove prereleases
@@ -575,22 +574,24 @@ def get_package_info(
575574
best_candidate_result = candidate_evaluator.compute_best_candidate(
576575
all_candidates
577576
)
578-
remote_version = best_candidate_result.best_candidate.version
577+
remote_version = parse_version(
578+
str(best_candidate_result.best_candidate.version)
579+
)
579580
if best_candidate_result.best_candidate.link.is_wheel:
580-
typ = "wheel"
581+
pass
581582
else:
582-
typ = "sdist"
583+
pass
583584
# This is dirty but makes the rest of the code much cleaner
584585
dist.latest_version = remote_version
585-
dist.latest_filetype = typ
586586
yield dist
587+
587588
def get_outdated_packages(
588589
self, pre: bool = False
589590
) -> list[importlib.metadata.Distribution]:
590591
return [
591592
pkg
592593
for pkg in self.get_package_info(pre=pre)
593-
if pkg.latest_version._key > pkg.parsed_version._key
594+
if pkg.latest_version > parse_version(pkg.version)
594595
]
595596

596597
@classmethod
@@ -619,15 +620,30 @@ def _get_requirements_for_package(cls, node, key_tree, parent=None, chain=None):
619620
def get_package_requirements(self, pkg=None):
620621
from itertools import chain
621622

622-
from pipenv.vendor.pipdeptree._models import PackageDAG
623+
from pipenv.patched.pip._vendor.packaging.markers import UndefinedEnvironmentName
624+
from pipenv.vendor.pipdeptree._models.dag import PackageDAG
625+
from pipenv.vendor.pipdeptree._models.package import InvalidRequirementError
623626

624627
flatten = chain.from_iterable
625628

626629
packages = self.get_installed_packages()
627630
if pkg:
628631
packages = [p for p in packages if p.name == pkg]
629632

630-
tree = PackageDAG.from_pkgs(packages).sort()
633+
try:
634+
tree = PackageDAG.from_pkgs(packages)
635+
except InvalidRequirementError as e:
636+
console.print(f"Invalid requirement: {e}", style="yellow")
637+
tree = PackageDAG({})
638+
except UndefinedEnvironmentName:
639+
# Handle the case when 'extra' environment variable is not defined
640+
tree = PackageDAG({})
641+
except Exception as e:
642+
# Handle any other exceptions that may occur during PackageDAG initialization
643+
console.print(f"Failed to create PackageDAG: {e}", style="yellow")
644+
tree = PackageDAG({})
645+
646+
tree = tree.sort()
631647
branch_keys = {r.name for r in flatten(tree.values())}
632648
if pkg is None:
633649
nodes = [p for p in tree if p.name not in branch_keys]
@@ -680,11 +696,7 @@ def reverse_dependencies(self):
680696
return rdeps
681697

682698
def get_working_set(self):
683-
"""Retrieve the working set of installed packages for the environment.
684-
685-
:return: The working set for the environment
686-
:rtype: :class:`pkg_resources.WorkingSet`
687-
"""
699+
"""Retrieve the working set of installed packages for the environment."""
688700

689701
return importlib.metadata.distributions(path=self.sys_path)
690702

@@ -703,8 +715,7 @@ def is_satisfied(self, req: InstallRequirement):
703715
iter(
704716
d
705717
for d in self.get_distributions()
706-
if req.name
707-
and canonicalize_name(d.name) == canonicalize_name(req.name)
718+
if req.name and canonicalize_name(d.name) == canonicalize_name(req.name)
708719
),
709720
None,
710721
)

pipenv/routines/outdated.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from collections.abc import Mapping
44

55
from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
6+
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
67
from pipenv.routines.lock import do_lock
78
from pipenv.utils.dependencies import (
89
as_pipfile,
@@ -19,8 +20,8 @@ def do_outdated(project, pypi_mirror=None, pre=False, clear=False):
1920

2021
installed_packages = project.environment.get_installed_packages()
2122
outdated_packages = {
22-
canonicalize_name(pkg.project_name): package_info(
23-
pkg.project_name, pkg.parsed_version, pkg.latest_version
23+
canonicalize_name(pkg.name): package_info(
24+
pkg.name, parse_version(pkg.version), pkg.latest_version
2425
)
2526
for pkg in project.environment.get_outdated_packages()
2627
}
@@ -29,9 +30,7 @@ def do_outdated(project, pypi_mirror=None, pre=False, clear=False):
2930
for name, deps in project.environment.reverse_dependencies().items()
3031
}
3132
for result in installed_packages:
32-
dep, _ = expansive_install_req_from_line(
33-
str(result.as_requirement()), expand_env=True
34-
)
33+
dep, _ = expansive_install_req_from_line(f"{result.name}=={result.version}")
3534
packages.update(as_pipfile(dep))
3635

3736
updated_packages = {}
@@ -41,7 +40,9 @@ def do_outdated(project, pypi_mirror=None, pre=False, clear=False):
4140
for category in project.get_package_categories(for_lockfile=True):
4241
for package in lockfile.get(category, []):
4342
try:
44-
updated_packages[package] = lockfile[category][package]["version"]
43+
updated_packages[package] = parse_version(
44+
lockfile[category][package]["version"]
45+
)
4546
except KeyError: # noqa: PERF203
4647
pass
4748
outdated = []
@@ -51,10 +52,12 @@ def do_outdated(project, pypi_mirror=None, pre=False, clear=False):
5152
if norm_name in updated_packages:
5253
version = packages[package]
5354
if isinstance(version, Mapping):
54-
version = version.get("version")
55+
version = parse_version(version.get("version"))
56+
else:
57+
version = parse_version(version)
5558
if updated_packages[norm_name] != version:
5659
outdated.append(
57-
package_info(package, updated_packages[norm_name], packages[package])
60+
package_info(package, str(version), str(updated_packages[norm_name]))
5861
)
5962
elif canonicalize_name(package) in outdated_packages:
6063
skipped.append(outdated_packages[canonicalize_name(package)])

0 commit comments

Comments
 (0)