diff --git a/lib/versioning/semver/index.js b/lib/versioning/semver/index.js index e4328fc92633244eca1f0163c56ceccc46156826..87aa71187016c70432ec33d3c2eb8e61aff44c73 100644 --- a/lib/versioning/semver/index.js +++ b/lib/versioning/semver/index.js @@ -12,6 +12,9 @@ const { satisfies: matches, valid: isPinnedVersion, validRange, + ltr: isLessThanRange, + gt: isGreaterThan, + eq: equals, } = semver; const padRange = range => range + '.0'.repeat(3 - range.split('.').length); @@ -26,17 +29,12 @@ const isRange = input => isValid(input) && !isPinnedVersion(input); // If this is left as an alias, inputs like "17.04.0" throw errors const isValid = input => validRange(input); -const isLessThan = (version, base) => - isPinnedVersion(base) ? semver.lt(version, base) : semver.ltr(version, base); - -const isGreaterThan = (version, base) => - isPinnedVersion(base) ? semver.gt(version, base) : semver.gtr(version, base); - module.exports = { + equals, getMajor, getMinor, isGreaterThan, - isLessThan, + isLessThanRange, isPinnedVersion, isRange, isStable, diff --git a/lib/workers/repository/process/lookup/filter.js b/lib/workers/repository/process/lookup/filter.js index 3a09eff2bf919a108d7f7abd12bf7a712479f4fd..0ead9b86a792c879460788cb03dc25b36456ac07 100644 --- a/lib/workers/repository/process/lookup/filter.js +++ b/lib/workers/repository/process/lookup/filter.js @@ -1,17 +1,19 @@ -const { - getMajor, - isGreaterThan, - isStable, - isValid, - matches, -} = require('../../../../versioning/semver'); +const versioning = require('../../../../versioning'); module.exports = { filterVersions, }; function filterVersions(config, fromVersion, latestVersion, versions) { - const { ignoreUnstable, respectLatest, allowedVersions } = config; + const { + versionScheme, + ignoreUnstable, + respectLatest, + allowedVersions, + } = config; + const { getMajor, isGreaterThan, isStable, isValid, matches } = versioning( + versionScheme + ); if (!fromVersion) { return []; } diff --git a/lib/workers/repository/process/lookup/index.js b/lib/workers/repository/process/lookup/index.js index 2e42480f44cdec81a1cf7bca2b24e692fec16abb..33f5a8dd4053455d5f0c9c747626c680a7da8582 100644 --- a/lib/workers/repository/process/lookup/index.js +++ b/lib/workers/repository/process/lookup/index.js @@ -1,4 +1,4 @@ -const versioning = require('../../../../versioning/semver'); +const versioning = require('../../../../versioning'); const moment = require('moment'); const { getRollbackUpdate } = require('./rollback'); const { getRangeStrategy } = require('../../../../manager'); @@ -7,23 +7,20 @@ const npmApi = require('../../../../datasource/npm'); const github = require('../../../../datasource/github'); const { parse } = require('../../../../../lib/util/purl'); -const { - getMajor, - getMinor, - isGreaterThan, - isRange, - matches, - maxSatisfyingVersion, - minSatisfyingVersion, - rangify, -} = versioning; - module.exports = { lookupUpdates, }; async function lookupUpdates(config) { - const { depName, currentVersion, lockedVersion } = config; + const { versionScheme, depName, currentVersion, lockedVersion } = config; + const { + getMajor, + getMinor, + isGreaterThan, + isRange, + matches, + rangify, + } = versioning(versionScheme); logger.debug({ depName, currentVersion }, 'lookupUpdates'); let dependency; const purl = parse(config.purl); @@ -77,6 +74,7 @@ async function lookupUpdates(config) { } const rangeStrategy = getRangeStrategy(config); const fromVersion = getFromVersion( + config, currentVersion, rangeStrategy, lockedVersion, @@ -143,6 +141,8 @@ async function lookupUpdates(config) { } function getType(config, fromVersion, toVersion) { + const { versionScheme } = config; + const { getMajor, getMinor } = versioning(versionScheme); if (getMajor(toVersion) > getMajor(fromVersion)) { return 'major'; } @@ -176,11 +176,16 @@ function getBucket(config, update) { } function getFromVersion( + config, currentVersion, rangeStrategy, lockedVersion, allVersions ) { + const { versionScheme } = config; + const { isRange, maxSatisfyingVersion, minSatisfyingVersion } = versioning( + versionScheme + ); if (!isRange(currentVersion)) { return currentVersion; } diff --git a/lib/workers/repository/process/lookup/rollback.js b/lib/workers/repository/process/lookup/rollback.js index baf41cc2be72ef7364edd291005e68fc9c5630bc..ee3b99b6e742b981a26c0f21f44da4a7802e5b9b 100644 --- a/lib/workers/repository/process/lookup/rollback.js +++ b/lib/workers/repository/process/lookup/rollback.js @@ -1,18 +1,24 @@ -const { - getMajor, - isLessThan, - rangify, - sortVersions, -} = require('../../../../versioning/semver'); +const versioning = require('../../../../versioning'); module.exports = { getRollbackUpdate, }; function getRollbackUpdate(config, versions) { - const { packageFile, depName, currentVersion } = config; + const { packageFile, versionScheme, depName, currentVersion } = config; + const { getMajor, isLessThanRange, rangify, sortVersions } = versioning( + versionScheme + ); + // istanbul ignore if + if (!isLessThanRange) { + logger.info( + { versionScheme }, + 'Current version scheme does not suppot isLessThanRange()' + ); + return []; + } const lessThanVersions = versions.filter(version => - isLessThan(version, currentVersion) + isLessThanRange(version, currentVersion) ); // istanbul ignore if if (!lessThanVersions.length) { diff --git a/test/workers/branch/lock-files/__snapshots__/index.spec.js.snap b/test/workers/branch/lock-files/__snapshots__/index.spec.js.snap index 8cc701bba7684051cc3202c6dbb318c10bc5044b..308642846fe6b26c48968704cc946cfcbfcadd7e 100644 --- a/test/workers/branch/lock-files/__snapshots__/index.spec.js.snap +++ b/test/workers/branch/lock-files/__snapshots__/index.spec.js.snap @@ -13,17 +13,3 @@ Object { "updatedLockFiles": Array [], } `; - -exports[`manager/npm/post-update getAdditionalFiles returns no error and empty lockfiles if lock file maintenance exists 1`] = ` -Object { - "lockFileErrors": Array [], - "updatedLockFiles": Array [], -} -`; - -exports[`manager/npm/post-update getAdditionalFiles returns no error and empty lockfiles if updateLockFiles false 1`] = ` -Object { - "lockFileErrors": Array [], - "updatedLockFiles": Array [], -} -`; diff --git a/test/workers/repository/process/lookup/__snapshots__/index.spec.js.snap b/test/workers/repository/process/lookup/__snapshots__/index.spec.js.snap index 17a00d99069053a7ac6834dd381969dc9502b8cb..301e79ade45bfaccdfbd4d0e852d36f2cfeacb8c 100644 --- a/test/workers/repository/process/lookup/__snapshots__/index.spec.js.snap +++ b/test/workers/repository/process/lookup/__snapshots__/index.spec.js.snap @@ -38,6 +38,39 @@ Array [ ] `; +exports[`manager/npm/lookup .lookupUpdates() handles PEP440 1`] = ` +Array [ + Object { + "isPin": true, + "newVersion": "0.9.4", + "newVersionMajor": 0, + "repositoryUrl": "https://github.com/kriskowal/q", + "type": "pin", + "unpublishable": false, + }, + Object { + "fromVersion": "0.9.4", + "newVersion": "0.9.7", + "newVersionMajor": 0, + "newVersionMinor": 9, + "repositoryUrl": "https://github.com/kriskowal/q", + "toVersion": "0.9.7", + "type": "minor", + "unpublishable": false, + }, + Object { + "fromVersion": "0.9.4", + "newVersion": "1.4.1", + "newVersionMajor": 1, + "newVersionMinor": 4, + "repositoryUrl": "https://github.com/kriskowal/q", + "toVersion": "1.4.1", + "type": "major", + "unpublishable": false, + }, +] +`; + exports[`manager/npm/lookup .lookupUpdates() handles github 404 1`] = ` Array [ Object { diff --git a/test/workers/repository/process/lookup/index.spec.js b/test/workers/repository/process/lookup/index.spec.js index 4083507580819a8351ea9f66c1678cb9cf053d32..07f8ec837ec77b5edcad6e142b8b81869e3a1cb5 100644 --- a/test/workers/repository/process/lookup/index.spec.js +++ b/test/workers/repository/process/lookup/index.spec.js @@ -810,5 +810,20 @@ describe('manager/npm/lookup', () => { config.currentVersion = '1.0.0'; expect(await lookup.lookupUpdates(config)).toMatchSnapshot(); }); + it('handles PEP440', async () => { + config.manager = 'pip_requirements'; + config.versionScheme = 'pep440'; + config.rangeStrategy = 'pin'; + config.lockedVersion = '0.9.4'; + config.currentVersion = '~=0.9'; + config.depName = 'q'; + // TODO: we are using npm as source, since purl for pypi is not implimented + config.purl = 'pkg:npm/q'; + nock('https://registry.npmjs.org') + .get('/q') + .reply(200, qJson); + const res = await lookup.lookupUpdates(config); + expect(res).toMatchSnapshot(); + }); }); });