From c54d0ab69d51ec8898dca46d2eaf3640ffd58ae2 Mon Sep 17 00:00:00 2001
From: Ayoub Kaanich <kayoub5@live.com>
Date: Sun, 3 Jun 2018 17:00:58 +0200
Subject: [PATCH] refactor: add versioning wrapper

---
 lib/datasource/github.js                 |  4 +++-
 lib/manager/buildkite/extract.js         |  4 +++-
 lib/manager/docker/package.js            |  3 ++-
 lib/manager/npm/extract/index.js         |  4 +++-
 lib/manager/travis/package.js            |  7 +++----
 lib/versioning/index.js                  | 14 ++++++++++++++
 test/versioning/index.spec.js            |  8 ++++++++
 test/{util => versioning}/semver.spec.js |  6 +++---
 8 files changed, 39 insertions(+), 11 deletions(-)
 create mode 100644 lib/versioning/index.js
 create mode 100644 test/versioning/index.spec.js
 rename test/{util => versioning}/semver.spec.js (89%)

diff --git a/lib/datasource/github.js b/lib/datasource/github.js
index 518612cd74..25fd0d44ad 100644
--- a/lib/datasource/github.js
+++ b/lib/datasource/github.js
@@ -1,5 +1,7 @@
 const ghGot = require('../platform/github/gh-got-wrapper');
-const { isPinnedVersion } = require('../versioning/semver');
+const versioning = require('../versioning');
+
+const { isPinnedVersion } = versioning('semver');
 
 module.exports = {
   getDependency,
diff --git a/lib/manager/buildkite/extract.js b/lib/manager/buildkite/extract.js
index 45849232e9..ece74e2614 100644
--- a/lib/manager/buildkite/extract.js
+++ b/lib/manager/buildkite/extract.js
@@ -1,4 +1,6 @@
-const { isPinnedVersion } = require('../../versioning/semver');
+const versioning = require('../../versioning');
+
+const { isPinnedVersion } = versioning('semver');
 
 module.exports = {
   extractDependencies,
diff --git a/lib/manager/docker/package.js b/lib/manager/docker/package.js
index 035ae0b885..d0cd360adc 100644
--- a/lib/manager/docker/package.js
+++ b/lib/manager/docker/package.js
@@ -1,4 +1,4 @@
-const { getMajor, isValid } = require('../../versioning/semver');
+const versioning = require('../../versioning');
 const dockerApi = require('../../datasource/docker');
 const compareVersions = require('compare-versions');
 
@@ -18,6 +18,7 @@ async function getPackageUpdates(config) {
     unstablePattern,
     ignoreUnstable,
   } = config;
+  const { getMajor, isValid } = versioning('semver');
   const upgrades = [];
   if (currentDigest || config.pinDigests) {
     logger.debug('Checking docker pinDigests');
diff --git a/lib/manager/npm/extract/index.js b/lib/manager/npm/extract/index.js
index 1d55191f9e..8ee9f7e5a8 100644
--- a/lib/manager/npm/extract/index.js
+++ b/lib/manager/npm/extract/index.js
@@ -3,7 +3,9 @@ const upath = require('upath');
 const { getLockedVersions } = require('./locked-versions');
 const { detectMonorepos } = require('./monorepo');
 const { mightBeABrowserLibrary } = require('./type');
-const semver = require('../../../versioning/semver');
+const versioning = require('../../../versioning');
+
+const semver = versioning('semver');
 
 module.exports = {
   extractDependencies,
diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js
index ff4d4be42f..8cbb8f381f 100644
--- a/lib/manager/travis/package.js
+++ b/lib/manager/travis/package.js
@@ -1,9 +1,8 @@
 const { isEqual } = require('lodash');
 const { getDependency } = require('../../datasource/github');
-const {
-  isPinnedVersion,
-  maxSatisfyingVersion,
-} = require('../../versioning/semver');
+const versioning = require('../../versioning');
+
+const { isPinnedVersion, maxSatisfyingVersion } = versioning('semver');
 
 module.exports = {
   getPackageUpdates,
diff --git a/lib/versioning/index.js b/lib/versioning/index.js
new file mode 100644
index 0000000000..f08f9862e6
--- /dev/null
+++ b/lib/versioning/index.js
@@ -0,0 +1,14 @@
+const semver = require('./semver');
+
+const schemes = {
+  semver,
+};
+
+module.exports = function getVersionScheme(versionScheme) {
+  const scheme = schemes[versionScheme];
+  if (!scheme) {
+    logger.warn({ versionScheme }, 'Unknown verion scheme');
+    return semver;
+  }
+  return scheme;
+};
diff --git a/test/versioning/index.spec.js b/test/versioning/index.spec.js
new file mode 100644
index 0000000000..8dcfd0eb58
--- /dev/null
+++ b/test/versioning/index.spec.js
@@ -0,0 +1,8 @@
+const versioning = require('../../lib/versioning');
+
+describe('versioning(versionScheme)', () => {
+  it('should fallback to semver', () => {
+    expect(versioning(undefined)).toBe(versioning('semver'));
+    expect(versioning('unknown')).toBe(versioning('semver'));
+  });
+});
diff --git a/test/util/semver.spec.js b/test/versioning/semver.spec.js
similarity index 89%
rename from test/util/semver.spec.js
rename to test/versioning/semver.spec.js
index 31aa5babc4..6a6d76ce58 100644
--- a/test/util/semver.spec.js
+++ b/test/versioning/semver.spec.js
@@ -1,6 +1,6 @@
-const semver = require('../../lib/versioning/semver');
+const semver = require('../../lib/versioning')('semver');
 
-describe('.isValid(input)', () => {
+describe('semver.isValid(input)', () => {
   it('should return null for irregular versions', () => {
     expect(!!semver.isValid('17.04.0')).toBe(false);
   });
@@ -26,7 +26,7 @@ describe('.isValid(input)', () => {
     ).toBe(false);
   });
 });
-describe('.isRange(input)', () => {
+describe('semver.isRange(input)', () => {
   it('rejects simple semver', () => {
     expect(!!semver.isRange('1.2.3')).toBe(false);
   });
-- 
GitLab