From ec53ef78e92181a3282778cc10f0cd49c341bbd8 Mon Sep 17 00:00:00 2001
From: Ayoub Kaanich <kayoub5@live.com>
Date: Sun, 3 Jun 2018 18:08:15 +0200
Subject: [PATCH] refactor: lookup use versioning wrapper

---
 lib/versioning/semver/index.js                | 12 +++----
 .../repository/process/lookup/filter.js       | 18 +++++-----
 .../repository/process/lookup/index.js        | 31 +++++++++--------
 .../repository/process/lookup/rollback.js     | 22 ++++++++-----
 .../__snapshots__/index.spec.js.snap          | 14 --------
 .../lookup/__snapshots__/index.spec.js.snap   | 33 +++++++++++++++++++
 .../repository/process/lookup/index.spec.js   | 15 +++++++++
 7 files changed, 95 insertions(+), 50 deletions(-)

diff --git a/lib/versioning/semver/index.js b/lib/versioning/semver/index.js
index e4328fc926..87aa711870 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 3a09eff2bf..0ead9b86a7 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 2e42480f44..33f5a8dd40 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 baf41cc2be..ee3b99b6e7 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 8cc701bba7..308642846f 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 17a00d9906..301e79ade4 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 4083507580..07f8ec837e 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();
+    });
   });
 });
-- 
GitLab