diff --git a/lib/versioning/ruby/index.spec.ts b/lib/versioning/ruby/index.spec.ts index 3b18a1554e98fea160d863529c816f8003d14dc2..5cbe03cc4378718d7980f907fbc35542384c486a 100644 --- a/lib/versioning/ruby/index.spec.ts +++ b/lib/versioning/ruby/index.spec.ts @@ -278,15 +278,6 @@ describe('semverRuby', () => { false ); }); - - it('returns null for garbage version input', () => { - expect(semverRuby.isLessThanRange('asdf', '> 1.2.2, ~> 2.0.0')).toBe( - null - ); - expect( - semverRuby.isLessThanRange(null as string, '> 1.2.2, ~> 2.0.0') - ).toBe(null); - }); }); describe('.isValid', () => { diff --git a/lib/versioning/ruby/index.ts b/lib/versioning/ruby/index.ts index 500270fd4ea8146c14999ce7f27bd609d3581f9f..334e27b46d0a6cb89e5e5036b7aeaafda84aa757 100644 --- a/lib/versioning/ruby/index.ts +++ b/lib/versioning/ruby/index.ts @@ -5,7 +5,7 @@ import { satisfies, maxSatisfying, minSatisfying, -} from '@renovatebot/ruby-semver'; +} from '@snyk/ruby-semver'; import { VersioningApi, NewValueConfig } from '../common'; import { logger } from '../../logger'; import { parse as parseVersion } from './version'; diff --git a/lib/versioning/ruby/range.ts b/lib/versioning/ruby/range.ts index fd0f46e26b78054b3bceb8d7fd9087e1b14c4729..be31b163aa2b9bd93e539fff10c84a485f649337 100644 --- a/lib/versioning/ruby/range.ts +++ b/lib/versioning/ruby/range.ts @@ -1,5 +1,5 @@ -import { create, Version } from '@renovatebot/ruby-semver/dist/ruby/version'; -import { parse as _parse } from '@renovatebot/ruby-semver/dist/ruby/requirement'; +import { create } from '@snyk/ruby-semver/lib/ruby/gem-version'; +import { parse as _parse } from '@snyk/ruby-semver/lib/ruby/gem-requirement'; import { logger } from '../../logger'; import { EQUAL, NOT_EQUAL, GT, LT, GTE, LTE, PGTE } from './operator'; @@ -27,14 +27,15 @@ const parse = (range: string): Range => { }; }; -type GemRequirement = [string, Version]; +interface GemVersion { + release(): GemVersion; + compare(ver: GemVersion): number; + bump(): GemVersion; +} +type GemRequirement = [string, GemVersion]; -const ltr = (version: string, range: string): boolean | null => { - const gemVersion = create(version); - if (!gemVersion) { - logger.warn(`Invalid ruby version '${version}'`); - return null; - } +const ltr = (version: string, range: string): boolean => { + const gemVersion: GemVersion = create(version); const requirements: GemRequirement[] = range.split(',').map(_parse); const results = requirements.map(([operator, ver]) => { diff --git a/lib/versioning/ruby/strategies/bump.ts b/lib/versioning/ruby/strategies/bump.ts index a66d6ffe36b05018d56b460ff794b5771b66ef9e..acbac49726cdb1db765caa4e0764c73aa18faf2d 100644 --- a/lib/versioning/ruby/strategies/bump.ts +++ b/lib/versioning/ruby/strategies/bump.ts @@ -1,4 +1,4 @@ -import { gte, lte } from '@renovatebot/ruby-semver'; +import { gte, lte } from '@snyk/ruby-semver'; import { logger } from '../../../logger'; import { EQUAL, NOT_EQUAL, GT, LT, GTE, LTE, PGTE } from '../operator'; import { floor, increment, decrement } from '../version'; diff --git a/lib/versioning/ruby/strategies/replace.ts b/lib/versioning/ruby/strategies/replace.ts index 4ff52e7562ddaa1e85521eedef3be03582fdadc7..632e32ba3b550ba8f5a98f7a81f7c2f158778e28 100644 --- a/lib/versioning/ruby/strategies/replace.ts +++ b/lib/versioning/ruby/strategies/replace.ts @@ -1,4 +1,4 @@ -import { satisfies } from '@renovatebot/ruby-semver'; +import { satisfies } from '@snyk/ruby-semver'; import bump from './bump'; import { logger } from '../../../logger'; diff --git a/lib/versioning/ruby/version.ts b/lib/versioning/ruby/version.ts index 7059b5b922fa59e3aa1646d7b1e5a26fe259d53d..a6914561f59f78bd6006736122020e76b616d848 100644 --- a/lib/versioning/ruby/version.ts +++ b/lib/versioning/ruby/version.ts @@ -1,24 +1,12 @@ import last from 'lodash/last'; -import { - create, - SegmentElement, -} from '@renovatebot/ruby-semver/dist/ruby/version'; -import { eq, major, minor, patch, prerelease } from '@renovatebot/ruby-semver'; +import { create } from '@snyk/ruby-semver/lib/ruby/gem-version'; +import { diff, major, minor, patch, prerelease } from '@snyk/ruby-semver'; interface RubyVersion { major: number; minor: number; patch: number; - prerelease: string[] | null; -} - -function releaseSegments(version: string): SegmentElement[] { - const v = create(version); - if (v) { - return v.release().getSegments(); - } - /* istanbul ignore next */ - return []; + prerelease: string[]; } const parse = (version: string): RubyVersion => ({ @@ -31,14 +19,13 @@ const parse = (version: string): RubyVersion => ({ const adapt = (left: string, right: string): string => left.split('.').slice(0, right.split('.').length).join('.'); -const floor = (version: string): string => { - return [...releaseSegments(version).slice(0, -1), 0].join('.'); -}; +const floor = (version: string): string => + [...create(version).release().getSegments().slice(0, -1), 0].join('.'); // istanbul ignore next const incrementLastSegment = (version: string): string => { - const segments = releaseSegments(version); - const nextLast = parseInt(last(segments) as string, 10) + 1; + const segments = create(version).release().getSegments(); + const nextLast = parseInt(last(segments), 10) + 1; return [...segments.slice(0, -1), nextLast].join('.'); }; @@ -61,29 +48,24 @@ const incrementPatch = (ptch: number, pre: string[]): number => // istanbul ignore next const increment = (from: string, to: string): string => { - const parsed = parse(from); - const { major: maj, prerelease: pre } = parsed; - let { minor: min, patch: ptch } = parsed; - min = min || 0; - ptch = ptch || 0; + const { major: maj, minor: min, patch: ptch, prerelease: pre } = parse(from); let nextVersion: string; - const adapted = adapt(to, from); - if (eq(from, adapted)) { - return incrementLastSegment(from); - } - - const isStable = (x: string): boolean => /^[0-9.-/]+$/.test(x); - if (major(from) !== major(adapted)) { - nextVersion = [incrementMajor(maj, min, ptch, pre || []), 0, 0].join('.'); - } else if (minor(from) !== minor(adapted)) { - nextVersion = [maj, incrementMinor(min, ptch, pre || []), 0].join('.'); - } else if (patch(from) !== patch(adapted)) { - nextVersion = [maj, min, incrementPatch(ptch, pre || [])].join('.'); - } else if (isStable(from) && isStable(adapted)) { - nextVersion = [maj, min, incrementPatch(ptch, pre || [])].join('.'); - } else { - nextVersion = [maj, min, ptch].join('.'); + switch (diff(from, adapt(to, from))) { + case 'major': + nextVersion = [incrementMajor(maj, min, ptch, pre || []), 0, 0].join('.'); + break; + case 'minor': + nextVersion = [maj, incrementMinor(min, ptch, pre || []), 0].join('.'); + break; + case 'patch': + nextVersion = [maj, min, incrementPatch(ptch, pre || [])].join('.'); + break; + case 'prerelease': + nextVersion = [maj, min, ptch].join('.'); + break; + default: + return incrementLastSegment(from); } return increment(nextVersion, to); @@ -91,31 +73,20 @@ const increment = (from: string, to: string): string => { // istanbul ignore next const decrement = (version: string): string => { - const segments = releaseSegments(version); + const segments = create(version).release().getSegments(); const nextSegments = segments .reverse() - .reduce( - ( - accumulator: number[], - segment: SegmentElement, - index: number - ): number[] => { - if (index === 0) { - return [(segment as number) - 1]; - } - - if (accumulator[index - 1] === -1) { - return [ - ...accumulator.slice(0, index - 1), - 0, - (segment as number) - 1, - ]; - } - - return [...accumulator, segment as number]; - }, - [] - ); + .reduce((accumulator: number[], segment: number, index: number) => { + if (index === 0) { + return [segment - 1]; + } + + if (accumulator[index - 1] === -1) { + return [...accumulator.slice(0, index - 1), 0, segment - 1]; + } + + return [...accumulator, segment]; + }, []); return nextSegments.reverse().join('.'); }; diff --git a/package.json b/package.json index 541a0ddd6cc6eac8c26443a7c3b4e1b182679f0e..c3c5935396200aac6ff952f9d79aa0bf6047742d 100644 --- a/package.json +++ b/package.json @@ -110,8 +110,8 @@ }, "dependencies": { "@renovate/pep440": "0.4.1", - "@renovatebot/ruby-semver": "0.1.4", "@sindresorhus/is": "2.1.0", + "@snyk/ruby-semver": "2.1.0", "@yarnpkg/lockfile": "1.1.0", "aws-sdk": "2.656.0", "azure-devops-node-api": "10.1.1", diff --git a/yarn.lock b/yarn.lock index bc80e79fe538d4d23c1dd64749b86b3643441dc5..44bbf05dc89b1596645805a9956024ca03e77073 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1163,11 +1163,6 @@ dependencies: xregexp "4.2.0" -"@renovatebot/ruby-semver@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@renovatebot/ruby-semver/-/ruby-semver-0.1.4.tgz#adc36fa426f249cffbe005aaa0c86b9e907f2286" - integrity sha512-lM1snOgcu2mJeccOmaFMj2+yCPEdifqfW1alObgNrOgArAGJB1vSH4YgfG41YuOulZX4BwSK/c+2W3XifTYh8g== - "@semantic-release/commit-analyzer@^8.0.0": version "8.0.1" resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz#5d2a37cd5a3312da0e3ac05b1ca348bf60b90bca" @@ -1301,6 +1296,13 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@snyk/ruby-semver@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@snyk/ruby-semver/-/ruby-semver-2.1.0.tgz#d76cc02fc20860c224da2646fe9cc1bb0b0d1d15" + integrity sha512-u8ez8kWyqge+N+FxRDx/uPBmcHzY7BMfODvzEVeoTOeoD0CHPymEaVlkEKA8ZHtxzXjUzPIl2I8f2siZEzLjYg== + dependencies: + lodash "^4.17.14" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"