From 3a4c29215dd0395b88b0a0c2c3b86d81f7c8f786 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 5 Nov 2024 07:46:12 +0100
Subject: [PATCH] fix(versioning/poetry): use pep440 for comparisons (#32275)

---
 lib/modules/versioning/poetry/index.spec.ts | 41 +++++++++++++++------
 lib/modules/versioning/poetry/index.ts      |  8 ++--
 2 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/lib/modules/versioning/poetry/index.spec.ts b/lib/modules/versioning/poetry/index.spec.ts
index 54279366f8..faa855f4c2 100644
--- a/lib/modules/versioning/poetry/index.spec.ts
+++ b/lib/modules/versioning/poetry/index.spec.ts
@@ -45,17 +45,36 @@ describe('modules/versioning/poetry/index', () => {
   );
 
   it.each`
-    a           | b             | expected
-    ${'2'}      | ${'1'}        | ${true}
-    ${'2.0'}    | ${'1'}        | ${true}
-    ${'2.0.0'}  | ${'1'}        | ${true}
-    ${'1.10.0'} | ${'1.9'}      | ${true}
-    ${'1.9'}    | ${'1.9-beta'} | ${true}
-    ${'1.9'}    | ${'1.9a0'}    | ${true}
-    ${'1'}      | ${'1'}        | ${false}
-    ${'1.0'}    | ${'1'}        | ${false}
-    ${'1.0.0'}  | ${'1'}        | ${false}
-    ${'1.9.0'}  | ${'1.9'}      | ${false}
+    a                         | b                         | expected
+    ${'2'}                    | ${'1'}                    | ${true}
+    ${'2.0'}                  | ${'1'}                    | ${true}
+    ${'2.0.0'}                | ${'1'}                    | ${true}
+    ${'1.10.0'}               | ${'1.9'}                  | ${true}
+    ${'1.9'}                  | ${'1.9-beta'}             | ${true}
+    ${'1.9'}                  | ${'1.9a0'}                | ${true}
+    ${'1'}                    | ${'1'}                    | ${false}
+    ${'1.0'}                  | ${'1'}                    | ${false}
+    ${'1.0.0'}                | ${'1'}                    | ${false}
+    ${'1.9.0'}                | ${'1.9'}                  | ${false}
+    ${'1.0.dev456'}           | ${'1.dev0'}               | ${true}
+    ${'1.0a1'}                | ${'1.0.dev456'}           | ${true}
+    ${'1.0a2.dev456'}         | ${'1.0a1'}                | ${true}
+    ${'1.0a12.dev456'}        | ${'1.0a2.dev456'}         | ${true}
+    ${'1.0a12'}               | ${'1.0a12.dev456'}        | ${true}
+    ${'1.0b1.dev456'}         | ${'1.0a12'}               | ${true}
+    ${'1.0b2'}                | ${'1.0b1.dev456'}         | ${true}
+    ${'1.0b2.post345.dev456'} | ${'1.0b2'}                | ${true}
+    ${'1.0b2.post345'}        | ${'1.0b2.post345.dev456'} | ${true}
+    ${'1.0rc1.dev456'}        | ${'1.0b2.post345'}        | ${true}
+    ${'1.0rc1'}               | ${'1.0rc1.dev456'}        | ${true}
+    ${'1.0'}                  | ${'1.0rc1'}               | ${true}
+    ${'1.0+abc.5'}            | ${'1.0'}                  | ${true}
+    ${'1.0+abc.7'}            | ${'1.0+abc.5'}            | ${true}
+    ${'1.0+5'}                | ${'1.0+abc.7'}            | ${true}
+    ${'1.0.post456.dev34'}    | ${'1.0+5'}                | ${true}
+    ${'1.0.post456'}          | ${'1.0.post456.dev34'}    | ${true}
+    ${'1.0.15'}               | ${'1.0.post456'}          | ${true}
+    ${'1.1.dev1'}             | ${'1.0.15'}               | ${true}
   `('isGreaterThan("$a", "$b") === $expected', ({ a, b, expected }) => {
     expect(versioning.isGreaterThan(a, b)).toBe(expected);
   });
diff --git a/lib/modules/versioning/poetry/index.ts b/lib/modules/versioning/poetry/index.ts
index 02af8335d5..b6ca8440d0 100644
--- a/lib/modules/versioning/poetry/index.ts
+++ b/lib/modules/versioning/poetry/index.ts
@@ -2,6 +2,7 @@ import { parseRange } from 'semver-utils';
 import { logger } from '../../../logger';
 import type { RangeStrategy } from '../../../types/versioning';
 import { api as npm } from '../npm';
+import { api as pep440 } from '../pep440';
 import type { NewValueConfig, VersioningApi } from '../types';
 
 import { VERSION_PATTERN } from './patterns';
@@ -53,9 +54,7 @@ function isVersion(input: string): boolean {
 }
 
 function isGreaterThan(a: string, b: string): boolean {
-  const semverA = poetry2semver(a);
-  const semverB = poetry2semver(b);
-  return !!(semverA && semverB && npm.isGreaterThan(semverA, semverB));
+  return !!(a && b && pep440.isGreaterThan(a, b));
 }
 
 function isLessThanRange(version: string, range: string): boolean {
@@ -244,8 +243,7 @@ function getNewValue({
 }
 
 function sortVersions(a: string, b: string): number {
-  // istanbul ignore next
-  return npm.sortVersions(poetry2semver(a) ?? '', poetry2semver(b) ?? '');
+  return pep440.sortVersions(a, b);
 }
 
 function subset(subRange: string, superRange: string): boolean | undefined {
-- 
GitLab