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
@@ -557,7 +557,6 @@ def get_package_info(
557
557
558
558
with self .get_finder () as finder :
559
559
for dist in packages :
560
- typ = "unknown"
561
560
all_candidates = finder .find_all_candidates (dist .name )
562
561
if not self .pipfile .get ("pre" , finder .allow_all_prereleases ):
563
562
# Remove prereleases
@@ -575,22 +574,24 @@ def get_package_info(
575
574
best_candidate_result = candidate_evaluator .compute_best_candidate (
576
575
all_candidates
577
576
)
578
- remote_version = best_candidate_result .best_candidate .version
577
+ remote_version = parse_version (
578
+ str (best_candidate_result .best_candidate .version )
579
+ )
579
580
if best_candidate_result .best_candidate .link .is_wheel :
580
- typ = "wheel"
581
+ pass
581
582
else :
582
- typ = "sdist"
583
+ pass
583
584
# This is dirty but makes the rest of the code much cleaner
584
585
dist .latest_version = remote_version
585
- dist .latest_filetype = typ
586
586
yield dist
587
+
587
588
def get_outdated_packages (
588
589
self , pre : bool = False
589
590
) -> list [importlib .metadata .Distribution ]:
590
591
return [
591
592
pkg
592
593
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 )
594
595
]
595
596
596
597
@classmethod
@@ -619,15 +620,30 @@ def _get_requirements_for_package(cls, node, key_tree, parent=None, chain=None):
619
620
def get_package_requirements (self , pkg = None ):
620
621
from itertools import chain
621
622
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
623
626
624
627
flatten = chain .from_iterable
625
628
626
629
packages = self .get_installed_packages ()
627
630
if pkg :
628
631
packages = [p for p in packages if p .name == pkg ]
629
632
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 ()
631
647
branch_keys = {r .name for r in flatten (tree .values ())}
632
648
if pkg is None :
633
649
nodes = [p for p in tree if p .name not in branch_keys ]
@@ -680,11 +696,7 @@ def reverse_dependencies(self):
680
696
return rdeps
681
697
682
698
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."""
688
700
689
701
return importlib .metadata .distributions (path = self .sys_path )
690
702
@@ -703,8 +715,7 @@ def is_satisfied(self, req: InstallRequirement):
703
715
iter (
704
716
d
705
717
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 )
708
719
),
709
720
None ,
710
721
)
0 commit comments