From 485f66914ef60ef3f74e30d87cb06fedfe5b609b Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 18 Feb 2020 08:34:10 +0100
Subject: [PATCH] feat: versionScheme -> versioning (#5504)

---
 docs/development/adding-a-package-manager.md  |  2 +-
 docs/usage/configuration-options.md           |  6 +-
 docs/usage/docker.md                          | 10 ++--
 lib/config/definitions.ts                     | 22 ++++----
 lib/config/migration.ts                       |  4 ++
 lib/constants/version-schemes.ts              | 18 ------
 lib/datasource/common.ts                      |  2 +-
 lib/datasource/github/index.ts                |  2 +-
 lib/datasource/index.ts                       | 14 ++---
 lib/datasource/maven/index.spec.ts            |  4 +-
 lib/datasource/packagist/index.spec.ts        |  4 +-
 lib/datasource/sbt/index.spec.ts              | 14 ++---
 .../__snapshots__/extract.spec.ts.snap        | 26 ++++-----
 lib/manager/ansible/extract.ts                |  4 +-
 .../bazel/__snapshots__/extract.spec.ts.snap  |  2 +-
 lib/manager/bazel/extract.ts                  |  4 +-
 lib/manager/bundler/index.ts                  |  4 +-
 lib/manager/cargo/index.ts                    |  4 +-
 lib/manager/cdnurl/index.ts                   |  4 +-
 .../__snapshots__/extract.spec.ts.snap        |  6 +-
 lib/manager/circleci/extract.ts               |  4 +-
 lib/manager/common.ts                         |  4 +-
 lib/manager/composer/index.ts                 |  4 +-
 lib/manager/deps-edn/index.ts                 |  4 +-
 lib/manager/git-submodules/index.ts           |  4 +-
 .../__snapshots__/extract.spec.ts.snap        |  8 +--
 lib/manager/github-actions/extract.ts         |  4 +-
 .../__snapshots__/extract.spec.ts.snap        |  4 +-
 lib/manager/gradle-wrapper/extract.ts         |  4 +-
 lib/manager/gradle/index.ts                   |  4 +-
 lib/manager/html/index.ts                     |  4 +-
 lib/manager/leiningen/index.ts                |  4 +-
 lib/manager/maven/index.ts                    |  4 +-
 lib/manager/mix/index.ts                      |  4 +-
 .../extract/__snapshots__/index.spec.ts.snap  | 10 ++--
 lib/manager/npm/extract/index.ts              |  6 +-
 lib/manager/npm/index.ts                      |  4 +-
 lib/manager/nuget/extract.ts                  |  4 +-
 lib/manager/nvm/index.ts                      |  4 +-
 lib/manager/poetry/index.ts                   |  4 +-
 lib/manager/pub/index.ts                      |  4 +-
 lib/manager/ruby-version/index.ts             |  4 +-
 lib/manager/sbt/extract.ts                    |  4 +-
 lib/manager/sbt/index.ts                      |  4 +-
 lib/manager/swift/index.ts                    |  4 +-
 lib/manager/terraform/index.ts                |  4 +-
 lib/manager/travis/index.ts                   |  4 +-
 lib/util/package-rules.ts                     |  8 +--
 lib/versioning/cargo/index.ts                 |  1 +
 lib/versioning/composer/index.ts              |  1 +
 lib/versioning/docker/index.ts                |  1 +
 lib/versioning/git/index.ts                   |  1 +
 lib/versioning/hashicorp/index.ts             |  1 +
 lib/versioning/hex/index.ts                   |  1 +
 lib/versioning/index.ts                       | 55 ++++++++++---------
 lib/versioning/ivy/index.ts                   |  1 +
 lib/versioning/loose/index.ts                 |  1 +
 lib/versioning/maven/index.ts                 |  1 +
 lib/versioning/node/index.ts                  |  1 +
 lib/versioning/npm/index.ts                   |  1 +
 lib/versioning/nuget/index.ts                 |  1 +
 lib/versioning/nuget/readme.md                |  2 +-
 lib/versioning/pep440/index.ts                |  1 +
 lib/versioning/poetry/index.ts                |  1 +
 lib/versioning/regex/index.ts                 |  5 +-
 lib/versioning/regex/readme.md                |  4 +-
 lib/versioning/ruby/index.ts                  |  1 +
 lib/versioning/semver/index.ts                |  1 +
 lib/versioning/swift/index.ts                 |  1 +
 lib/workers/pr/body/common.ts                 |  2 +-
 lib/workers/pr/body/index.ts                  |  4 +-
 lib/workers/pr/changelog/common.ts            |  2 +-
 lib/workers/pr/changelog/index.ts             |  6 +-
 lib/workers/pr/changelog/releases.ts          |  4 +-
 lib/workers/pr/changelog/source-github.ts     | 10 ++--
 lib/workers/repository/init/vulnerability.ts  | 29 +++++-----
 .../repository/process/lookup/filter.ts       | 12 ++--
 .../repository/process/lookup/index.ts        | 14 ++---
 .../repository/process/lookup/rollback.ts     | 12 ++--
 .../__snapshots__/migration.spec.ts.snap      |  9 +++
 test/config/migration.spec.ts                 |  9 ++-
 .../__snapshots__/index.spec.ts.snap          |  2 +-
 test/versioning/index.spec.ts                 | 30 +++++-----
 test/versioning/versioning-metadata.spec.ts   | 38 +++++++++++++
 test/versioning/versioning-readmes.spec.ts    | 37 -------------
 test/workers/pr/changelog/index.spec.ts       |  4 +-
 test/workers/pr/changelog/releases.spec.ts    | 16 +++---
 .../repository/process/lookup/index.spec.ts   | 22 ++++----
 88 files changed, 323 insertions(+), 306 deletions(-)
 delete mode 100644 lib/constants/version-schemes.ts
 create mode 100644 test/versioning/versioning-metadata.spec.ts
 delete mode 100644 test/versioning/versioning-readmes.spec.ts

diff --git a/docs/development/adding-a-package-manager.md b/docs/development/adding-a-package-manager.md
index 6094a9ddc0..49d1abfbed 100644
--- a/docs/development/adding-a-package-manager.md
+++ b/docs/development/adding-a-package-manager.md
@@ -35,7 +35,7 @@ This function is mandatory unless you use `extractAllPackageFiles` instead. It t
 - dependency name
 - dependency type (e.g. dependencies, devDependencies, etc)
 - currentValue
-- version scheme used (e.g. semver, pep440)
+- versioning used (e.g. semver, pep440)
 
 The fields returned here can be customised to suit the package manager, e.g. Dockerfile uses `lineNumber`. Custom fields should be added within a `managerData` object.
 
diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index bec28a07a2..db869706d5 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -1571,11 +1571,11 @@ When schedules are in use, it generally means "no updates". However there are ca
 
 This defaults to `true`, meaning that Renovate will perform certain "desirable" updates to _existing_ PRs even when outside of schedule. If you wish to disable all updates outside of scheduled hours then configure this field to `false`.
 
-## versionScheme
+## versioning
 
-Usually, each language or package manager has a specific type of "version scheme". e.g. JavaScript uses npm's semver implementation, Python uses pep440, etc. At Renovate we have also implemented some of our own, such as `"docker"` to address the most common way people tag versions using Docker, and `"loose"` as a fallback that tries semver first but otherwise just does its best to sort and compare.
+Usually, each language or package manager has a specific type of "versioning". e.g. JavaScript uses npm's semver implementation, Python uses pep440, etc. At Renovate we have also implemented some of our own, such as `"docker"` to address the most common way people tag versions using Docker, and `"loose"` as a fallback that tries semver first but otherwise just does its best to sort and compare.
 
-By exposing `versionScheme` to config, it allows you to override the default version scheme for a package manager if you really need. In most cases it would not be recommended, but there are some cases such as Docker or Gradle where versioning is not strictly defined and you may need to specify the versioning type per-package.
+By exposing `versioning` to config, it allows you to override the default versioning for a package manager if you really need. In most cases it would not be recommended, but there are some cases such as Docker or Gradle where versioning is not strictly defined and you may need to specify the versioning type per-package.
 
 ## vulnerabilityAlerts
 
diff --git a/docs/usage/docker.md b/docs/usage/docker.md
index a3e14ea370..09501b11af 100644
--- a/docs/usage/docker.md
+++ b/docs/usage/docker.md
@@ -27,7 +27,7 @@ Renovate by default will preserve the precision of Docker images. For example if
 
 Although suffixes in semver indicate pre-releases (e.g. `v1.2.0-alpha.2`), in Docker they typically indicate compatibility, e.g. `12.2.0-alpine`. Renovate defaults to assuming suffixes indicate compatibility so will never _change_ it. e.g. `12.1.0-alpine` might get updated to `12.1.1-alpine` but never `12.1.1` or `12.1.1-stretch`.
 
-If this behaviour does not suit a particular package you have, Renovate allows you to customize the `versionScheme` in use. For example, if you have a Docker image `foo/bar` that sticks to semver versioning and you need Renovate to understand that suffixes indicate pre-releases versions and not compatibility, then you could configure this package rule:
+If this behaviour does not suit a particular package you have, Renovate allows you to customize the `versioning` in use. For example, if you have a Docker image `foo/bar` that sticks to semver versioning and you need Renovate to understand that suffixes indicate pre-releases versions and not compatibility, then you could configure this package rule:
 
 ```json
 {
@@ -35,7 +35,7 @@ If this behaviour does not suit a particular package you have, Renovate allows y
     {
       "datasources": ["docker"],
       "packageNames": ["foo/bar"],
-      "versionScheme": "semver"
+      "versioning": "semver"
     }
   ]
 }
@@ -49,15 +49,15 @@ Another example is the official `python` image, which follows `pep440` versionin
     {
       "datasources": ["docker"],
       "packageNames": ["python"],
-      "versionScheme": "pep440"
+      "versioning": "pep440"
     }
   ]
 }
 ```
 
-If traditional versioning doesn't work, consider using Renovate's built-in `loose` `versionScheme`. It essentially just does a best effort sort of versions, regardless of whether they contain letters or digits.
+If traditional versioning doesn't work, consider using Renovate's built-in `loose` `versioning`. It essentially just does a best effort sort of versions, regardless of whether they contain letters or digits.
 
-Finally, if you use a Docker image that follows a versioning approach not captured by one of our existing version schemes, and which `loose` sorts incorrectly, you could see if the `regex` `versionScheme` can work. It uses regex capture group syntax to let you specify which part of the version string is major, minor, patch, pre-release, or compatibility. See the docs for `versionScheme` for documentation/examples of `regex` versioning in action.
+Finally, if you use a Docker image that follows a versioning approach not captured by one of our existing versionings, and which `loose` sorts incorrectly, you could see if the `regex` `versioning` can work. It uses regex capture group syntax to let you specify which part of the version string is major, minor, patch, pre-release, or compatibility. See the docs for `versioning` for documentation/examples of `regex` versioning in action.
 
 ## Digest Pinning
 
diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts
index 1fd1401c97..ff4dd29577 100644
--- a/lib/config/definitions.ts
+++ b/lib/config/definitions.ts
@@ -1,10 +1,8 @@
 import { RenovateConfigStage } from './common';
-import {
-  VERSION_SCHEME_DOCKER,
-  VERSION_SCHEME_PEP440,
-  VERSION_SCHEME_SEMVER,
-} from '../constants/version-schemes';
-import { getVersionSchemeList } from '../versioning';
+import * as dockerVersioning from '../versioning/docker';
+import * as pep440Versioning from '../versioning/pep440';
+import * as semverVersioning from '../versioning/semver';
+import { getVersioningList } from '../versioning';
 import { PLATFORM_TYPE_GITHUB } from '../constants/platforms';
 import { platformList } from '../platform';
 
@@ -633,11 +631,11 @@ const options: RenovateOptions[] = [
     env: false,
   },
   {
-    name: 'versionScheme',
-    description: 'Version scheme to use for filtering and comparisons',
+    name: 'versioning',
+    description: 'versioning to use for filtering and comparisons',
     type: 'string',
-    allowedValues: getVersionSchemeList(),
-    default: VERSION_SCHEME_SEMVER,
+    allowedValues: getVersioningList(),
+    default: semverVersioning.id,
     cli: false,
     env: false,
   },
@@ -1462,7 +1460,7 @@ const options: RenovateOptions[] = [
     stage: 'package',
     type: 'object',
     default: {
-      versionScheme: VERSION_SCHEME_DOCKER,
+      versioning: dockerVersioning.id,
       managerBranchPrefix: 'docker-',
       commitMessageTopic: '{{{depName}}} Docker tag',
       major: { enabled: false },
@@ -1508,7 +1506,7 @@ const options: RenovateOptions[] = [
     stage: 'package',
     type: 'object',
     default: {
-      versionScheme: VERSION_SCHEME_PEP440,
+      versioning: pep440Versioning.id,
     },
     mergeable: true,
     cli: false,
diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index 9f79785b44..da3affa5e4 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -173,6 +173,10 @@ export function migrateConfig(
             migratedConfig.extends[i] = 'config:js-lib';
           }
         }
+      } else if (key === 'versionScheme') {
+        isMigrated = true;
+        migratedConfig.versioning = val;
+        delete migratedConfig.versionScheme;
       } else if (
         key === 'automergeType' &&
         is.string(val) &&
diff --git a/lib/constants/version-schemes.ts b/lib/constants/version-schemes.ts
deleted file mode 100644
index 94f18183d7..0000000000
--- a/lib/constants/version-schemes.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-export const VERSION_SCHEME_SEMVER = 'semver';
-export const VERSION_SCHEME_NPM = 'npm';
-export const VERSION_SCHEME_NODE = 'node';
-export const VERSION_SCHEME_HASHICORP = 'hashicorp';
-export const VERSION_SCHEME_COMPOSER = 'composer';
-export const VERSION_SCHEME_GIT = 'git';
-export const VERSION_SCHEME_POETRY = 'poetry';
-export const VERSION_SCHEME_MAVEN = 'maven';
-export const VERSION_SCHEME_SWIFT = 'swift';
-export const VERSION_SCHEME_RUBY = 'ruby';
-export const VERSION_SCHEME_HEX = 'hex';
-export const VERSION_SCHEME_CARGO = 'cargo';
-export const VERSION_SCHEME_DOCKER = 'docker';
-export const VERSION_SCHEME_PEP440 = 'pep440';
-export const VERSION_SCHEME_IVY = 'ivy';
-export const VERSION_SCHEME_LOOSE = 'loose';
-export const VERSION_SCHEME_NUGET = 'nuget';
-export const VERSION_SCHEME_REGEX = 'regex';
diff --git a/lib/datasource/common.ts b/lib/datasource/common.ts
index b5710d79a6..e97b71b71e 100644
--- a/lib/datasource/common.ts
+++ b/lib/datasource/common.ts
@@ -11,7 +11,7 @@ export interface PkgReleaseConfig extends Config {
   depType?: string;
   lookupType?: string;
   npmrc?: string;
-  versionScheme?: string;
+  versioning?: string;
 }
 
 export type DigestConfig = Config;
diff --git a/lib/datasource/github/index.ts b/lib/datasource/github/index.ts
index f653f7a52e..5ed65e1723 100644
--- a/lib/datasource/github/index.ts
+++ b/lib/datasource/github/index.ts
@@ -162,7 +162,7 @@ export async function getDigest(
 /**
  * github.getPkgReleases
  *
- * This function can be used to fetch releases with a customisable version scheme (e.g. semver) and with either tags or releases.
+ * This function can be used to fetch releases with a customisable versioning (e.g. semver) and with either tags or releases.
  *
  * This function will:
  *  - Fetch all tags or releases (depending on configuration)
diff --git a/lib/datasource/index.ts b/lib/datasource/index.ts
index a8773e176a..20d5aad7b5 100644
--- a/lib/datasource/index.ts
+++ b/lib/datasource/index.ts
@@ -1,6 +1,6 @@
 import { logger } from '../logger';
 import { addMetaData } from './metadata';
-import * as versioning from '../versioning';
+import * as allVersioning from '../versioning';
 
 import {
   Datasource,
@@ -10,7 +10,7 @@ import {
   ReleaseResult,
   DigestConfig,
 } from './common';
-import { VERSION_SCHEME_SEMVER } from '../constants/version-schemes';
+import * as semverVersioning from '../versioning/semver';
 import { loadModules } from '../util/modules';
 
 export * from './common';
@@ -73,12 +73,10 @@ export async function getPkgReleases(
   if (!res) {
     return res;
   }
-  const versionScheme =
-    config && config.versionScheme
-      ? config.versionScheme
-      : VERSION_SCHEME_SEMVER;
-  // Filter by version scheme
-  const version = versioning.get(versionScheme);
+  const versioning =
+    config && config.versioning ? config.versioning : semverVersioning.id;
+  // Filter by versioning
+  const version = allVersioning.get(versioning);
   // Return a sorted list of valid Versions
   function sortReleases(release1: Release, release2: Release): number {
     return version.sortVersions(release1.version, release2.version);
diff --git a/lib/datasource/maven/index.spec.ts b/lib/datasource/maven/index.spec.ts
index 05a0658cea..3b348fd659 100644
--- a/lib/datasource/maven/index.spec.ts
+++ b/lib/datasource/maven/index.spec.ts
@@ -3,7 +3,7 @@ import fs from 'fs';
 import { resolve } from 'path';
 import * as datasource from '..';
 import { DATASOURCE_FAILURE } from '../../constants/error-messages';
-import { VERSION_SCHEME_LOOSE } from '../../constants/version-schemes';
+import * as looseVersioning from '../../versioning/loose';
 import { DATASOURCE_MAVEN } from '../../constants/data-binary-source';
 import * as hostRules from '../../util/host-rules';
 
@@ -34,7 +34,7 @@ const MYSQL_MAVEN_MYSQL_POM = fs.readFileSync(
 );
 
 const config = {
-  versionScheme: VERSION_SCHEME_LOOSE,
+  versioning: looseVersioning.id,
   datasource: DATASOURCE_MAVEN,
 };
 
diff --git a/lib/datasource/packagist/index.spec.ts b/lib/datasource/packagist/index.spec.ts
index 23fa3177bf..6fe97f860c 100644
--- a/lib/datasource/packagist/index.spec.ts
+++ b/lib/datasource/packagist/index.spec.ts
@@ -2,7 +2,7 @@ import fs from 'fs';
 import _got from '../../util/got';
 import * as datasource from '..';
 import * as _hostRules from '../../util/host-rules';
-import { VERSION_SCHEME_COMPOSER } from '../../constants/version-schemes';
+import * as composerVersioning from '../../versioning/composer';
 import { DATASOURCE_PACKAGIST } from '../../constants/data-binary-source';
 
 jest.mock('../../util/got');
@@ -30,7 +30,7 @@ describe('datasource/packagist', () => {
       hostRules.hosts = jest.fn(() => []);
       global.repoCache = {};
       config = {
-        versionScheme: VERSION_SCHEME_COMPOSER,
+        versioning: composerVersioning.id,
         datasource: DATASOURCE_PACKAGIST,
         registryUrls: [
           'https://composer.renovatebot.com',
diff --git a/lib/datasource/sbt/index.spec.ts b/lib/datasource/sbt/index.spec.ts
index 2908ba9c82..56846cc4bf 100644
--- a/lib/datasource/sbt/index.spec.ts
+++ b/lib/datasource/sbt/index.spec.ts
@@ -4,7 +4,7 @@ import nock from 'nock';
 import { getPkgReleases } from '.';
 import { DEFAULT_MAVEN_REPO } from '../../manager/maven/extract';
 import { parseIndexDir, SBT_PLUGINS_REPO } from './util';
-import { VERSION_SCHEME_IVY } from '../../constants/version-schemes';
+import * as ivyVersioning from '../../versioning/ivy';
 import { DATASOURCE_SBT } from '../../constants/data-binary-source';
 
 const mavenIndexHtml = fs.readFileSync(
@@ -101,7 +101,7 @@ describe('datasource/sbt', () => {
     it('returns null in case of errors', async () => {
       expect(
         await getPkgReleases({
-          versionScheme: VERSION_SCHEME_IVY,
+          versioning: ivyVersioning.id,
           datasource: DATASOURCE_SBT,
           lookupName: 'org.scalatest:scalatest',
           registryUrls: ['https://failed_repo/maven'],
@@ -109,7 +109,7 @@ describe('datasource/sbt', () => {
       ).toEqual(null);
       expect(
         await getPkgReleases({
-          versionScheme: VERSION_SCHEME_IVY,
+          versioning: ivyVersioning.id,
           datasource: DATASOURCE_SBT,
           lookupName: 'org.scalatest:scalaz',
           depType: 'plugin',
@@ -120,7 +120,7 @@ describe('datasource/sbt', () => {
     it('fetches releases from Maven', async () => {
       expect(
         await getPkgReleases({
-          versionScheme: VERSION_SCHEME_IVY,
+          versioning: ivyVersioning.id,
           datasource: DATASOURCE_SBT,
           lookupName: 'org.scalatest:scalatest',
           registryUrls: [
@@ -138,7 +138,7 @@ describe('datasource/sbt', () => {
       });
       expect(
         await getPkgReleases({
-          versionScheme: VERSION_SCHEME_IVY,
+          versioning: ivyVersioning.id,
           datasource: DATASOURCE_SBT,
           lookupName: 'org.scalatest:scalatest_2.12',
           registryUrls: [DEFAULT_MAVEN_REPO, SBT_PLUGINS_REPO],
@@ -154,7 +154,7 @@ describe('datasource/sbt', () => {
     it('fetches sbt plugins', async () => {
       expect(
         await getPkgReleases({
-          versionScheme: VERSION_SCHEME_IVY,
+          versioning: ivyVersioning.id,
           datasource: DATASOURCE_SBT,
           lookupName: 'org.foundweekends:sbt-bintray',
           depType: 'plugin',
@@ -170,7 +170,7 @@ describe('datasource/sbt', () => {
       });
       expect(
         await getPkgReleases({
-          versionScheme: VERSION_SCHEME_IVY,
+          versioning: ivyVersioning.id,
           datasource: DATASOURCE_SBT,
           lookupName: 'org.foundweekends:sbt-bintray_2.12',
           depType: 'plugin',
diff --git a/lib/manager/ansible/__snapshots__/extract.spec.ts.snap b/lib/manager/ansible/__snapshots__/extract.spec.ts.snap
index e4abe9090d..debebba8a8 100644
--- a/lib/manager/ansible/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/ansible/__snapshots__/extract.spec.ts.snap
@@ -10,7 +10,7 @@ Array [
     "managerData": Object {
       "lineNumber": 4,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -20,7 +20,7 @@ Array [
     "managerData": Object {
       "lineNumber": 11,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -30,7 +30,7 @@ Array [
     "managerData": Object {
       "lineNumber": 23,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -40,7 +40,7 @@ Array [
     "managerData": Object {
       "lineNumber": 40,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -50,7 +50,7 @@ Array [
     "managerData": Object {
       "lineNumber": 52,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -60,7 +60,7 @@ Array [
     "managerData": Object {
       "lineNumber": 64,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -70,7 +70,7 @@ Array [
     "managerData": Object {
       "lineNumber": 76,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -80,7 +80,7 @@ Array [
     "managerData": Object {
       "lineNumber": 83,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -90,7 +90,7 @@ Array [
     "managerData": Object {
       "lineNumber": 96,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
 ]
 `;
@@ -105,7 +105,7 @@ Array [
     "managerData": Object {
       "lineNumber": 8,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -115,7 +115,7 @@ Array [
     "managerData": Object {
       "lineNumber": 30,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -125,7 +125,7 @@ Array [
     "managerData": Object {
       "lineNumber": 38,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "currentDigest": undefined,
@@ -135,7 +135,7 @@ Array [
     "managerData": Object {
       "lineNumber": 43,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
 ]
 `;
diff --git a/lib/manager/ansible/extract.ts b/lib/manager/ansible/extract.ts
index fa71966b0e..c871fa818b 100644
--- a/lib/manager/ansible/extract.ts
+++ b/lib/manager/ansible/extract.ts
@@ -1,7 +1,7 @@
 import { logger } from '../../logger';
 import { getDep } from '../dockerfile/extract';
 import { PackageFile, PackageDependency } from '../common';
-import { VERSION_SCHEME_DOCKER } from '../../constants/version-schemes';
+import * as dockerVersioning from '../../versioning/docker';
 
 export default function extractPackageFile(
   content: string
@@ -24,7 +24,7 @@ export default function extractPackageFile(
         'Docker image inside ansible'
       );
       dep.managerData = { lineNumber };
-      dep.versionScheme = VERSION_SCHEME_DOCKER;
+      dep.versioning = dockerVersioning.id;
       deps.push(dep);
     }
     lineNumber += 1;
diff --git a/lib/manager/bazel/__snapshots__/extract.spec.ts.snap b/lib/manager/bazel/__snapshots__/extract.spec.ts.snap
index aa3cb84c8a..906bc60e00 100644
--- a/lib/manager/bazel/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/bazel/__snapshots__/extract.spec.ts.snap
@@ -19,7 +19,7 @@ Array [
           tag=\\"v1.0.0-alpha31.cli-migrations\\"
         )",
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
 ]
 `;
diff --git a/lib/manager/bazel/extract.ts b/lib/manager/bazel/extract.ts
index ac9182d78c..1dd0cfe249 100644
--- a/lib/manager/bazel/extract.ts
+++ b/lib/manager/bazel/extract.ts
@@ -4,7 +4,7 @@ import { parse as _parse } from 'url';
 import { logger } from '../../logger';
 import { PackageDependency, PackageFile } from '../common';
 import { regEx } from '../../util/regex';
-import { VERSION_SCHEME_DOCKER } from '../../constants/version-schemes';
+import * as dockerVersioning from '../../versioning/docker';
 import {
   DATASOURCE_DOCKER,
   DATASOURCE_GITHUB,
@@ -242,7 +242,7 @@ export function extractPackageFile(content: string): PackageFile | null {
       dep.currentDigest = digest;
       dep.currentValue = currentValue;
       dep.depName = depName;
-      dep.versionScheme = VERSION_SCHEME_DOCKER;
+      dep.versioning = dockerVersioning.id;
       dep.datasource = DATASOURCE_DOCKER;
       dep.lookupName = repository;
       deps.push(dep);
diff --git a/lib/manager/bundler/index.ts b/lib/manager/bundler/index.ts
index 1d5ae7812d..d94aecf09e 100644
--- a/lib/manager/bundler/index.ts
+++ b/lib/manager/bundler/index.ts
@@ -3,7 +3,7 @@ import { updateDependency } from './update';
 import { updateArtifacts } from './artifacts';
 import { getRangeStrategy } from './range';
 import { LANGUAGE_RUBY } from '../../constants/languages';
-import { VERSION_SCHEME_RUBY } from '../../constants/version-schemes';
+import * as rubyVersioning from '../../versioning/ruby';
 
 const language = LANGUAGE_RUBY;
 
@@ -22,5 +22,5 @@ export {
 
 export const defaultConfig = {
   fileMatch: ['(^|/)Gemfile$'],
-  versionScheme: VERSION_SCHEME_RUBY,
+  versioning: rubyVersioning.id,
 };
diff --git a/lib/manager/cargo/index.ts b/lib/manager/cargo/index.ts
index 52fd710fca..8f67566d64 100644
--- a/lib/manager/cargo/index.ts
+++ b/lib/manager/cargo/index.ts
@@ -2,7 +2,7 @@ import { extractPackageFile } from './extract';
 import { updateDependency } from './update';
 import { updateArtifacts } from './artifacts';
 import { LANGUAGE_RUST } from '../../constants/languages';
-import { VERSION_SCHEME_CARGO } from '../../constants/version-schemes';
+import * as cargoVersioning from '../../versioning/cargo';
 
 const language = LANGUAGE_RUST;
 // TODO: Support this
@@ -14,6 +14,6 @@ export const defaultConfig = {
   commitMessageTopic: 'Rust crate {{depName}}',
   managerBranchPrefix: 'rust-',
   fileMatch: ['(^|/)Cargo.toml$'],
-  versionScheme: VERSION_SCHEME_CARGO,
+  versioning: cargoVersioning.id,
   rangeStrategy: 'bump',
 };
diff --git a/lib/manager/cdnurl/index.ts b/lib/manager/cdnurl/index.ts
index a067cdf276..96ebfa3c27 100644
--- a/lib/manager/cdnurl/index.ts
+++ b/lib/manager/cdnurl/index.ts
@@ -1,4 +1,4 @@
-import { VERSION_SCHEME_SEMVER } from '../../constants/version-schemes';
+import * as semverVersioning from '../../versioning/semver';
 import { extractPackageFile } from './extract';
 import { updateDependency } from './update';
 
@@ -6,5 +6,5 @@ export { extractPackageFile, updateDependency };
 
 export const defaultConfig = {
   fileMatch: [],
-  versionScheme: VERSION_SCHEME_SEMVER,
+  versioning: semverVersioning.id,
 };
diff --git a/lib/manager/circleci/__snapshots__/extract.spec.ts.snap b/lib/manager/circleci/__snapshots__/extract.spec.ts.snap
index 32a715ab19..d9dc36298d 100644
--- a/lib/manager/circleci/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/circleci/__snapshots__/extract.spec.ts.snap
@@ -62,7 +62,7 @@ Array [
       "lineNumber": 3,
     },
     "rangeStrategy": "pin",
-    "versionScheme": "npm",
+    "versioning": "npm",
   },
   Object {
     "commitMessageTopic": "{{{depName}}} orb",
@@ -75,7 +75,7 @@ Array [
       "lineNumber": 4,
     },
     "rangeStrategy": "pin",
-    "versionScheme": "npm",
+    "versioning": "npm",
   },
   Object {
     "commitMessageTopic": "{{{depName}}} orb",
@@ -88,7 +88,7 @@ Array [
       "lineNumber": 5,
     },
     "rangeStrategy": "pin",
-    "versionScheme": "npm",
+    "versioning": "npm",
   },
   Object {
     "currentDigest": "sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077",
diff --git a/lib/manager/circleci/extract.ts b/lib/manager/circleci/extract.ts
index 4749555469..975537af23 100644
--- a/lib/manager/circleci/extract.ts
+++ b/lib/manager/circleci/extract.ts
@@ -1,7 +1,7 @@
 import { logger } from '../../logger';
 import { getDep } from '../dockerfile/extract';
 import { PackageFile, PackageDependency } from '../common';
-import { VERSION_SCHEME_NPM } from '../../constants/version-schemes';
+import * as npmVersioning from '../../versioning/npm';
 import { DATASOURCE_ORB } from '../../constants/data-binary-source';
 
 export function extractPackageFile(content: string): PackageFile | null {
@@ -33,7 +33,7 @@ export function extractPackageFile(content: string): PackageFile | null {
               datasource: DATASOURCE_ORB,
               lookupName: orbName,
               commitMessageTopic: '{{{depName}}} orb',
-              versionScheme: VERSION_SCHEME_NPM,
+              versioning: npmVersioning.id,
               rangeStrategy: 'pin',
             };
             deps.push(dep);
diff --git a/lib/manager/common.ts b/lib/manager/common.ts
index a6b6aca793..d77516b8b7 100644
--- a/lib/manager/common.ts
+++ b/lib/manager/common.ts
@@ -23,7 +23,7 @@ export interface ExtractConfig extends ManagerConfig {
   ignoreNpmrcFile?: boolean;
 
   skipInstalls?: boolean;
-  versionScheme?: string;
+  versioning?: string;
 }
 
 export interface UpdateArtifactsConfig extends ManagerConfig {
@@ -104,7 +104,7 @@ export interface Package<T> extends ManagerData<T> {
   lookupName?: string;
   repo?: string;
   target?: string;
-  versionScheme?: string;
+  versioning?: string;
 
   // npm manager
   bumpVersion?: ReleaseType | string;
diff --git a/lib/manager/composer/index.ts b/lib/manager/composer/index.ts
index 26e19fff4b..99deda1f45 100644
--- a/lib/manager/composer/index.ts
+++ b/lib/manager/composer/index.ts
@@ -3,7 +3,7 @@ import { updateDependency } from '../npm/update';
 import { updateArtifacts } from './artifacts';
 import { getRangeStrategy } from './range';
 import { LANGUAGE_PHP } from '../../constants/languages';
-import { VERSION_SCHEME_COMPOSER } from '../../constants/version-schemes';
+import * as composerVersioning from '../../versioning/composer';
 
 const language = LANGUAGE_PHP;
 export const supportsLockFileMaintenance = true;
@@ -18,5 +18,5 @@ export {
 
 export const defaultConfig = {
   fileMatch: ['(^|/)([\\w-]*)composer.json$'],
-  versionScheme: VERSION_SCHEME_COMPOSER,
+  versioning: composerVersioning.id,
 };
diff --git a/lib/manager/deps-edn/index.ts b/lib/manager/deps-edn/index.ts
index 8b66511f36..9f81a4dd48 100644
--- a/lib/manager/deps-edn/index.ts
+++ b/lib/manager/deps-edn/index.ts
@@ -1,4 +1,4 @@
-import { VERSION_SCHEME_MAVEN } from '../../constants/version-schemes';
+import * as mavenVersioning from '../../versioning/maven';
 import { extractPackageFile } from './extract';
 import { updateDependency } from './update';
 
@@ -6,5 +6,5 @@ export { extractPackageFile, updateDependency };
 
 export const defaultConfig = {
   fileMatch: ['(^|/)deps\\.edn$'],
-  versionScheme: VERSION_SCHEME_MAVEN,
+  versioning: mavenVersioning.id,
 };
diff --git a/lib/manager/git-submodules/index.ts b/lib/manager/git-submodules/index.ts
index 3fab0be73a..22dde889ee 100644
--- a/lib/manager/git-submodules/index.ts
+++ b/lib/manager/git-submodules/index.ts
@@ -1,4 +1,4 @@
-import { VERSION_SCHEME_GIT } from '../../constants/version-schemes';
+import * as gitVersioning from '../../versioning/git';
 
 export { default as extractPackageFile } from './extract';
 export { default as updateDependency } from './update';
@@ -6,6 +6,6 @@ export { default as updateArtifacts } from './artifacts';
 
 export const defaultConfig = {
   enabled: false,
-  versionScheme: VERSION_SCHEME_GIT,
+  versioning: gitVersioning.id,
   fileMatch: ['(^|/).gitmodules$'],
 };
diff --git a/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap b/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap
index 11c3c4551e..d4638ac065 100644
--- a/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap
@@ -10,7 +10,7 @@ Array [
     "managerData": Object {
       "lineNumber": 11,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "commitMessageTopic": "Node.js",
@@ -21,7 +21,7 @@ Array [
     "managerData": Object {
       "lineNumber": 36,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
 ]
 `;
@@ -36,7 +36,7 @@ Array [
     "managerData": Object {
       "lineNumber": 17,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
   Object {
     "commitMessageTopic": "Node.js",
@@ -47,7 +47,7 @@ Array [
     "managerData": Object {
       "lineNumber": 31,
     },
-    "versionScheme": "docker",
+    "versioning": "docker",
   },
 ]
 `;
diff --git a/lib/manager/github-actions/extract.ts b/lib/manager/github-actions/extract.ts
index ef78d9e803..15fcc0290f 100644
--- a/lib/manager/github-actions/extract.ts
+++ b/lib/manager/github-actions/extract.ts
@@ -1,7 +1,7 @@
 import { logger } from '../../logger';
 import { getDep } from '../dockerfile/extract';
 import { PackageFile, PackageDependency } from '../common';
-import { VERSION_SCHEME_DOCKER } from '../../constants/version-schemes';
+import * as dockerVersioning from '../../versioning/docker';
 
 export function extractPackageFile(content: string): PackageFile | null {
   logger.debug('github-actions.extractPackageFile()');
@@ -25,7 +25,7 @@ export function extractPackageFile(content: string): PackageFile | null {
         'Docker image inside GitHub Actions'
       );
       dep.managerData = { lineNumber };
-      dep.versionScheme = VERSION_SCHEME_DOCKER;
+      dep.versioning = dockerVersioning.id;
       deps.push(dep);
     }
     lineNumber += 1;
diff --git a/lib/manager/gradle-wrapper/__snapshots__/extract.spec.ts.snap b/lib/manager/gradle-wrapper/__snapshots__/extract.spec.ts.snap
index 866baef318..d4c5b928e6 100644
--- a/lib/manager/gradle-wrapper/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/gradle-wrapper/__snapshots__/extract.spec.ts.snap
@@ -12,7 +12,7 @@ Array [
       "gradleWrapperType": "all",
       "lineNumber": 5,
     },
-    "versionScheme": "semver",
+    "versioning": "semver",
   },
 ]
 `;
@@ -28,7 +28,7 @@ Array [
       "gradleWrapperType": "bin",
       "lineNumber": 4,
     },
-    "versionScheme": "semver",
+    "versioning": "semver",
   },
 ]
 `;
diff --git a/lib/manager/gradle-wrapper/extract.ts b/lib/manager/gradle-wrapper/extract.ts
index fc8843d115..e29fe1914e 100644
--- a/lib/manager/gradle-wrapper/extract.ts
+++ b/lib/manager/gradle-wrapper/extract.ts
@@ -1,7 +1,7 @@
 import { coerce } from 'semver';
 import { logger } from '../../logger';
 import { PackageFile, PackageDependency } from '../common';
-import { VERSION_SCHEME_SEMVER } from '../../constants/version-schemes';
+import * as semverVersioning from '../../versioning/semver';
 import { DATASOURCE_GRADLE_VERSION } from '../../constants/data-binary-source';
 
 export function extractPackageFile(fileContent: string): PackageFile | null {
@@ -20,7 +20,7 @@ export function extractPackageFile(fileContent: string): PackageFile | null {
         depName: 'gradle',
         currentValue: coerce(match[1]).toString(),
         managerData: { lineNumber, gradleWrapperType: match[3] },
-        versionScheme: VERSION_SCHEME_SEMVER,
+        versioning: semverVersioning.id,
       };
 
       let shaLineNumber = 0;
diff --git a/lib/manager/gradle/index.ts b/lib/manager/gradle/index.ts
index 3969cce073..8696a1e316 100644
--- a/lib/manager/gradle/index.ts
+++ b/lib/manager/gradle/index.ts
@@ -3,7 +3,7 @@ import upath from 'upath';
 
 import { exec, ExecOptions } from '../../util/exec';
 import { logger } from '../../logger';
-import { VERSION_SCHEME_MAVEN } from '../../constants/version-schemes';
+import * as mavenVersioning from '../../versioning/maven';
 
 import {
   init,
@@ -178,5 +178,5 @@ export const language = LANGUAGE_JAVA;
 export const defaultConfig = {
   fileMatch: ['\\.gradle(\\.kts)?$', '(^|/)gradle.properties$'],
   timeout: 600,
-  versionScheme: VERSION_SCHEME_MAVEN,
+  versioning: mavenVersioning.id,
 };
diff --git a/lib/manager/html/index.ts b/lib/manager/html/index.ts
index beaa7d4bed..cf42ed6745 100644
--- a/lib/manager/html/index.ts
+++ b/lib/manager/html/index.ts
@@ -1,10 +1,10 @@
 import { extractPackageFile } from './extract';
 import { updateDependency } from './update';
-import { VERSION_SCHEME_SEMVER } from '../../constants/version-schemes';
+import * as semverVersioning from '../../versioning/semver';
 
 export { extractPackageFile, updateDependency };
 
 export const defaultConfig = {
   fileMatch: ['\\.html?$'],
-  versionScheme: VERSION_SCHEME_SEMVER,
+  versioning: semverVersioning.id,
 };
diff --git a/lib/manager/leiningen/index.ts b/lib/manager/leiningen/index.ts
index b4ad8ba27f..b8814fe7d7 100644
--- a/lib/manager/leiningen/index.ts
+++ b/lib/manager/leiningen/index.ts
@@ -1,9 +1,9 @@
-import { VERSION_SCHEME_MAVEN } from '../../constants/version-schemes';
+import * as mavenVersioning from '../../versioning/maven';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
 
 export const defaultConfig = {
   fileMatch: ['(^|/)project\\.clj$'],
-  versionScheme: VERSION_SCHEME_MAVEN,
+  versioning: mavenVersioning.id,
 };
diff --git a/lib/manager/maven/index.ts b/lib/manager/maven/index.ts
index 17d6cec59b..45f09393cc 100644
--- a/lib/manager/maven/index.ts
+++ b/lib/manager/maven/index.ts
@@ -1,5 +1,5 @@
 import { LANGUAGE_JAVA } from '../../constants/languages';
-import { VERSION_SCHEME_MAVEN } from '../../constants/version-schemes';
+import * as mavenVersioning from '../../versioning/maven';
 
 export { extractAllPackageFiles } from './extract';
 export { updateDependency } from './update';
@@ -8,5 +8,5 @@ export const language = LANGUAGE_JAVA;
 
 export const defaultConfig = {
   fileMatch: ['\\.pom\\.xml$', '(^|/)pom\\.xml$'],
-  versionScheme: VERSION_SCHEME_MAVEN,
+  versioning: mavenVersioning.id,
 };
diff --git a/lib/manager/mix/index.ts b/lib/manager/mix/index.ts
index 6f7ceb65cc..e47cac35e2 100644
--- a/lib/manager/mix/index.ts
+++ b/lib/manager/mix/index.ts
@@ -1,5 +1,5 @@
 import { LANGUAGE_ELIXIR } from '../../constants/languages';
-import { VERSION_SCHEME_HEX } from '../../constants/version-schemes';
+import * as hexVersioning from '../../versioning/hex';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
@@ -9,5 +9,5 @@ export const language = LANGUAGE_ELIXIR;
 
 export const defaultConfig = {
   fileMatch: ['(^|/)mix\\.exs$'],
-  versionScheme: VERSION_SCHEME_HEX,
+  versioning: hexVersioning.id,
 };
diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
index 887d0b5311..ad69beb3b9 100644
--- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
+++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
@@ -92,7 +92,7 @@ Object {
         "enabled": false,
       },
       "prettyDepType": "engine",
-      "versionScheme": "node",
+      "versioning": "node",
     },
     Object {
       "commitMessageTopic": "npm",
@@ -351,7 +351,7 @@ Object {
         "enabled": false,
       },
       "prettyDepType": "engine",
-      "versionScheme": "node",
+      "versioning": "node",
     },
     Object {
       "commitMessageTopic": "Node.js",
@@ -364,7 +364,7 @@ Object {
         "enabled": false,
       },
       "prettyDepType": "volta",
-      "versionScheme": "node",
+      "versioning": "node",
     },
     Object {
       "commitMessageTopic": "Yarn",
@@ -413,7 +413,7 @@ Object {
         "enabled": false,
       },
       "prettyDepType": "engine",
-      "versionScheme": "node",
+      "versioning": "node",
     },
     Object {
       "commitMessageTopic": "Node.js",
@@ -426,7 +426,7 @@ Object {
         "enabled": false,
       },
       "prettyDepType": "volta",
-      "versionScheme": "node",
+      "versioning": "node",
     },
     Object {
       "commitMessageTopic": "Yarn",
diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts
index beaeb246a6..a41401b0b3 100644
--- a/lib/manager/npm/extract/index.ts
+++ b/lib/manager/npm/extract/index.ts
@@ -17,7 +17,7 @@ import {
 import { NpmPackage } from './common';
 import { platform } from '../../../platform';
 import { CONFIG_VALIDATION } from '../../../constants/error-messages';
-import { VERSION_SCHEME_NODE } from '../../../constants/version-schemes';
+import * as nodeVersioning from '../../../versioning/node';
 import {
   DATASOURCE_GITHUB,
   DATASOURCE_NPM,
@@ -158,7 +158,7 @@ export async function extractPackageFile(
       if (depName === 'node') {
         dep.datasource = DATASOURCE_GITHUB;
         dep.lookupName = 'nodejs/node';
-        dep.versionScheme = VERSION_SCHEME_NODE;
+        dep.versioning = nodeVersioning.id;
       } else if (depName === 'yarn') {
         dep.datasource = DATASOURCE_NPM;
         dep.commitMessageTopic = 'Yarn';
@@ -179,7 +179,7 @@ export async function extractPackageFile(
       if (depName === 'node') {
         dep.datasource = DATASOURCE_GITHUB;
         dep.lookupName = 'nodejs/node';
-        dep.versionScheme = VERSION_SCHEME_NODE;
+        dep.versioning = nodeVersioning.id;
       } else if (depName === 'yarn') {
         dep.datasource = DATASOURCE_NPM;
         dep.commitMessageTopic = 'Yarn';
diff --git a/lib/manager/npm/index.ts b/lib/manager/npm/index.ts
index d525196a5a..9ba07182e7 100644
--- a/lib/manager/npm/index.ts
+++ b/lib/manager/npm/index.ts
@@ -1,5 +1,5 @@
 import { LANGUAGE_JAVASCRIPT } from '../../constants/languages';
-import { VERSION_SCHEME_NPM } from '../../constants/version-schemes';
+import * as npmVersioning from '../../versioning/npm';
 
 export { extractAllPackageFiles } from './extract';
 export { updateDependency } from './update';
@@ -11,7 +11,7 @@ export const supportsLockFileMaintenance = true;
 export const defaultConfig = {
   fileMatch: ['(^|/)package.json$'],
   rollbackPrs: true,
-  versionScheme: VERSION_SCHEME_NPM,
+  versioning: npmVersioning.id,
   prBodyDefinitions: {
     Change:
       '[{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}](https://renovatebot.com/diffs/npm/{{{depNameEscaped}}}/{{{fromVersion}}}/{{{toVersion}}})',
diff --git a/lib/manager/nuget/extract.ts b/lib/manager/nuget/extract.ts
index 2d3dee1841..cf4bc024b9 100644
--- a/lib/manager/nuget/extract.ts
+++ b/lib/manager/nuget/extract.ts
@@ -1,7 +1,7 @@
 import { logger } from '../../logger';
 import { get } from '../../versioning';
 import { PackageDependency, ExtractConfig, PackageFile } from '../common';
-import { VERSION_SCHEME_SEMVER } from '../../constants/version-schemes';
+import * as semverVersioning from '../../versioning/semver';
 import { DATASOURCE_NUGET } from '../../constants/data-binary-source';
 
 export function extractPackageFile(
@@ -10,7 +10,7 @@ export function extractPackageFile(
   config: ExtractConfig = {}
 ): PackageFile {
   logger.trace(`nuget.extractPackageFile(${packageFile})`);
-  const { isVersion } = get(config.versionScheme || VERSION_SCHEME_SEMVER);
+  const { isVersion } = get(config.versioning || semverVersioning.id);
   const deps: PackageDependency[] = [];
 
   let lineNumber = 0;
diff --git a/lib/manager/nvm/index.ts b/lib/manager/nvm/index.ts
index 07648c91d2..17bf260096 100644
--- a/lib/manager/nvm/index.ts
+++ b/lib/manager/nvm/index.ts
@@ -1,5 +1,5 @@
 import { LANGUAGE_NODE } from '../../constants/languages';
-import { VERSION_SCHEME_NODE } from '../../constants/version-schemes';
+import * as nodeVersioning from '../../versioning/node';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
@@ -8,5 +8,5 @@ export const language = LANGUAGE_NODE;
 
 export const defaultConfig = {
   fileMatch: ['^.nvmrc$'],
-  versionScheme: VERSION_SCHEME_NODE,
+  versioning: nodeVersioning.id,
 };
diff --git a/lib/manager/poetry/index.ts b/lib/manager/poetry/index.ts
index 1d827eaecd..ac72839994 100644
--- a/lib/manager/poetry/index.ts
+++ b/lib/manager/poetry/index.ts
@@ -1,5 +1,5 @@
 import { LANGUAGE_PYTHON } from '../../constants/languages';
-import { VERSION_SCHEME_POETRY } from '../../constants/version-schemes';
+import * as poetryVersioning from '../../versioning/poetry';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
@@ -9,6 +9,6 @@ export const language = LANGUAGE_PYTHON;
 export const supportsLockFileMaintenance = true;
 
 export const defaultConfig = {
-  versionScheme: VERSION_SCHEME_POETRY,
+  versioning: poetryVersioning.id,
   fileMatch: ['(^|/)pyproject\\.toml$'],
 };
diff --git a/lib/manager/pub/index.ts b/lib/manager/pub/index.ts
index df8273074e..3034fc824f 100644
--- a/lib/manager/pub/index.ts
+++ b/lib/manager/pub/index.ts
@@ -1,9 +1,9 @@
-import { VERSION_SCHEME_NPM } from '../../constants/version-schemes';
+import * as npmVersioning from '../../versioning/npm';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
 
 export const defaultConfig = {
   fileMatch: ['(^|/)pubspec\\.ya?ml$'],
-  versionScheme: VERSION_SCHEME_NPM,
+  versioning: npmVersioning.id,
 };
diff --git a/lib/manager/ruby-version/index.ts b/lib/manager/ruby-version/index.ts
index 303d6c674c..b6449b3afc 100644
--- a/lib/manager/ruby-version/index.ts
+++ b/lib/manager/ruby-version/index.ts
@@ -1,5 +1,5 @@
 import { LANGUAGE_RUBY } from '../../constants/languages';
-import { VERSION_SCHEME_RUBY } from '../../constants/version-schemes';
+import * as rubyVersioning from '../../versioning/ruby';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
@@ -8,5 +8,5 @@ export const language = LANGUAGE_RUBY;
 
 export const defaultConfig = {
   fileMatch: ['(^|/)\\.ruby-version$'],
-  versionScheme: VERSION_SCHEME_RUBY,
+  versioning: rubyVersioning.id,
 };
diff --git a/lib/manager/sbt/extract.ts b/lib/manager/sbt/extract.ts
index 5c0fc8653e..81012dfd7f 100644
--- a/lib/manager/sbt/extract.ts
+++ b/lib/manager/sbt/extract.ts
@@ -1,7 +1,7 @@
 import { DEFAULT_MAVEN_REPO } from '../maven/extract';
 import { PackageFile, PackageDependency } from '../common';
 import { get } from '../../versioning';
-import { VERSION_SCHEME_MAVEN } from '../../constants/version-schemes';
+import * as mavenVersioning from '../../versioning/maven';
 import { DATASOURCE_SBT } from '../../constants/data-binary-source';
 
 const isComment = (str: string): boolean => /^\s*\/\//.test(str);
@@ -29,7 +29,7 @@ const getScalaVersion = (str: string): string =>
 const normalizeScalaVersion = (str: string): string => {
   // istanbul ignore if
   if (!str) return str;
-  const versioning = get(VERSION_SCHEME_MAVEN);
+  const versioning = get(mavenVersioning.id);
   if (versioning.isVersion(str)) {
     // Do not normalize unstable versions
     if (!versioning.isStable(str)) return str;
diff --git a/lib/manager/sbt/index.ts b/lib/manager/sbt/index.ts
index 474a825545..213eb810cb 100644
--- a/lib/manager/sbt/index.ts
+++ b/lib/manager/sbt/index.ts
@@ -1,4 +1,4 @@
-import { VERSION_SCHEME_IVY } from '../../constants/version-schemes';
+import * as ivyVersioning from '../../versioning/ivy';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
@@ -6,5 +6,5 @@ export { updateDependency } from './update';
 export const defaultConfig = {
   fileMatch: ['\\.sbt$', 'project/[^/]*.scala$'],
   timeout: 300,
-  versionScheme: VERSION_SCHEME_IVY,
+  versioning: ivyVersioning.id,
 };
diff --git a/lib/manager/swift/index.ts b/lib/manager/swift/index.ts
index 8446047522..3ed2e6a32c 100644
--- a/lib/manager/swift/index.ts
+++ b/lib/manager/swift/index.ts
@@ -1,10 +1,10 @@
-import { VERSION_SCHEME_SWIFT } from '../../constants/version-schemes';
+import * as swiftVersioning from '../../versioning/swift';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
 
 export const defaultConfig = {
   fileMatch: ['(^|/)Package\\.swift'],
-  versionScheme: VERSION_SCHEME_SWIFT,
+  versioning: swiftVersioning.id,
   rangeStrategy: 'bump',
 };
diff --git a/lib/manager/terraform/index.ts b/lib/manager/terraform/index.ts
index 4d652ec159..76e4cbde6b 100644
--- a/lib/manager/terraform/index.ts
+++ b/lib/manager/terraform/index.ts
@@ -1,4 +1,4 @@
-import { VERSION_SCHEME_HASHICORP } from '../../constants/version-schemes';
+import * as hashicorpVersioning from '../../versioning/hashicorp';
 
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
@@ -7,5 +7,5 @@ export const defaultConfig = {
   commitMessageTopic:
     'Terraform {{managerData.terraformDependencyType}} {{depNameShort}}',
   fileMatch: ['\\.tf$'],
-  versionScheme: VERSION_SCHEME_HASHICORP,
+  versioning: hashicorpVersioning.id,
 };
diff --git a/lib/manager/travis/index.ts b/lib/manager/travis/index.ts
index 520bdaffd9..2935084993 100644
--- a/lib/manager/travis/index.ts
+++ b/lib/manager/travis/index.ts
@@ -1,5 +1,5 @@
 import { LANGUAGE_NODE } from '../../constants/languages';
-import { VERSION_SCHEME_NODE } from '../../constants/version-schemes';
+import * as nodeVersioning from '../../versioning/node';
 
 export { extractPackageFile } from './extract';
 export { getPackageUpdates } from './package';
@@ -9,5 +9,5 @@ export const language = LANGUAGE_NODE;
 
 export const defaultConfig = {
   fileMatch: ['^.travis.yml$'],
-  versionScheme: VERSION_SCHEME_NODE,
+  versioning: nodeVersioning.id,
 };
diff --git a/lib/util/package-rules.ts b/lib/util/package-rules.ts
index 253e2c4d3a..4c2bcd0d8a 100644
--- a/lib/util/package-rules.ts
+++ b/lib/util/package-rules.ts
@@ -1,12 +1,12 @@
 import minimatch from 'minimatch';
 import { logger } from '../logger';
-import * as versioning from '../versioning';
+import * as allVersioning from '../versioning';
 import { mergeChildConfig, PackageRule, UpdateType } from '../config';
 import { regEx } from './regex';
 
 // TODO: move to `../config`
 export interface Config extends Record<string, any> {
-  versionScheme?: string;
+  versioning?: string;
   packageFile?: string;
   depType?: string;
   depTypes?: string[];
@@ -26,7 +26,7 @@ export interface Config extends Record<string, any> {
 
 function matchesRule(inputConfig: Config, packageRule: PackageRule): boolean {
   const {
-    versionScheme,
+    versioning,
     packageFile,
     depType,
     depTypes,
@@ -190,7 +190,7 @@ function matchesRule(inputConfig: Config, packageRule: PackageRule): boolean {
     positiveMatch = true;
   }
   if (matchCurrentVersion) {
-    const version = versioning.get(versionScheme);
+    const version = allVersioning.get(versioning);
     const matchCurrentVersionStr = matchCurrentVersion.toString();
     if (version.isVersion(matchCurrentVersionStr)) {
       let isMatch = false;
diff --git a/lib/versioning/cargo/index.ts b/lib/versioning/cargo/index.ts
index 1d959ec210..cbe0c628b1 100644
--- a/lib/versioning/cargo/index.ts
+++ b/lib/versioning/cargo/index.ts
@@ -1,6 +1,7 @@
 import { api as npm } from '../npm';
 import { VersioningApi, NewValueConfig } from '../common';
 
+export const id = 'cargo';
 export const displayName = 'Cargo';
 export const urls = [
   'https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html',
diff --git a/lib/versioning/composer/index.ts b/lib/versioning/composer/index.ts
index 065007b3ac..ac65a39e8c 100644
--- a/lib/versioning/composer/index.ts
+++ b/lib/versioning/composer/index.ts
@@ -3,6 +3,7 @@ import { logger } from '../../logger';
 import { api as npm } from '../npm';
 import { VersioningApi, NewValueConfig } from '../common';
 
+export const id = 'composer';
 export const displayName = 'Composer';
 export const urls = [
   'https://getcomposer.org/doc/articles/versions.md',
diff --git a/lib/versioning/docker/index.ts b/lib/versioning/docker/index.ts
index fd7ba544f2..e53899ca10 100644
--- a/lib/versioning/docker/index.ts
+++ b/lib/versioning/docker/index.ts
@@ -1,6 +1,7 @@
 import * as generic from '../loose/generic';
 import { VersioningApi } from '../common';
 
+export const id = 'docker';
 export const displayName = 'Docker';
 export const urls = [
   'https://docs.docker.com/engine/reference/commandline/tag/',
diff --git a/lib/versioning/git/index.ts b/lib/versioning/git/index.ts
index acef8725a4..f6521de8c4 100644
--- a/lib/versioning/git/index.ts
+++ b/lib/versioning/git/index.ts
@@ -1,6 +1,7 @@
 import * as generic from '../loose/generic';
 import { VersioningApi } from '../common';
 
+export const id = 'git';
 export const displayName = 'git';
 export const urls = ['https://git-scm.com/'];
 export const supportsRanges = false;
diff --git a/lib/versioning/hashicorp/index.ts b/lib/versioning/hashicorp/index.ts
index 31f28d683f..d04741b17e 100644
--- a/lib/versioning/hashicorp/index.ts
+++ b/lib/versioning/hashicorp/index.ts
@@ -1,6 +1,7 @@
 import { api as npm } from '../npm';
 import { VersioningApi, NewValueConfig } from '../common';
 
+export const id = 'hashicorp';
 export const displayName = 'Hashicorp';
 export const urls = [
   'https://www.terraform.io/docs/configuration/terraform.html#specifying-a-required-terraform-version',
diff --git a/lib/versioning/hex/index.ts b/lib/versioning/hex/index.ts
index a20d3c80cc..c47f2d37ef 100644
--- a/lib/versioning/hex/index.ts
+++ b/lib/versioning/hex/index.ts
@@ -1,6 +1,7 @@
 import { api as npm } from '../npm';
 import { VersioningApi, NewValueConfig } from '../common';
 
+export const id = 'hex';
 export const displayName = 'Hex';
 export const urls = ['https://hexdocs.pm/elixir/Version.html'];
 export const supportsRanges = true;
diff --git a/lib/versioning/index.ts b/lib/versioning/index.ts
index 3f24f66704..7039d5ee18 100644
--- a/lib/versioning/index.ts
+++ b/lib/versioning/index.ts
@@ -8,51 +8,54 @@ import {
 
 export * from './common';
 
-const schemes: Record<string, VersioningApi | VersioningApiConstructor> = {};
+const allVersioning: Record<
+  string,
+  VersioningApi | VersioningApiConstructor
+> = {};
 
-const versionSchemeList: string[] = [];
+const versioningList: string[] = [];
 
-export const getVersionSchemeList = (): string[] => versionSchemeList;
+export const getVersioningList = (): string[] => versioningList;
 
-const versionSchemes = fs
+const versionings = fs
   .readdirSync(__dirname, { withFileTypes: true })
   .filter(dirent => dirent.isDirectory())
   .map(dirent => dirent.name)
   .sort();
 
-for (const scheme of versionSchemes) {
+for (const versioning of versionings) {
   try {
-    schemes[scheme] = require('./' + scheme).api; // eslint-disable-line
-    versionSchemeList.push(scheme);
+    allVersioning[versioning] = require('./' + versioning).api; // eslint-disable-line
+    versioningList.push(versioning);
   } catch (err) /* istanbul ignore next */ {
-    logger.fatal({ err }, `Can not load version scheme "${scheme}".`);
+    logger.fatal({ err }, `Can not load versioning "${versioning}".`);
     process.exit(1);
   }
 }
 
-export function get(versionScheme: string): VersioningApi {
-  if (!versionScheme) {
-    logger.debug('Missing versionScheme');
-    return schemes.semver as VersioningApi;
+export function get(versioning: string): VersioningApi {
+  if (!versioning) {
+    logger.debug('Missing versioning');
+    return allVersioning.semver as VersioningApi;
   }
-  let schemeName: string;
-  let schemeConfig: string;
-  if (versionScheme.includes(':')) {
-    const versionSplit = versionScheme.split(':');
-    schemeName = versionSplit.shift();
-    schemeConfig = versionSplit.join(':');
+  let versioningName: string;
+  let versioningConfig: string;
+  if (versioning.includes(':')) {
+    const versionSplit = versioning.split(':');
+    versioningName = versionSplit.shift();
+    versioningConfig = versionSplit.join(':');
   } else {
-    schemeName = versionScheme;
+    versioningName = versioning;
   }
-  const scheme = schemes[schemeName];
-  if (!scheme) {
-    logger.warn({ versionScheme }, 'Unknown version scheme');
-    return schemes.semver as VersioningApi;
+  const theVersioning = allVersioning[versioningName];
+  if (!theVersioning) {
+    logger.warn({ versioning }, 'Unknown versioning');
+    return allVersioning.semver as VersioningApi;
   }
   // istanbul ignore if: needs an implementation
-  if (isVersioningApiConstructor(scheme)) {
+  if (isVersioningApiConstructor(theVersioning)) {
     // eslint-disable-next-line new-cap
-    return new scheme(schemeConfig);
+    return new theVersioning(versioningConfig);
   }
-  return scheme;
+  return theVersioning;
 }
diff --git a/lib/versioning/ivy/index.ts b/lib/versioning/ivy/index.ts
index 73efe931d3..336315c22d 100644
--- a/lib/versioning/ivy/index.ts
+++ b/lib/versioning/ivy/index.ts
@@ -7,6 +7,7 @@ import {
 } from './parse';
 import { VersioningApi } from '../common';
 
+export const id = 'ivy';
 export const displayName = 'Ivy';
 export const urls = ['https://ant.apache.org/ivy/'];
 export const supportsRanges = true;
diff --git a/lib/versioning/loose/index.ts b/lib/versioning/loose/index.ts
index 8304481a55..83e3cffc26 100644
--- a/lib/versioning/loose/index.ts
+++ b/lib/versioning/loose/index.ts
@@ -1,6 +1,7 @@
 import * as generic from './generic';
 import { VersioningApi } from '../common';
 
+export const id = 'loose';
 export const displayName = 'Loose';
 export const urls = [];
 export const supportsRanges = false;
diff --git a/lib/versioning/maven/index.ts b/lib/versioning/maven/index.ts
index 8ea8d8148d..6be9fceefa 100644
--- a/lib/versioning/maven/index.ts
+++ b/lib/versioning/maven/index.ts
@@ -14,6 +14,7 @@ import {
 } from './compare';
 import { NewValueConfig, VersioningApi } from '../common';
 
+export const id = 'maven';
 export const displayName = 'Maven';
 export const urls = [
   'https://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification',
diff --git a/lib/versioning/node/index.ts b/lib/versioning/node/index.ts
index 028427786a..125ac1c837 100644
--- a/lib/versioning/node/index.ts
+++ b/lib/versioning/node/index.ts
@@ -1,6 +1,7 @@
 import npm, { isVersion, isValid } from '../npm';
 import { NewValueConfig, VersioningApi } from '../common';
 
+export const id = 'node';
 export const displayName = 'Node.js';
 export const urls = [];
 export const supportsRanges = false;
diff --git a/lib/versioning/npm/index.ts b/lib/versioning/npm/index.ts
index 06a52c3061..246a02549a 100644
--- a/lib/versioning/npm/index.ts
+++ b/lib/versioning/npm/index.ts
@@ -3,6 +3,7 @@ import { is as isStable } from 'semver-stable';
 import { getNewValue } from './range';
 import { VersioningApi } from '../common';
 
+export const id = 'npm';
 export const displayName = 'npm';
 export const urls = [
   'https://semver.org/',
diff --git a/lib/versioning/nuget/index.ts b/lib/versioning/nuget/index.ts
index 4769592cdb..2535e7f426 100644
--- a/lib/versioning/nuget/index.ts
+++ b/lib/versioning/nuget/index.ts
@@ -1,6 +1,7 @@
 import * as generic from '../loose/generic';
 import { VersioningApi } from '../common';
 
+export const id = 'nuget';
 export const displayName = 'NuGet';
 export const urls = [
   'https://docs.microsoft.com/en-us/nuget/concepts/package-versioning',
diff --git a/lib/versioning/nuget/readme.md b/lib/versioning/nuget/readme.md
index 4e680039cc..105ea5ecf8 100644
--- a/lib/versioning/nuget/readme.md
+++ b/lib/versioning/nuget/readme.md
@@ -2,4 +2,4 @@ NuGet versioning matches as closely as possible to the version comparison that N
 
 NuGet supports SemVer 2.0.0, but permits versions with differing numbers of version parts.
 
-Ranges are not yet supported by this version scheme, but they are defined in NuGet and could be supported in the future.
+Ranges are not yet supported by this versioning, but they are defined in NuGet and could be supported in the future.
diff --git a/lib/versioning/pep440/index.ts b/lib/versioning/pep440/index.ts
index e7b700663f..eaa41d5e57 100644
--- a/lib/versioning/pep440/index.ts
+++ b/lib/versioning/pep440/index.ts
@@ -3,6 +3,7 @@ import { filter } from '@renovate/pep440/lib/specifier';
 import { getNewValue } from './range';
 import { VersioningApi } from '../common';
 
+export const id = 'pep440';
 export const displayName = 'PEP440';
 export const urls = ['https://www.python.org/dev/peps/pep-0440/'];
 export const supportsRanges = true;
diff --git a/lib/versioning/poetry/index.ts b/lib/versioning/poetry/index.ts
index 3c976a54fb..7539bc13f0 100644
--- a/lib/versioning/poetry/index.ts
+++ b/lib/versioning/poetry/index.ts
@@ -3,6 +3,7 @@ import { major, minor } from 'semver';
 import { api as npm } from '../npm';
 import { NewValueConfig, VersioningApi } from '../common';
 
+export const id = 'poetry';
 export const displayName = 'Poetry';
 export const urls = ['https://python-poetry.org/docs/versions/'];
 export const supportsRanges = true;
diff --git a/lib/versioning/regex/index.ts b/lib/versioning/regex/index.ts
index 1c937e9edb..67462d0ab5 100644
--- a/lib/versioning/regex/index.ts
+++ b/lib/versioning/regex/index.ts
@@ -4,6 +4,7 @@ import { GenericVersion, GenericVersioningApi } from '../loose/generic';
 import { regEx } from '../../util/regex';
 import { CONFIG_VALIDATION } from '../../constants/error-messages';
 
+export const id = 'regex';
 export const displayName = 'Regular Expression';
 export const urls = [];
 export const supportsRanges = false;
@@ -35,7 +36,7 @@ export class RegExpVersioningApi extends GenericVersioningApi<RegExpVersion> {
   //   RegExp('^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(-(?<prerelease>.*))?$')
   // * emulates the "docker" configuration:
   //   RegExp('^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(-(?<compatibility>.*))?$')
-  // * matches the versioning scheme used by the Python images on DockerHub:
+  // * matches the versioning approach used by the Python images on DockerHub:
   //   RegExp('^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?<prerelease>[^.-]+)?(-(?<compatibility>.*))?$');
   private _config: RegExp = null;
 
@@ -55,7 +56,7 @@ export class RegExpVersioningApi extends GenericVersioningApi<RegExpVersion> {
       const error = new Error(CONFIG_VALIDATION);
       error.configFile = new_config;
       error.validationError =
-        'regex versionScheme needs at least one major, minor or patch group defined';
+        'regex versioning needs at least one major, minor or patch group defined';
       throw error;
     }
 
diff --git a/lib/versioning/regex/readme.md b/lib/versioning/regex/readme.md
index 6b44b52b35..aafe9fbf10 100644
--- a/lib/versioning/regex/readme.md
+++ b/lib/versioning/regex/readme.md
@@ -15,7 +15,7 @@ Here is an example of using `regex` versioning to correct behavior of the `guava
   "packageRules": [
     {
       "packageNames": ["com.google.guava:guava"],
-      "versionScheme": "regex:^(?<major>\\d+)(\\.(?<minor>\\d+))?(\\.(?<patch>\\d+))?(-(?<compatibility>.*))?$"
+      "versioning": "regex:^(?<major>\\d+)(\\.(?<minor>\\d+))?(\\.(?<patch>\\d+))?(-(?<compatibility>.*))?$"
     }
   ]
 }
@@ -29,7 +29,7 @@ Here is another example, this time for handling `python` Docker images, which us
     {
       "datasources": ["docker"],
       "packageNames": ["python"],
-      "versionScheme": "regex:^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?<prerelease>[^.-]+)?(-(?<compatibility>.*))?$"
+      "versioning": "regex:^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?<prerelease>[^.-]+)?(-(?<compatibility>.*))?$"
     }
   ]
 }
diff --git a/lib/versioning/ruby/index.ts b/lib/versioning/ruby/index.ts
index cb549aaca9..06e9e0b7d4 100644
--- a/lib/versioning/ruby/index.ts
+++ b/lib/versioning/ruby/index.ts
@@ -13,6 +13,7 @@ import { parse as parseRange, ltr } from './range';
 import { isSingleOperator, isValidOperator } from './operator';
 import { pin, bump, replace } from './strategies';
 
+export const id = 'ruby';
 export const displayName = 'Ruby';
 export const urls = [
   'https://guides.rubygems.org/patterns/',
diff --git a/lib/versioning/semver/index.ts b/lib/versioning/semver/index.ts
index c93d263dac..f95ea3e9c1 100644
--- a/lib/versioning/semver/index.ts
+++ b/lib/versioning/semver/index.ts
@@ -2,6 +2,7 @@ import semver from 'semver';
 import stable from 'semver-stable';
 import { NewValueConfig, VersioningApi } from '../common';
 
+export const id = 'semver';
 export const displayName = 'Semantic';
 export const urls = ['https://semver.org/'];
 export const supportsRanges = false;
diff --git a/lib/versioning/swift/index.ts b/lib/versioning/swift/index.ts
index e7e0602215..345a640aab 100644
--- a/lib/versioning/swift/index.ts
+++ b/lib/versioning/swift/index.ts
@@ -3,6 +3,7 @@ import stable from 'semver-stable';
 import { toSemverRange, getNewValue } from './range';
 import { VersioningApi } from '../common';
 
+export const id = 'swift';
 export const displayName = 'Swift';
 export const urls = ['https://swift.org/package-manager/'];
 export const supportsRanges = true;
diff --git a/lib/workers/pr/body/common.ts b/lib/workers/pr/body/common.ts
index 0aceae4fc8..1e70914c6f 100644
--- a/lib/workers/pr/body/common.ts
+++ b/lib/workers/pr/body/common.ts
@@ -9,7 +9,7 @@ export type PrBodyUpgrade = LookupUpdate &
     depName?: string;
     depNameLinked?: string;
     references?: string;
-    versionScheme: string;
+    versioning: string;
     stabilityDays?: number;
   };
 
diff --git a/lib/workers/pr/body/index.ts b/lib/workers/pr/body/index.ts
index 052ea8f538..7d7d390323 100644
--- a/lib/workers/pr/body/index.ts
+++ b/lib/workers/pr/body/index.ts
@@ -50,11 +50,11 @@ function massageUpdateMetadata(config: PrBodyConfig): void {
       references.push(`[changelog](${changelogUrl})`);
     }
     upgrade.references = references.join(', ');
-    const { fromVersion, toVersion, updateType, versionScheme } = upgrade;
+    const { fromVersion, toVersion, updateType, versioning } = upgrade;
     // istanbul ignore if
     if (updateType === 'minor') {
       try {
-        const version = get(versionScheme);
+        const version = get(versioning);
         if (version.getMinor(fromVersion) === version.getMinor(toVersion)) {
           upgrade.updateType = 'patch';
         }
diff --git a/lib/workers/pr/changelog/common.ts b/lib/workers/pr/changelog/common.ts
index 110e17fc95..0d5b54fbf6 100644
--- a/lib/workers/pr/changelog/common.ts
+++ b/lib/workers/pr/changelog/common.ts
@@ -50,6 +50,6 @@ export interface ChangeLogConfig {
   releases: Release[];
   sourceUrl?: string;
   toVersion: string;
-  versionScheme: string;
+  versioning: string;
   changeLogError?: ChangeLogError;
 }
diff --git a/lib/workers/pr/changelog/index.ts b/lib/workers/pr/changelog/index.ts
index 40a69f31cc..750c4fea09 100644
--- a/lib/workers/pr/changelog/index.ts
+++ b/lib/workers/pr/changelog/index.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../../logger';
-import * as versioning from '../../../versioning';
+import * as allVersioning from '../../../versioning';
 import * as sourceGithub from './source-github';
 import { getReleases } from './releases';
 import { ChangeLogConfig, ChangeLogResult } from './common';
@@ -9,11 +9,11 @@ export * from './common';
 export async function getChangeLogJSON(
   args: ChangeLogConfig
 ): Promise<ChangeLogResult | null> {
-  const { sourceUrl, versionScheme, fromVersion, toVersion } = args;
+  const { sourceUrl, versioning, fromVersion, toVersion } = args;
   if (!sourceUrl) {
     return null;
   }
-  const version = versioning.get(versionScheme);
+  const version = allVersioning.get(versioning);
   if (!fromVersion || version.equals(fromVersion, toVersion)) {
     return null;
   }
diff --git a/lib/workers/pr/changelog/releases.ts b/lib/workers/pr/changelog/releases.ts
index 941b6573c0..e041eab99c 100644
--- a/lib/workers/pr/changelog/releases.ts
+++ b/lib/workers/pr/changelog/releases.ts
@@ -28,10 +28,10 @@ export type ReleaseConfig = PkgReleaseConfig & {
 export async function getReleases(
   config: ReleaseConfig
 ): Promise<Release[] | null> {
-  const { versionScheme, fromVersion, toVersion, depName, datasource } = config;
+  const { versioning, fromVersion, toVersion, depName, datasource } = config;
   try {
     const pkgReleases = (await getPkgReleases(config)).releases;
-    const version = get(versionScheme);
+    const version = get(versioning);
 
     const releases = pkgReleases
       .filter(release => version.isCompatible(release.version, fromVersion))
diff --git a/lib/workers/pr/changelog/source-github.ts b/lib/workers/pr/changelog/source-github.ts
index 5e289fe3ff..f6e7ac2613 100644
--- a/lib/workers/pr/changelog/source-github.ts
+++ b/lib/workers/pr/changelog/source-github.ts
@@ -2,7 +2,7 @@ import URL from 'url';
 import { api } from '../../../platform/github/gh-got-wrapper';
 import { logger } from '../../../logger';
 import * as hostRules from '../../../util/host-rules';
-import * as versioning from '../../../versioning';
+import * as allVersioning from '../../../versioning';
 import { addReleaseNotes } from './release-notes';
 import {
   ChangeLogConfig,
@@ -17,7 +17,7 @@ const { get: ghGot } = api;
 
 async function getTags(
   endpoint: string,
-  versionScheme: string,
+  versioning: string,
   repository: string
 ): Promise<string[]> {
   let url = endpoint
@@ -50,7 +50,7 @@ async function getTags(
 
 export async function getChangeLogJSON({
   endpoint,
-  versionScheme,
+  versioning,
   fromVersion,
   toVersion,
   sourceUrl,
@@ -62,7 +62,7 @@ export async function getChangeLogJSON({
     logger.debug('No release notes for @types');
     return null;
   }
-  const version = versioning.get(versionScheme);
+  const version = allVersioning.get(versioning);
   const { protocol, host, pathname } = URL.parse(sourceUrl);
   const githubBaseURL = `${protocol}//${host}/`;
   const url = sourceUrl.startsWith('https://github.com/')
@@ -113,7 +113,7 @@ export async function getChangeLogJSON({
 
   async function getRef(release: Release): Promise<string | null> {
     if (!tags) {
-      tags = await getTags(endpoint, versionScheme, repository);
+      tags = await getTags(endpoint, versioning, repository);
     }
     const regex = new RegExp(`${depName}[@-]`);
     const tagName = tags
diff --git a/lib/workers/repository/init/vulnerability.ts b/lib/workers/repository/init/vulnerability.ts
index 8e55f6cade..dc9d0c651c 100644
--- a/lib/workers/repository/init/vulnerability.ts
+++ b/lib/workers/repository/init/vulnerability.ts
@@ -1,15 +1,14 @@
 import { logger } from '../../../logger';
-import * as versioning from '../../../versioning';
+import * as allVersioning from '../../../versioning';
 import { platform } from '../../../platform';
 import { RenovateConfig } from '../../../config';
 import { REPOSITORY_NO_VULNERABILITY } from '../../../constants/error-messages';
-import {
-  VERSION_SCHEME_MAVEN,
-  VERSION_SCHEME_NPM,
-  VERSION_SCHEME_PEP440,
-  VERSION_SCHEME_RUBY,
-  VERSION_SCHEME_SEMVER,
-} from '../../../constants/version-schemes';
+import * as mavenVersioning from '../../../versioning/maven';
+import * as npmVersioning from '../../../versioning/npm';
+import * as pep440Versioning from '../../../versioning/pep440';
+import * as rubyVersioning from '../../../versioning/ruby';
+import * as semverVersioning from '../../../versioning/semver';
+
 import {
   DATASOURCE_MAVEN,
   DATASOURCE_NPM,
@@ -77,14 +76,14 @@ export async function detectVulnerabilityAlerts(
       }
       const firstPatchedVersion =
         alert.securityVulnerability.firstPatchedVersion.identifier;
-      const versionSchemes = {
-        maven: VERSION_SCHEME_MAVEN,
-        npm: VERSION_SCHEME_NPM,
-        nuget: VERSION_SCHEME_SEMVER,
-        pip_requirements: VERSION_SCHEME_PEP440,
-        rubygems: VERSION_SCHEME_RUBY,
+      const versionings = {
+        maven: mavenVersioning.id,
+        npm: npmVersioning.id,
+        nuget: semverVersioning.id,
+        pip_requirements: pep440Versioning.id,
+        rubygems: rubyVersioning.id,
       };
-      const version = versioning.get(versionSchemes[datasource]);
+      const version = allVersioning.get(versionings[datasource]);
       if (version.isVersion(firstPatchedVersion)) {
         if (combinedAlerts[datasource][depName].firstPatchedVersion) {
           if (
diff --git a/lib/workers/repository/process/lookup/filter.ts b/lib/workers/repository/process/lookup/filter.ts
index 4b495e735a..afa0e1b0cf 100644
--- a/lib/workers/repository/process/lookup/filter.ts
+++ b/lib/workers/repository/process/lookup/filter.ts
@@ -1,9 +1,9 @@
 import * as semver from 'semver';
 import { logger } from '../../../../logger';
-import * as versioning from '../../../../versioning';
+import * as allVersioning from '../../../../versioning';
 import { Release } from '../../../../datasource';
 import { CONFIG_VALIDATION } from '../../../../constants/error-messages';
-import { VERSION_SCHEME_NPM } from '../../../../constants/version-schemes';
+import * as npmVersioning from '../../../../versioning/npm';
 
 export interface FilterConfig {
   allowedVersions?: string;
@@ -12,7 +12,7 @@ export interface FilterConfig {
   ignoreDeprecated?: boolean;
   ignoreUnstable?: boolean;
   respectLatest?: boolean;
-  versionScheme: string;
+  versioning: string;
 }
 
 export function filterVersions(
@@ -23,13 +23,13 @@ export function filterVersions(
   releases: Release[]
 ): string[] {
   const {
-    versionScheme,
+    versioning,
     ignoreUnstable,
     ignoreDeprecated,
     respectLatest,
     allowedVersions,
   } = config;
-  const version = versioning.get(versionScheme);
+  const version = allVersioning.get(versioning);
   if (!fromVersion) {
     return [];
   }
@@ -60,7 +60,7 @@ export function filterVersions(
         version.matches(v, allowedVersions)
       );
     } else if (
-      versionScheme !== VERSION_SCHEME_NPM &&
+      versioning !== npmVersioning.id &&
       semver.validRange(allowedVersions)
     ) {
       logger.debug(
diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts
index de6c5d8dde..be54c177d8 100644
--- a/lib/workers/repository/process/lookup/index.ts
+++ b/lib/workers/repository/process/lookup/index.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../../../logger';
-import * as versioning from '../../../../versioning';
+import * as allVersioning from '../../../../versioning';
 import { getRollbackUpdate, RollbackConfig } from './rollback';
 import { getRangeStrategy } from '../../../../manager';
 import { filterVersions, FilterConfig } from './filter';
@@ -56,8 +56,8 @@ function getType(
   fromVersion: string,
   toVersion: string
 ): string {
-  const { versionScheme, rangeStrategy, currentValue } = config;
-  const version = versioning.get(versionScheme);
+  const { versioning, rangeStrategy, currentValue } = config;
+  const version = allVersioning.get(versioning);
   if (rangeStrategy === 'bump' && version.matches(toVersion, currentValue)) {
     return 'bump';
   }
@@ -82,8 +82,8 @@ function getFromVersion(
   latestVersion: string,
   allVersions: string[]
 ): string | null {
-  const { currentValue, lockedVersion, versionScheme } = config;
-  const version = versioning.get(versionScheme);
+  const { currentValue, lockedVersion, versioning } = config;
+  const version = allVersioning.get(versioning);
   if (version.isVersion(currentValue)) {
     return currentValue;
   }
@@ -134,7 +134,7 @@ export async function lookupUpdates(
 ): Promise<UpdateResult> {
   const { depName, currentValue, lockedVersion, vulnerabilityAlert } = config;
   logger.trace({ dependency: depName, currentValue }, 'lookupUpdates');
-  const version = versioning.get(config.versionScheme);
+  const version = allVersioning.get(config.versioning);
   const res: UpdateResult = { updates: [], warnings: [] } as any;
   if (version.isValid(currentValue)) {
     const dependency = clone(await getPkgReleases(config));
@@ -172,7 +172,7 @@ export async function lookupUpdates(
       res.dockerRepository = dependency.dockerRepository;
     }
     const { latestVersion, releases } = dependency;
-    // Filter out any results from datasource that don't comply with our versioning scheme
+    // Filter out any results from datasource that don't comply with our versioning
     let allVersions = releases
       .map(release => release.version)
       .filter(v => version.isVersion(v));
diff --git a/lib/workers/repository/process/lookup/rollback.ts b/lib/workers/repository/process/lookup/rollback.ts
index 6b7b07bcce..d8c3138588 100644
--- a/lib/workers/repository/process/lookup/rollback.ts
+++ b/lib/workers/repository/process/lookup/rollback.ts
@@ -1,25 +1,25 @@
 import { logger } from '../../../../logger';
-import * as versioning from '../../../../versioning';
+import * as allVersioning from '../../../../versioning';
 import { LookupUpdate } from './common';
 
 export interface RollbackConfig {
   currentValue?: string;
   depName?: string;
   packageFile: string;
-  versionScheme: string;
+  versioning: string;
 }
 
 export function getRollbackUpdate(
   config: RollbackConfig,
   versions: string[]
 ): LookupUpdate {
-  const { packageFile, versionScheme, depName, currentValue } = config;
-  const version = versioning.get(versionScheme);
+  const { packageFile, versioning, depName, currentValue } = config;
+  const version = allVersioning.get(versioning);
   // istanbul ignore if
   if (!('isLessThanRange' in version)) {
     logger.info(
-      { versionScheme },
-      'Current version scheme does not support isLessThanRange()'
+      { versioning },
+      'Current versioning does not support isLessThanRange()'
     );
     return null;
   }
diff --git a/test/config/__snapshots__/migration.spec.ts.snap b/test/config/__snapshots__/migration.spec.ts.snap
index 0408283bbf..72831385e7 100644
--- a/test/config/__snapshots__/migration.spec.ts.snap
+++ b/test/config/__snapshots__/migration.spec.ts.snap
@@ -84,6 +84,12 @@ Object {
         "ang",
       ],
     },
+    Object {
+      "packageNames": Array [
+        "guava",
+      ],
+      "versioning": "maven",
+    },
     Object {
       "depTypeList": Array [
         "peerDependencies",
@@ -120,6 +126,9 @@ Object {
     "automerge": true,
   },
   "platform": "github",
+  "poetry": Object {
+    "versioning": "pep440",
+  },
   "postUpdateOptions": Array [
     "gomodTidy",
   ],
diff --git a/test/config/migration.spec.ts b/test/config/migration.spec.ts
index 5bf1ef615d..a04b72e2a4 100644
--- a/test/config/migration.spec.ts
+++ b/test/config/migration.spec.ts
@@ -41,6 +41,9 @@ describe('config/migration', () => {
         node: {
           enabled: true,
         },
+        poetry: {
+          versionScheme: 'pep440',
+        },
         meteor: true,
         autodiscover: 'true' as never,
         schedule: 'on the last day of the month' as never,
@@ -72,6 +75,10 @@ describe('config/migration', () => {
             packagePattern: 'ang',
             enabled: false,
           },
+          {
+            packageNames: ['guava'],
+            versionScheme: 'maven',
+          },
         ],
         exposeEnv: true,
         lockFileMaintenance: {
@@ -112,7 +119,7 @@ describe('config/migration', () => {
       expect(isMigrated).toBe(true);
       expect(migratedConfig.depTypes).not.toBeDefined();
       expect(migratedConfig.automerge).toEqual(false);
-      expect(migratedConfig.packageRules).toHaveLength(7);
+      expect(migratedConfig.packageRules).toHaveLength(8);
       expect(migratedConfig.hostRules).toHaveLength(1);
     });
     it('migrates before and after schedules', () => {
diff --git a/test/versioning/__snapshots__/index.spec.ts.snap b/test/versioning/__snapshots__/index.spec.ts.snap
index 17ac4c295a..19797c1795 100644
--- a/test/versioning/__snapshots__/index.spec.ts.snap
+++ b/test/versioning/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`versioning.get(versionScheme) has api 1`] = `
+exports[`allVersioning.get(versioning) has api 1`] = `
 Array [
   "equals",
   "getMajor",
diff --git a/test/versioning/index.spec.ts b/test/versioning/index.spec.ts
index 6a07d4ec2d..e17c19039f 100644
--- a/test/versioning/index.spec.ts
+++ b/test/versioning/index.spec.ts
@@ -1,31 +1,31 @@
-import * as versioning from '../../lib/versioning';
+import * as allVersioning from '../../lib/versioning';
 import { getOptions } from '../../lib/config/definitions';
 import {
   GenericVersioningApi,
   GenericVersion,
 } from '../../lib/versioning/loose/generic';
-import { VERSION_SCHEME_SEMVER } from '../../lib/constants/version-schemes';
+import * as semverVersioning from '../../lib/versioning/semver';
 
 const supportedSchemes = getOptions().find(
-  option => option.name === 'versionScheme'
+  option => option.name === 'versioning'
 ).allowedValues;
 
-describe('versioning.get(versionScheme)', () => {
+describe('allVersioning.get(versioning)', () => {
   it('has api', () => {
-    expect(Object.keys(versioning.get('semver')).sort()).toMatchSnapshot();
+    expect(Object.keys(allVersioning.get('semver')).sort()).toMatchSnapshot();
   });
 
   it('should fallback to semver', () => {
-    expect(versioning.get(undefined)).toBe(
-      versioning.get(VERSION_SCHEME_SEMVER)
+    expect(allVersioning.get(undefined)).toBe(
+      allVersioning.get(semverVersioning.id)
     );
-    expect(versioning.get('unknown')).toBe(
-      versioning.get(VERSION_SCHEME_SEMVER)
+    expect(allVersioning.get('unknown')).toBe(
+      allVersioning.get(semverVersioning.id)
     );
   });
 
   it('should accept config', () => {
-    expect(versioning.get('semver:test')).toBeDefined();
+    expect(allVersioning.get('semver:test')).toBeDefined();
   });
 
   describe('should return the same interface', () => {
@@ -41,7 +41,7 @@ describe('versioning.get(versionScheme)', () => {
       'toString',
       'valueOf',
     ];
-    const npmApi = Object.keys(versioning.get(VERSION_SCHEME_SEMVER))
+    const npmApi = Object.keys(allVersioning.get(semverVersioning.id))
       .filter(val => !optionalFunctions.includes(val))
       .sort();
 
@@ -63,7 +63,9 @@ describe('versioning.get(versionScheme)', () => {
 
     for (const supportedScheme of supportedSchemes) {
       it(supportedScheme, () => {
-        const schemeKeys = getAllPropertyNames(versioning.get(supportedScheme))
+        const schemeKeys = getAllPropertyNames(
+          allVersioning.get(supportedScheme)
+        )
           .filter(
             val => !optionalFunctions.includes(val) && !val.startsWith('_')
           )
@@ -73,10 +75,10 @@ describe('versioning.get(versionScheme)', () => {
 
         const apiOrCtor = require('../../lib/versioning/' + supportedScheme)
           .api;
-        if (versioning.isVersioningApiConstructor(apiOrCtor)) return;
+        if (allVersioning.isVersioningApiConstructor(apiOrCtor)) return;
 
         expect(Object.keys(apiOrCtor).sort()).toEqual(
-          Object.keys(versioning.get(supportedScheme)).sort()
+          Object.keys(allVersioning.get(supportedScheme)).sort()
         );
       });
     }
diff --git a/test/versioning/versioning-metadata.spec.ts b/test/versioning/versioning-metadata.spec.ts
new file mode 100644
index 0000000000..dbacb0e3bf
--- /dev/null
+++ b/test/versioning/versioning-metadata.spec.ts
@@ -0,0 +1,38 @@
+import { readdir, readFile } from 'fs-extra';
+
+describe('versioning metadata', () => {
+  it('readme no markdown headers', async () => {
+    const allVersioning = (await readdir('lib/versioning')).filter(
+      item => !item.includes('.')
+    );
+    for (const versioning of allVersioning) {
+      let readme: string;
+      try {
+        readme = await readFile(
+          'lib/versioning/' + versioning + '/readme.md',
+          'utf8'
+        );
+      } catch (err) {
+        // ignore missing file
+      }
+      if (readme) {
+        expect(RegExp(/(^|\n)#+ /).exec(readme)).toBe(null);
+      }
+    }
+  });
+  it('contains mandatory fields', async () => {
+    const allVersioning = (await readdir('lib/versioning')).filter(
+      item => !item.includes('.')
+    );
+    for (const versioning of allVersioning) {
+      const versioningObj = require(`../../lib/versioning/${versioning}`);
+      expect(versioningObj.id).toEqual(versioning);
+      expect(versioningObj.displayName).toBeDefined();
+      expect(versioningObj.urls).toBeDefined();
+      expect(versioningObj.supportsRanges).toBeDefined();
+      if (versioningObj.supportsRanges === true) {
+        expect(versioningObj.supportedRangeStrategies).toBeDefined();
+      }
+    }
+  });
+});
diff --git a/test/versioning/versioning-readmes.spec.ts b/test/versioning/versioning-readmes.spec.ts
deleted file mode 100644
index 35b0d717f9..0000000000
--- a/test/versioning/versioning-readmes.spec.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { readdir, readFile } from 'fs-extra';
-
-describe('versioning metadata', () => {
-  it('readme no markdown headers', async () => {
-    const managers = (await readdir('lib/versioning')).filter(
-      item => !item.includes('.')
-    );
-    for (const manager of managers) {
-      let readme: string;
-      try {
-        readme = await readFile(
-          'lib/versioning/' + manager + '/readme.md',
-          'utf8'
-        );
-      } catch (err) {
-        // ignore missing file
-      }
-      if (readme) {
-        expect(RegExp(/(^|\n)#+ /).exec(readme)).toBe(null);
-      }
-    }
-  });
-  it('mandatory fields', async () => {
-    const managers = (await readdir('lib/versioning')).filter(
-      item => !item.includes('.')
-    );
-    for (const manager of managers) {
-      const managerObj = require(`../../lib/versioning/${manager}`);
-      expect(managerObj.displayName).toBeDefined();
-      expect(managerObj.urls).toBeDefined();
-      expect(managerObj.supportsRanges).toBeDefined();
-      if (managerObj.supportsRanges === true) {
-        expect(managerObj.supportedRangeStrategies).toBeDefined();
-      }
-    }
-  });
-});
diff --git a/test/workers/pr/changelog/index.spec.ts b/test/workers/pr/changelog/index.spec.ts
index 1d462a4bce..6a3e13057c 100644
--- a/test/workers/pr/changelog/index.spec.ts
+++ b/test/workers/pr/changelog/index.spec.ts
@@ -7,7 +7,7 @@ import {
 } from '../../../../lib/workers/pr/changelog';
 import { mocked } from '../../../util';
 import { PLATFORM_TYPE_GITHUB } from '../../../../lib/constants/platforms';
-import { VERSION_SCHEME_SEMVER } from '../../../../lib/constants/version-schemes';
+import * as semverVersioning from '../../../../lib/versioning/semver';
 
 jest.mock('../../../../lib/platform/github/gh-got-wrapper');
 jest.mock('../../../../lib/datasource/npm');
@@ -17,7 +17,7 @@ const ghGot = mocked(api).get;
 const upgrade: ChangeLogConfig = {
   endpoint: 'https://api.github.com/',
   depName: 'renovate',
-  versionScheme: VERSION_SCHEME_SEMVER,
+  versioning: semverVersioning.id,
   fromVersion: '1.0.0',
   toVersion: '3.0.0',
   sourceUrl: 'https://github.com/chalk/chalk',
diff --git a/test/workers/pr/changelog/releases.spec.ts b/test/workers/pr/changelog/releases.spec.ts
index dad684facc..cfe44276dd 100644
--- a/test/workers/pr/changelog/releases.spec.ts
+++ b/test/workers/pr/changelog/releases.spec.ts
@@ -1,10 +1,8 @@
 import * as releases from '../../../../lib/workers/pr/changelog/releases';
 import * as datasource from '../../../../lib/datasource';
 import { mocked } from '../../../util';
-import {
-  VERSION_SCHEME_DOCKER,
-  VERSION_SCHEME_NPM,
-} from '../../../../lib/constants/version-schemes';
+import * as dockerVersioning from '../../../../lib/versioning/docker';
+import * as npmVersioning from '../../../../lib/versioning/npm';
 
 jest.mock('../../../../lib/datasource');
 
@@ -44,7 +42,7 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should contain only stable', async () => {
       const config = {
-        versionScheme: VERSION_SCHEME_NPM,
+        versioning: npmVersioning.id,
         fromVersion: '1.0.0',
         toVersion: '1.1.0',
       };
@@ -54,7 +52,7 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should contain fromVersion unstable', async () => {
       const config = {
-        versionScheme: VERSION_SCHEME_NPM,
+        versioning: npmVersioning.id,
         fromVersion: '1.0.1-rc0',
         toVersion: '1.1.0',
       };
@@ -64,7 +62,7 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should contain toVersion unstable', async () => {
       const config = {
-        versionScheme: VERSION_SCHEME_NPM,
+        versioning: npmVersioning.id,
         fromVersion: '1.0.1',
         toVersion: '1.2.0-rc1',
       };
@@ -74,7 +72,7 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should contain both fromVersion toVersion unstable', async () => {
       const config = {
-        versionScheme: VERSION_SCHEME_NPM,
+        versioning: npmVersioning.id,
         fromVersion: '1.0.1-rc0',
         toVersion: '1.2.0-rc1',
       };
@@ -84,7 +82,7 @@ describe('workers/pr/changelog/releases', () => {
     });
     it('should valueToVersion', async () => {
       const config = {
-        versionScheme: VERSION_SCHEME_DOCKER,
+        versioning: dockerVersioning.id,
         fromVersion: '1.0.1-rc0',
         toVersion: '1.2.0-rc0',
       };
diff --git a/test/workers/repository/process/lookup/index.spec.ts b/test/workers/repository/process/lookup/index.spec.ts
index 2324380d1c..79d3945f4d 100644
--- a/test/workers/repository/process/lookup/index.spec.ts
+++ b/test/workers/repository/process/lookup/index.spec.ts
@@ -11,12 +11,10 @@ import * as _docker from '../../../../../lib/datasource/docker';
 import * as _gitSubmodules from '../../../../../lib/datasource/git-submodules';
 import { mocked, getConfig } from '../../../../util';
 import { CONFIG_VALIDATION } from '../../../../../lib/constants/error-messages';
-import {
-  VERSION_SCHEME_DOCKER,
-  VERSION_SCHEME_GIT,
-  VERSION_SCHEME_NPM,
-  VERSION_SCHEME_PEP440,
-} from '../../../../../lib/constants/version-schemes';
+import * as dockerVersioning from '../../../../../lib/versioning/docker';
+import * as gitVersioning from '../../../../../lib/versioning/git';
+import * as npmVersioning from '../../../../../lib/versioning/npm';
+import * as pep440Versioning from '../../../../../lib/versioning/pep440';
 
 import {
   DATASOURCE_DOCKER,
@@ -41,7 +39,7 @@ describe('workers/repository/process/lookup', () => {
   beforeEach(() => {
     config = getConfig();
     config.manager = 'npm';
-    config.versionScheme = VERSION_SCHEME_NPM;
+    config.versioning = npmVersioning.id;
     config.rangeStrategy = 'replace';
     global.repoCache = {};
     jest.resetAllMocks();
@@ -179,7 +177,7 @@ describe('workers/repository/process/lookup', () => {
       config.currentValue = '0.4.0';
       config.allowedVersions = '<1';
       config.depName = 'q';
-      config.versionScheme = VERSION_SCHEME_DOCKER; // this doesn't make sense but works for this test
+      config.versioning = dockerVersioning.id; // this doesn't make sense but works for this test
       config.datasource = DATASOURCE_NPM; // this doesn't make sense but works for this test
       nock('https://registry.npmjs.org')
         .get('/q')
@@ -1029,9 +1027,9 @@ describe('workers/repository/process/lookup', () => {
     });
     it('handles PEP440', async () => {
       config.manager = 'pip_requirements';
-      config.versionScheme = VERSION_SCHEME_PEP440;
+      config.versioning = pep440Versioning.id;
       config.manager = 'pip_requirements';
-      config.versionScheme = 'pep440';
+      config.versioning = 'pep440';
       config.rangeStrategy = 'pin';
       config.lockedVersion = '0.9.4';
       config.currentValue = '~=0.9';
@@ -1124,7 +1122,7 @@ describe('workers/repository/process/lookup', () => {
       it('skips uncompatible versions for ' + currentValue, async () => {
         config.currentValue = currentValue;
         config.depName = 'node';
-        config.versionScheme = VERSION_SCHEME_DOCKER;
+        config.versioning = dockerVersioning.id;
         config.datasource = DATASOURCE_DOCKER;
         docker.getPkgReleases.mockResolvedValueOnce({
           releases: [
@@ -1251,7 +1249,7 @@ describe('workers/repository/process/lookup', () => {
       expect(res).toMatchSnapshot();
     });
     it('handles git submodule update', async () => {
-      config.versionScheme = VERSION_SCHEME_GIT;
+      config.versioning = gitVersioning.id;
       config.datasource = DATASOURCE_GIT_SUBMODULES;
       gitSubmodules.getPkgReleases.mockResolvedValueOnce({
         releases: [
-- 
GitLab