diff --git a/lib/modules/versioning/pep440/index.spec.ts b/lib/modules/versioning/pep440/index.spec.ts index eabcdf676ddd61a3f3eea63774d089b1216f1644..84fe37c5090bd98dd400fa76c1fb7e0df2bc754c 100644 --- a/lib/modules/versioning/pep440/index.spec.ts +++ b/lib/modules/versioning/pep440/index.spec.ts @@ -165,6 +165,9 @@ describe('modules/versioning/pep440/index', () => { ${'~=7.2'} | ${'replace'} | ${'7.2.0'} | ${'8.0.1'} | ${'~=8.0'} ${'~=7.2'} | ${'replace'} | ${'7.2.0'} | ${'8'} | ${'~=8.0'} ${'~=7.2.0'} | ${'replace'} | ${'7.2.0'} | ${'8.2'} | ${'~=8.2.0'} + ${'~=7.2'} | ${'widen'} | ${'7.2.0'} | ${'8.0.1'} | ${'>=7.2,<9'} + ${'~=7.2'} | ${'widen'} | ${'7.2.0'} | ${'8'} | ${'>=7.2,<9'} + ${'~=7.2.0'} | ${'widen'} | ${'7.2.0'} | ${'8.2'} | ${'>=7.2.0,<8.3'} ${'==3.2.*,>=3.2.2'} | ${'replace'} | ${'3.2.2'} | ${'4.1.1'} | ${'==4.1.*'} ${'==3.2.*,>=3.2.2'} | ${'replace'} | ${'3.2.2'} | ${'4.0.0'} | ${'==4.0.*'} ${'>=1.0.0,<1.1.0'} | ${'replace'} | ${'1.0.0'} | ${'1.2.0'} | ${'>=1.2.0,<1.3.0'} diff --git a/lib/modules/versioning/pep440/range.ts b/lib/modules/versioning/pep440/range.ts index 56920e731ac582f23ee87c3ae1122d1cf1793d17..ca7efbad6ce5e349e43dd8eb78cc5fada8da74d9 100644 --- a/lib/modules/versioning/pep440/range.ts +++ b/lib/modules/versioning/pep440/range.ts @@ -85,7 +85,7 @@ function getFutureVersion( interface Range { operator: string; - prefix: string; + prefix?: string; version: string; } @@ -365,6 +365,23 @@ function trimTrailingZeros(numbers: number[]): number[] { return numbers.slice(0, i + 1); } +function divideCompatibleReleaseRange(currentRange: Range): Range[] { + const currentVersionUpperBound = currentRange.version + .split('.') + .map((num) => parseInt(num)); + if (currentVersionUpperBound.length > 1) { + currentVersionUpperBound.splice(-1); + } + currentVersionUpperBound[currentVersionUpperBound.length - 1] += 1; + return [ + { operator: '>=', version: currentRange.version }, + { + operator: '<', + version: currentVersionUpperBound.join('.'), + }, + ]; +} + function handleWidenStrategy( { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig, ranges: Range[] @@ -375,7 +392,15 @@ function handleWidenStrategy( } let rangePrecision = getRangePrecision(ranges); const trimZeros = hasZeroSpecifier(ranges); - return ranges.map((range) => { + let newRanges: Range[] = []; + if (ranges.length === 1 && ranges[0].operator === '~=') { + // If range operator is '~=', divide the range into its logical equivalent. + // Example: ~=1.0 --> >=1.0,<2 + newRanges = divideCompatibleReleaseRange(ranges[0]); + } else { + newRanges = ranges; + } + return newRanges.map((range) => { // newVersion is over the upper bound if (range.operator === '<' && gte(newVersion, range.version)) { const upperBound = parseVersion(range.version)?.release ?? [];