Visitar URL original
fix(pep440): skip pre-releases when the pattern is a constraint (#10546) · davidaparicio/updatecli@c0e2fe6 · GitHub
Skip to content

Commit c0e2fe6

Browse files
authored
fix(pep440): skip pre-releases when the pattern is a constraint (updatecli#10546)
Pep440.Search only filtered pre-releases out on the "*" pattern, so a constraint such as ">=15,<16" resolved to 15.7.0b1 while 15.6.1 was the latest stable. Specifiers.Check accepts pre-releases, PEP 440 leaves their exclusion to the caller. Fixes updatecli#10545 Signed-off-by: Loïs Postula <lois@postu.la>
1 parent c1f2f28 commit c0e2fe6

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

‎pkg/plugins/utils/version/pep440.go‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ func (p *Pep440) Search(versions []string) error {
7575
return fmt.Errorf("%s", err)
7676
}
7777

78+
// A pre-release only qualifies once no stable version satisfies the constraint.
79+
for _, v := range p.versions {
80+
if specifiers.Check(v) && !v.IsPreRelease() {
81+
p.FoundVersion.ParsedVersion = v.String()
82+
p.FoundVersion.OriginalVersion = v.Original()
83+
return nil
84+
}
85+
}
86+
7887
for _, v := range p.versions {
7988
if specifiers.Check(v) {
8089
p.FoundVersion.ParsedVersion = v.String()

‎pkg/plugins/utils/version/pep440_test.go‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,30 @@ var (
130130
ExpectedParsedVersion: "1.0b2",
131131
ExpectedOriginalVersion: "1.0b2",
132132
},
133+
{
134+
// Constraint skips the pre-release in favor of the highest matching stable version.
135+
Pep440: Pep440{
136+
Constraint: ">=15,<16",
137+
},
138+
Versions: []string{"14.0.0", "15.6.1", "15.7.0b1", "16.0.0"},
139+
SortedVersions: []string{"16.0.0", "15.7.0b1", "15.6.1", "14.0.0"},
140+
ExpectedInitErr: nil,
141+
ExpectedSearchErr: nil,
142+
ExpectedParsedVersion: "15.6.1",
143+
ExpectedOriginalVersion: "15.6.1",
144+
},
145+
{
146+
// Constraint falls back to the highest matching pre-release when no stable version matches.
147+
Pep440: Pep440{
148+
Constraint: ">2.0",
149+
},
150+
Versions: []string{"2.0", "2.1.0b3", "2.1.0rc2"},
151+
SortedVersions: []string{"2.1.0rc2", "2.1.0b3", "2.0"},
152+
ExpectedInitErr: nil,
153+
ExpectedSearchErr: nil,
154+
ExpectedParsedVersion: "2.1.0rc2",
155+
ExpectedOriginalVersion: "2.1.0rc2",
156+
},
133157
{
134158
// Empty constraint behaves identically to wildcard: skips pre-releases.
135159
Pep440: Pep440{

0 commit comments

Comments
 (0)