10
10
from pip ._internal .resolution .resolvelib .candidates import REQUIRES_PYTHON_IDENTIFIER
11
11
from pip ._internal .resolution .resolvelib .factory import Factory
12
12
from pip ._internal .resolution .resolvelib .provider import PipProvider
13
- from pip ._internal .resolution .resolvelib .requirements import SpecifierRequirement
13
+ from pip ._internal .resolution .resolvelib .requirements import (
14
+ ExplicitRequirement ,
15
+ SpecifierRequirement ,
16
+ )
14
17
15
18
if TYPE_CHECKING :
16
19
from pip ._vendor .resolvelib .providers import Preference
20
23
PreferenceInformation = RequirementInformation [Requirement , Candidate ]
21
24
22
25
26
+ class FakeCandidate (Candidate ):
27
+ """A minimal fake candidate for testing purposes."""
28
+
29
+ def __init__ (self , * args : object , ** kwargs : object ) -> None : ...
30
+
31
+
23
32
def build_req_info (
24
33
name : str , parent : Optional [Candidate ] = None
25
34
) -> "PreferenceInformation" :
@@ -33,6 +42,14 @@ def build_req_info(
33
42
return requirement_information
34
43
35
44
45
+ def build_explicit_req_info (
46
+ url : str , parent : Optional [Candidate ] = None
47
+ ) -> "PreferenceInformation" :
48
+ """Build a direct requirement using a minimal FakeCandidate."""
49
+ direct_requirement = ExplicitRequirement (FakeCandidate (url ))
50
+ return RequirementInformation (requirement = direct_requirement , parent = parent )
51
+
52
+
36
53
@pytest .mark .parametrize (
37
54
"identifier, information, backtrack_causes, user_requested, expected" ,
38
55
[
@@ -42,55 +59,63 @@ def build_req_info(
42
59
{REQUIRES_PYTHON_IDENTIFIER : [build_req_info ("python" )]},
43
60
[],
44
61
{},
45
- (False , False , True , True , math .inf , True , REQUIRES_PYTHON_IDENTIFIER ),
62
+ (False , True , True , True , math .inf , True , REQUIRES_PYTHON_IDENTIFIER ),
46
63
),
47
64
# Pinned package with "=="
48
65
(
49
66
"pinned-package" ,
50
67
{"pinned-package" : [build_req_info ("pinned-package==1.0" )]},
51
68
[],
52
69
{},
53
- (True , False , False , True , math .inf , False , "pinned-package" ),
70
+ (True , True , False , True , math .inf , False , "pinned-package" ),
54
71
),
55
72
# Star-specified package, i.e. with "*"
56
73
(
57
74
"star-specified-package" ,
58
75
{"star-specified-package" : [build_req_info ("star-specified-package==1.*" )]},
59
76
[],
60
77
{},
61
- (True , False , True , True , math .inf , False , "star-specified-package" ),
78
+ (True , True , True , True , math .inf , False , "star-specified-package" ),
62
79
),
63
80
# Package that caused backtracking
64
81
(
65
82
"backtrack-package" ,
66
83
{"backtrack-package" : [build_req_info ("backtrack-package" )]},
67
84
[build_req_info ("backtrack-package" )],
68
85
{},
69
- (True , False , True , False , math .inf , True , "backtrack-package" ),
86
+ (True , True , True , False , math .inf , True , "backtrack-package" ),
70
87
),
71
88
# Root package requested by user
72
89
(
73
90
"root-package" ,
74
91
{"root-package" : [build_req_info ("root-package" )]},
75
92
[],
76
93
{"root-package" : 1 },
77
- (True , False , True , True , 1 , True , "root-package" ),
94
+ (True , True , True , True , 1 , True , "root-package" ),
78
95
),
79
96
# Unfree package (with specifier operator)
80
97
(
81
98
"unfree-package" ,
82
99
{"unfree-package" : [build_req_info ("unfree-package<1" )]},
83
100
[],
84
101
{},
85
- (True , False , True , True , math .inf , False , "unfree-package" ),
102
+ (True , True , True , True , math .inf , False , "unfree-package" ),
86
103
),
87
104
# Free package (no operator)
88
105
(
89
106
"free-package" ,
90
107
{"free-package" : [build_req_info ("free-package" )]},
91
108
[],
92
109
{},
93
- (True , False , True , True , math .inf , True , "free-package" ),
110
+ (True , True , True , True , math .inf , True , "free-package" ),
111
+ ),
112
+ # Test case for "direct" preference (explicit URL)
113
+ (
114
+ "direct-package" ,
115
+ {"direct-package" : [build_explicit_req_info ("direct-package" )]},
116
+ [],
117
+ {},
118
+ (True , False , True , True , math .inf , True , "direct-package" ),
94
119
),
95
120
],
96
121
)
0 commit comments