|
4 | 4 | import importlib
|
5 | 5 | import importlib.metadata
|
6 | 6 | import importlib.util
|
7 |
| -import itertools |
8 | 7 | import json
|
9 | 8 | import os
|
10 | 9 | import site
|
|
21 | 20 | from pipenv.patched.pip._internal.req.req_install import InstallRequirement
|
22 | 21 | from pipenv.patched.pip._vendor.packaging.specifiers import SpecifierSet
|
23 | 22 | from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
|
| 23 | +from pipenv.patched.pip._vendor.packaging.version import parse as parse_version |
24 | 24 | from pipenv.utils import console
|
25 | 25 | from pipenv.utils.fileutils import normalize_path, temp_path
|
26 | 26 | from pipenv.utils.funktools import chunked, unnest
|
@@ -575,22 +575,22 @@ def get_package_info(
|
575 | 575 | best_candidate_result = candidate_evaluator.compute_best_candidate(
|
576 | 576 | all_candidates
|
577 | 577 | )
|
578 |
| - remote_version = best_candidate_result.best_candidate.version |
| 578 | + remote_version = parse_version(str(best_candidate_result.best_candidate.version)) |
579 | 579 | if best_candidate_result.best_candidate.link.is_wheel:
|
580 | 580 | typ = "wheel"
|
581 | 581 | else:
|
582 | 582 | typ = "sdist"
|
583 | 583 | # This is dirty but makes the rest of the code much cleaner
|
584 | 584 | dist.latest_version = remote_version
|
585 |
| - dist.latest_filetype = typ |
586 | 585 | yield dist
|
| 586 | + |
587 | 587 | def get_outdated_packages(
|
588 | 588 | self, pre: bool = False
|
589 | 589 | ) -> list[importlib.metadata.Distribution]:
|
590 | 590 | return [
|
591 | 591 | pkg
|
592 | 592 | for pkg in self.get_package_info(pre=pre)
|
593 |
| - if pkg.latest_version._key > pkg.parsed_version._key |
| 593 | + if pkg.latest_version > parse_version(pkg.version) |
594 | 594 | ]
|
595 | 595 |
|
596 | 596 | @classmethod
|
@@ -618,16 +618,30 @@ def _get_requirements_for_package(cls, node, key_tree, parent=None, chain=None):
|
618 | 618 |
|
619 | 619 | def get_package_requirements(self, pkg=None):
|
620 | 620 | from itertools import chain
|
621 |
| - |
622 |
| - from pipenv.vendor.pipdeptree._models import PackageDAG |
| 621 | + from pipenv.vendor.pipdeptree._models.dag import PackageDAG |
| 622 | + from pipenv.vendor.pipdeptree._models.package import DistPackage, ReqPackage, InvalidRequirementError |
| 623 | + from pipenv.patched.pip._vendor.packaging.markers import UndefinedEnvironmentName |
623 | 624 |
|
624 | 625 | flatten = chain.from_iterable
|
625 | 626 |
|
626 | 627 | packages = self.get_installed_packages()
|
627 | 628 | if pkg:
|
628 | 629 | packages = [p for p in packages if p.name == pkg]
|
629 | 630 |
|
630 |
| - tree = PackageDAG.from_pkgs(packages).sort() |
| 631 | + try: |
| 632 | + tree = PackageDAG.from_pkgs(packages) |
| 633 | + except InvalidRequirementError as e: |
| 634 | + console.print(f"Invalid requirement: {e}", style="yellow") |
| 635 | + tree = PackageDAG({}) |
| 636 | + except UndefinedEnvironmentName: |
| 637 | + # Handle the case when 'extra' environment variable is not defined |
| 638 | + tree = PackageDAG({}) |
| 639 | + except Exception as e: |
| 640 | + # Handle any other exceptions that may occur during PackageDAG initialization |
| 641 | + console.print(f"Failed to create PackageDAG: {e}", style="yellow") |
| 642 | + tree = PackageDAG({}) |
| 643 | + |
| 644 | + tree = tree.sort() |
631 | 645 | branch_keys = {r.name for r in flatten(tree.values())}
|
632 | 646 | if pkg is None:
|
633 | 647 | nodes = [p for p in tree if p.name not in branch_keys]
|
@@ -681,9 +695,6 @@ def reverse_dependencies(self):
|
681 | 695 |
|
682 | 696 | def get_working_set(self):
|
683 | 697 | """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 | 698 | """
|
688 | 699 |
|
689 | 700 | return importlib.metadata.distributions(path=self.sys_path)
|
|
0 commit comments