From 75737805c804f69f427e0f8147c463836b1af448 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Wed, 30 Sep 2020 11:02:25 +0200
Subject: [PATCH] refactor: rename compatibility -> constraints (#7308)

---
 docs/usage/configuration-options.md           | 16 +++++++-----
 .../__snapshots__/migration.spec.ts.snap      |  3 +++
 lib/config/definitions.ts                     |  5 ++--
 lib/config/migration.spec.ts                  |  3 +++
 lib/config/migration.ts                       |  4 +++
 lib/config/presets/internal/monorepo.ts       |  2 +-
 lib/config/validation.spec.ts                 |  4 +--
 lib/config/validation.ts                      |  6 ++++-
 lib/datasource/common.ts                      |  2 +-
 .../pypi/__snapshots__/index.spec.ts.snap     |  8 +++---
 lib/datasource/pypi/index.spec.ts             | 20 +++++++-------
 lib/datasource/pypi/index.ts                  | 22 ++++++++--------
 .../__snapshots__/artifacts.spec.ts.snap      |  8 +++---
 .../__snapshots__/extract.spec.ts.snap        | 14 +++++-----
 lib/manager/bundler/artifacts.spec.ts         |  8 +++---
 lib/manager/bundler/artifacts.ts              |  8 +++---
 lib/manager/bundler/extract.ts                |  6 ++---
 lib/manager/common.ts                         |  4 +--
 .../gomod/__snapshots__/extract.spec.ts.snap  |  4 +--
 lib/manager/gomod/artifacts.spec.ts           |  2 +-
 lib/manager/gomod/artifacts.ts                |  2 +-
 lib/manager/gomod/extract.spec.ts             |  4 +--
 lib/manager/gomod/extract.ts                  |  6 ++---
 .../extract/__snapshots__/index.spec.ts.snap  | 26 +++++++++----------
 .../locked-versions.spec.ts.snap              |  6 ++---
 lib/manager/npm/extract/index.ts              | 12 ++++-----
 .../npm/extract/locked-versions.spec.ts       |  2 +-
 lib/manager/npm/extract/locked-versions.ts    |  4 +--
 lib/manager/npm/post-update/lerna.spec.ts     |  4 +--
 lib/manager/npm/post-update/lerna.ts          |  4 +--
 .../npm/post-update/node-version.spec.ts      |  4 +--
 lib/manager/npm/post-update/node-version.ts   |  2 +-
 lib/manager/npm/post-update/npm.spec.ts       |  2 +-
 lib/manager/npm/post-update/npm.ts            |  2 +-
 lib/manager/npm/post-update/pnpm.spec.ts      |  2 +-
 lib/manager/npm/post-update/pnpm.ts           |  2 +-
 lib/manager/npm/post-update/yarn.spec.ts      |  6 ++---
 lib/manager/npm/post-update/yarn.ts           |  2 +-
 lib/manager/pipenv/artifacts.spec.ts          |  2 +-
 lib/manager/pipenv/artifacts.ts               |  4 +--
 .../poetry/__snapshots__/extract.spec.ts.snap |  2 +-
 lib/manager/poetry/artifacts.spec.ts          |  4 +--
 lib/manager/poetry/artifacts.ts               |  6 ++---
 lib/manager/poetry/extract.spec.ts            |  2 +-
 lib/manager/poetry/extract.ts                 |  8 +++---
 .../__snapshots__/manager-files.spec.ts.snap  |  2 +-
 .../__snapshots__/generate.spec.ts.snap       |  4 +--
 .../repository/updates/generate.spec.ts       |  6 ++---
 lib/workers/repository/updates/generate.ts    |  4 +--
 49 files changed, 152 insertions(+), 133 deletions(-)

diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index 00019c4cb0..8780d99fac 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -226,21 +226,25 @@ This is used to add a suffix to commit messages. Usually left empty except for i
 
 This is used to alter `commitMessage` and `prTitle` without needing to copy/paste the whole string. The "topic" is usually refers to the dependency being updated, e.g. `"dependency react"`.
 
-## compatibility
+## configWarningReuseIssue
+
+Renovate's default behaviour is to reuse/reopen a single Config Warning issue in each repository so as to keep the "noise" down. However for some people this has the downside that the config warning won't be sorted near the top if you view issues by creation date. Configure this option to `false` if you prefer Renovate to open a new issue whenever there is a config warning.
+
+## constraints
 
-This is used to manually restrict which versions are possible to upgrade to based on their language support. For now this only supports `python`, other compatibility restrictions will be added in the future.
+Constraints are used in package managers which use third party tools to update "artifacts" like lock files or checksum files. Typically, the constraint is detected automatically by Renovate from files within the repository and there is no need to manually configure it.
+
+Constraints are also used to manually restrict which _datasource_ versions are possible to upgrade to based on their language support. For now this only supports `python`, other compatibility restrictions will be added in the future.
 
 ```json
 {
-  "compatibility": {
+  "constraints": {
     "python": "2.7"
   }
 }
 ```
 
-## configWarningReuseIssue
-
-Renovate's default behaviour is to reuse/reopen a single Config Warning issue in each repository so as to keep the "noise" down. However for some people this has the downside that the config warning won't be sorted near the top if you view issues by creation date. Configure this option to `false` if you prefer Renovate to open a new issue whenever there is a config warning.
+Note: make sure not to mix this up with the term `compatibility`, which Renovate uses in the context of version releases, e.g. if a Docker image is `node:12.16.0-alpine` then the `-alpine` suffix represents `compatibility`.
 
 ## dependencyDashboard
 
diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap
index 0f201826dc..39751a29fc 100644
--- a/lib/config/__snapshots__/migration.spec.ts.snap
+++ b/lib/config/__snapshots__/migration.spec.ts.snap
@@ -42,6 +42,9 @@ Object {
   "branchPrefix": "renovate/",
   "commitMessage": "{{#if semanticCommitType}}{{semanticCommitType}}{{#if semanticCommitScope}}({{semanticCommitScope}}){{/if}}: {{/if}}some commit message",
   "commitMessageExtra": "{{currentValue}} something",
+  "constraints": Object {
+    "python": "3.7",
+  },
   "dependencyDashboard": true,
   "dependencyDashboardTitle": "foo",
   "enabled": true,
diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts
index 257d5657fb..f40d06829f 100644
--- a/lib/config/definitions.ts
+++ b/lib/config/definitions.ts
@@ -1580,8 +1580,9 @@ const options: RenovateOptions[] = [
     cli: false,
   },
   {
-    name: 'compatibility',
-    description: 'Configuration object for compatibility',
+    name: 'constraints',
+    description:
+      'Configuration object for define language or manager version constraints',
     type: 'object',
     default: {},
     mergeable: true,
diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts
index 08a2370b88..e6288c3b78 100644
--- a/lib/config/migration.spec.ts
+++ b/lib/config/migration.spec.ts
@@ -26,6 +26,9 @@ describe('config/migration', () => {
             password: 'some-password',
           },
         ],
+        compatibility: {
+          python: '3.7',
+        },
         extends: [':js-app', 'config:library', ':masterIssue'],
         maintainYarnLock: true,
         onboarding: 'false' as never,
diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index 70e3118117..19fb8296d4 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -487,6 +487,10 @@ export function migrateConfig(
           }
         }
         migratedConfig[key] = newArray;
+      } else if (key === 'compatibility' && is.object(val)) {
+        isMigrated = true;
+        migratedConfig.constraints = migratedConfig.compatibility;
+        delete migratedConfig.compatibility;
       } else if (is.object(val)) {
         const subMigrate = migrateConfig(
           migratedConfig[key] as RenovateConfig,
diff --git a/lib/config/presets/internal/monorepo.ts b/lib/config/presets/internal/monorepo.ts
index f7a4222dbf..982bc518f7 100644
--- a/lib/config/presets/internal/monorepo.ts
+++ b/lib/config/presets/internal/monorepo.ts
@@ -92,7 +92,7 @@ const repoGroups = {
     'https://github.com/mozilla-neutrino/neutrino-dev',
   ],
   nextjs: [
-    'https://github.com/zeit/next.js', // for compatibility
+    'https://github.com/zeit/next.js', // old repo
     'https://github.com/vercel/next.js',
   ],
   ngrx: 'https://github.com/ngrx/',
diff --git a/lib/config/validation.spec.ts b/lib/config/validation.spec.ts
index 73a9088b2e..583b5409e1 100644
--- a/lib/config/validation.spec.ts
+++ b/lib/config/validation.spec.ts
@@ -313,9 +313,9 @@ describe('config/validation', () => {
       expect(errors).toHaveLength(0);
     });
 
-    it('does not validate compatibility children', async () => {
+    it('does not validate constraints children', async () => {
       const config = {
-        compatibility: { packageRules: [{}] },
+        constraints: { packageRules: [{}] },
       };
       const { warnings, errors } = await configValidation.validateConfig(
         config,
diff --git a/lib/config/validation.ts b/lib/config/validation.ts
index c16210281d..c594eeda3d 100644
--- a/lib/config/validation.ts
+++ b/lib/config/validation.ts
@@ -361,7 +361,11 @@ export async function validateConfig(
               message: `Configuration option \`${currentPath}\` should be a string`,
             });
           }
-        } else if (type === 'object' && currentPath !== 'compatibility') {
+        } else if (
+          type === 'object' &&
+          currentPath !== 'compatibility' &&
+          currentPath !== 'constraints'
+        ) {
           if (is.plainObject(val)) {
             if (key === 'aliases') {
               if (!validateAliasObject(key, val)) {
diff --git a/lib/datasource/common.ts b/lib/datasource/common.ts
index 1ea807a037..eb7d02c38a 100644
--- a/lib/datasource/common.ts
+++ b/lib/datasource/common.ts
@@ -10,7 +10,7 @@ export interface DigestConfig extends Config {
 }
 
 interface ReleasesConfigBase {
-  compatibility?: Record<string, string>;
+  constraints?: Record<string, string>;
   npmrc?: string;
   registryUrls?: string[];
 }
diff --git a/lib/datasource/pypi/__snapshots__/index.spec.ts.snap b/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
index 167ff5ca4d..ab246638c8 100644
--- a/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
@@ -80,7 +80,7 @@ Array [
 ]
 `;
 
-exports[`datasource/pypi getReleases parses data-requires-python and respects compatibility from simple endpoint 1`] = `
+exports[`datasource/pypi getReleases parses data-requires-python and respects constraints from simple endpoint 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -105,7 +105,7 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getReleases parses data-requires-python and respects compatibility from simple endpoint 2`] = `
+exports[`datasource/pypi getReleases parses data-requires-python and respects constraints from simple endpoint 2`] = `
 Array [
   Object {
     "headers": Object {
@@ -365,7 +365,7 @@ Array [
 ]
 `;
 
-exports[`datasource/pypi getReleases respects compatibility 1`] = `
+exports[`datasource/pypi getReleases respects constraints 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -381,7 +381,7 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getReleases respects compatibility 2`] = `
+exports[`datasource/pypi getReleases respects constraints 2`] = `
 Array [
   Object {
     "headers": Object {
diff --git a/lib/datasource/pypi/index.spec.ts b/lib/datasource/pypi/index.spec.ts
index e34d0323f3..0177a07607 100644
--- a/lib/datasource/pypi/index.spec.ts
+++ b/lib/datasource/pypi/index.spec.ts
@@ -184,7 +184,7 @@ describe('datasource/pypi', () => {
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
 
-    it('respects compatibility', async () => {
+    it('respects constraints', async () => {
       httpMock
         .scope(baseUrl)
         .get('/doit/json')
@@ -205,7 +205,7 @@ describe('datasource/pypi', () => {
       expect(
         await getPkgReleases({
           datasource,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'doit',
         })
       ).toMatchSnapshot();
@@ -223,7 +223,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toMatchSnapshot();
@@ -241,7 +241,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toMatchSnapshot();
@@ -259,7 +259,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'image-collector',
         })
       ).toMatchSnapshot();
@@ -277,7 +277,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toBeNull();
@@ -295,7 +295,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toBeNull();
@@ -313,7 +313,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toBeNull();
@@ -338,7 +338,7 @@ describe('datasource/pypi', () => {
       expect(result).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
-    it('parses data-requires-python and respects compatibility from simple endpoint', async () => {
+    it('parses data-requires-python and respects constraints from simple endpoint', async () => {
       httpMock
         .scope('https://pypi.org/simple/')
         .get('/dj-database-url')
@@ -349,7 +349,7 @@ describe('datasource/pypi', () => {
       expect(
         await getPkgReleases({
           datasource,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           ...config,
           depName: 'dj-database-url',
         })
diff --git a/lib/datasource/pypi/index.ts b/lib/datasource/pypi/index.ts
index 82cb434f52..2e98b5e5b9 100644
--- a/lib/datasource/pypi/index.ts
+++ b/lib/datasource/pypi/index.ts
@@ -39,10 +39,10 @@ function normalizeName(input: string): string {
 
 function compatibleVersions(
   releases: Releases,
-  compatibility: Record<string, string>
+  constraints: Record<string, string>
 ): string[] {
   const versions = Object.keys(releases);
-  if (!(compatibility?.python && pep440.isVersion(compatibility.python))) {
+  if (!(constraints?.python && pep440.isVersion(constraints.python))) {
     return versions;
   }
   return versions.filter((version) =>
@@ -50,7 +50,7 @@ function compatibleVersions(
       if (!release.requires_python) {
         return true;
       }
-      return matches(compatibility.python, release.requires_python);
+      return matches(constraints.python, release.requires_python);
     })
   );
 }
@@ -58,7 +58,7 @@ function compatibleVersions(
 async function getDependency(
   packageName: string,
   hostUrl: string,
-  compatibility: Record<string, string>
+  constraints: Record<string, string>
 ): Promise<ReleaseResult | null> {
   const lookupUrl = url.resolve(hostUrl, `${packageName}/json`);
   const dependency: ReleaseResult = { releases: null };
@@ -121,7 +121,7 @@ async function getDependency(
 
   dependency.releases = [];
   if (dep.releases) {
-    const versions = compatibleVersions(dep.releases, compatibility);
+    const versions = compatibleVersions(dep.releases, constraints);
     dependency.releases = versions.map((version) => {
       const releases = dep.releases[version] || [];
       const { upload_time: releaseTimestamp } = releases[0] || {};
@@ -185,7 +185,7 @@ function cleanSimpleHtml(html: string): string {
 async function getSimpleDependency(
   packageName: string,
   hostUrl: string,
-  compatibility: Record<string, string>
+  constraints: Record<string, string>
 ): Promise<ReleaseResult | null> {
   const lookupUrl = url.resolve(hostUrl, `${packageName}`);
   const dependency: ReleaseResult = { releases: null };
@@ -214,7 +214,7 @@ async function getSimpleDependency(
       releases[version].push(release);
     }
   }
-  const versions = compatibleVersions(releases, compatibility);
+  const versions = compatibleVersions(releases, constraints);
   dependency.releases = versions.map((version) => {
     const versionReleases = releases[version] || [];
     const isDeprecated = versionReleases.some(({ yanked }) => yanked);
@@ -228,7 +228,7 @@ async function getSimpleDependency(
 }
 
 export async function getReleases({
-  compatibility,
+  constraints,
   lookupName,
   registryUrl,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
@@ -237,13 +237,13 @@ export async function getReleases({
   // not all simple indexes use this identifier, but most do
   if (hostUrl.endsWith('/simple/') || hostUrl.endsWith('/+simple/')) {
     logger.trace({ lookupName, hostUrl }, 'Looking up pypi simple dependency');
-    return getSimpleDependency(lookupName, hostUrl, compatibility);
+    return getSimpleDependency(lookupName, hostUrl, constraints);
   }
 
   logger.trace({ lookupName, hostUrl }, 'Looking up pypi api dependency');
   try {
     // we need to resolve early here so we can catch any 404s and fallback to a simple lookup
-    const releases = await getDependency(lookupName, hostUrl, compatibility);
+    const releases = await getDependency(lookupName, hostUrl, constraints);
     // the dep was found in the json api, return as-is
     return releases;
   } catch (err) {
@@ -259,7 +259,7 @@ export async function getReleases({
     const releases = await getSimpleDependency(
       lookupName,
       hostUrl,
-      compatibility
+      constraints
     );
     return releases;
   }
diff --git a/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap b/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
index 9ba6dcf644..8119b8875c 100644
--- a/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
@@ -47,7 +47,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker compatibility options 1`] = `
+exports[`bundler.updateArtifacts() Docker constraints options 1`] = `
 Array [
   Object {
     "file": Object {
@@ -58,7 +58,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker compatibility options 2`] = `
+exports[`bundler.updateArtifacts() Docker constraints options 2`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:latest",
@@ -142,7 +142,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker invalid compatibility options 1`] = `
+exports[`bundler.updateArtifacts() Docker invalid constraints options 1`] = `
 Array [
   Object {
     "file": Object {
@@ -153,7 +153,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker invalid compatibility options 2`] = `
+exports[`bundler.updateArtifacts() Docker invalid constraints options 2`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:latest",
diff --git a/lib/manager/bundler/__snapshots__/extract.spec.ts.snap b/lib/manager/bundler/__snapshots__/extract.spec.ts.snap
index dff3967352..8390b3f01d 100644
--- a/lib/manager/bundler/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/bundler/__snapshots__/extract.spec.ts.snap
@@ -2,7 +2,7 @@
 
 exports[`lib/manager/bundler/extract extractPackageFile() parse Ruby CI Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "2.0.2",
   },
   "deps": Array [
@@ -151,7 +151,7 @@ Object {
 
 exports[`lib/manager/bundler/extract extractPackageFile() parse mastodon Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "ruby": ">= 2.4.0",
   },
   "deps": Array [
@@ -1387,7 +1387,7 @@ Object {
 
 exports[`lib/manager/bundler/extract extractPackageFile() parse webpacker Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "1.17.3",
   },
   "deps": Array [
@@ -1448,7 +1448,7 @@ Object {
 
 exports[`lib/manager/bundler/extract extractPackageFile() parses rails Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "1.17.2",
   },
   "deps": Array [
@@ -2146,7 +2146,7 @@ Object {
 
 exports[`lib/manager/bundler/extract extractPackageFile() parses sourceGroups 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "ruby": "~> 1.5.3",
   },
   "deps": Array [
@@ -2216,7 +2216,7 @@ Object {
 
 exports[`lib/manager/bundler/extract parse Gitlab Foss Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "1.17.3",
   },
   "deps": Array [
@@ -4722,7 +4722,7 @@ Object {
 
 exports[`lib/manager/bundler/extract parse source blocks with spaces in Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "1.16.6",
   },
   "deps": Array [
diff --git a/lib/manager/bundler/artifacts.spec.ts b/lib/manager/bundler/artifacts.spec.ts
index 6e6d9f3d8a..77770cc17a 100644
--- a/lib/manager/bundler/artifacts.spec.ts
+++ b/lib/manager/bundler/artifacts.spec.ts
@@ -150,7 +150,7 @@ describe('bundler.updateArtifacts()', () => {
       ).toMatchSnapshot();
       expect(execSnapshots).toMatchSnapshot();
     });
-    it('compatibility options', async () => {
+    it('constraints options', async () => {
       fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
       fs.writeLocalFile.mockResolvedValueOnce(null as never);
       datasource.getPkgReleases.mockResolvedValueOnce({
@@ -174,7 +174,7 @@ describe('bundler.updateArtifacts()', () => {
             ...config,
             binarySource: BinarySource.Docker,
             dockerUser: 'foobar',
-            compatibility: {
+            constraints: {
               ruby: '1.2.5',
               bundler: '3.2.1',
             },
@@ -183,7 +183,7 @@ describe('bundler.updateArtifacts()', () => {
       ).toMatchSnapshot();
       expect(execSnapshots).toMatchSnapshot();
     });
-    it('invalid compatibility options', async () => {
+    it('invalid constraints options', async () => {
       fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
       fs.writeLocalFile.mockResolvedValueOnce(null as never);
       datasource.getPkgReleases.mockResolvedValueOnce({
@@ -207,7 +207,7 @@ describe('bundler.updateArtifacts()', () => {
             ...config,
             binarySource: BinarySource.Docker,
             dockerUser: 'foobar',
-            compatibility: {
+            constraints: {
               ruby: 'foo',
               bundler: 'bar',
             },
diff --git a/lib/manager/bundler/artifacts.ts b/lib/manager/bundler/artifacts.ts
index c0d0bbd228..93d5443b4c 100644
--- a/lib/manager/bundler/artifacts.ts
+++ b/lib/manager/bundler/artifacts.ts
@@ -26,8 +26,8 @@ async function getRubyConstraint(
   updateArtifact: UpdateArtifact
 ): Promise<string> {
   const { packageFileName, config } = updateArtifact;
-  const { compatibility = {} } = config;
-  const { ruby } = compatibility;
+  const { constraints = {} } = config;
+  const { ruby } = constraints;
 
   let rubyConstraint: string;
   if (ruby) {
@@ -72,7 +72,7 @@ export async function updateArtifacts(
     newPackageFileContent,
     config,
   } = updateArtifact;
-  const { compatibility = {} } = config;
+  const { constraints = {} } = config;
   logger.debug(`bundler.updateArtifacts(${packageFileName})`);
   const existingError = memCache.get<string>('bundlerArtifactsError');
   // istanbul ignore if
@@ -103,7 +103,7 @@ export async function updateArtifacts(
     }
 
     let bundlerVersion = '';
-    const { bundler } = compatibility;
+    const { bundler } = constraints;
     if (bundler) {
       if (isValid(bundler)) {
         logger.debug({ bundlerVersion: bundler }, 'Found bundler version');
diff --git a/lib/manager/bundler/extract.ts b/lib/manager/bundler/extract.ts
index 4f5115b315..1d9e4308ce 100644
--- a/lib/manager/bundler/extract.ts
+++ b/lib/manager/bundler/extract.ts
@@ -36,7 +36,7 @@ export async function extractPackageFile(
         regEx(`^ruby ${delimiter}([^${delimiter}]+)${delimiter}`).exec(line);
     }
     if (rubyMatch) {
-      res.compatibility = { ruby: rubyMatch[1] };
+      res.constraints = { ruby: rubyMatch[1] };
     }
     const gemMatchRegex = /^\s*gem\s+(['"])(?<depName>[^'"]+)\1(\s*,\s*(?<currentValue>(['"])[^'"]+\5(\s*,\s*\5[^'"]+\5)?))?/;
     const gemMatch = gemMatchRegex.exec(line);
@@ -194,8 +194,8 @@ export async function extractPackageFile(
       }
       const bundledWith = /\nBUNDLED WITH\n\s+(.*?)(\n|$)/.exec(lockContent);
       if (bundledWith) {
-        res.compatibility = res.compatibility || {};
-        res.compatibility.bundler = bundledWith[1];
+        res.constraints = res.constraints || {};
+        res.constraints.bundler = bundledWith[1];
       }
     }
   }
diff --git a/lib/manager/common.ts b/lib/manager/common.ts
index 57f36f7453..654e794898 100644
--- a/lib/manager/common.ts
+++ b/lib/manager/common.ts
@@ -37,7 +37,7 @@ export interface CustomExtractConfig extends ExtractConfig {
 
 export interface UpdateArtifactsConfig extends ManagerConfig {
   isLockFileMaintenance?: boolean;
-  compatibility?: Record<string, string>;
+  constraints?: Record<string, string>;
   cacheDir?: string;
   composerIgnorePlatformReqs?: boolean;
   currentValue?: string;
@@ -77,7 +77,7 @@ export interface PackageFile<T = Record<string, any>>
     ManagerData<T> {
   hasYarnWorkspaces?: boolean;
   internalPackages?: string[]; // TODO: remove
-  compatibility?: Record<string, string>;
+  constraints?: Record<string, string>;
   datasource?: string;
   registryUrls?: string[];
   deps: PackageDependency[];
diff --git a/lib/manager/gomod/__snapshots__/extract.spec.ts.snap b/lib/manager/gomod/__snapshots__/extract.spec.ts.snap
index 57882e72d9..aef12d91e4 100644
--- a/lib/manager/gomod/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/gomod/__snapshots__/extract.spec.ts.snap
@@ -1,8 +1,8 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`lib/manager/gomod/extract extractPackageFile() extracts compatibility 1`] = `
+exports[`lib/manager/gomod/extract extractPackageFile() extracts constraints 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "go": "1.13",
   },
   "deps": Array [
diff --git a/lib/manager/gomod/artifacts.spec.ts b/lib/manager/gomod/artifacts.spec.ts
index 0f4c9f5ed0..4bdc4e4ced 100644
--- a/lib/manager/gomod/artifacts.spec.ts
+++ b/lib/manager/gomod/artifacts.spec.ts
@@ -40,7 +40,7 @@ const config = {
   localDir: join('/tmp/github/some/repo'),
   cacheDir: join('/tmp/renovate/cache'),
   dockerUser: 'foobar',
-  compatibility: { go: '1.14' },
+  constraints: { go: '1.14' },
 };
 
 const goEnv = {
diff --git a/lib/manager/gomod/artifacts.ts b/lib/manager/gomod/artifacts.ts
index 0f4636ce94..3e82e6942a 100644
--- a/lib/manager/gomod/artifacts.ts
+++ b/lib/manager/gomod/artifacts.ts
@@ -68,7 +68,7 @@ export async function updateArtifacts({
       },
       docker: {
         image: 'renovate/go',
-        tagConstraint: config.compatibility?.go,
+        tagConstraint: config.constraints?.go,
         tagScheme: 'npm',
         volumes: [goPath],
         preCommands: getPreCommands(),
diff --git a/lib/manager/gomod/extract.spec.ts b/lib/manager/gomod/extract.spec.ts
index ae754c6cc1..cf9a944af6 100644
--- a/lib/manager/gomod/extract.spec.ts
+++ b/lib/manager/gomod/extract.spec.ts
@@ -17,10 +17,10 @@ describe('lib/manager/gomod/extract', () => {
       expect(res.filter((e) => e.skipReason)).toHaveLength(1);
       expect(res.filter((e) => e.depType === 'replace')).toHaveLength(1);
     });
-    it('extracts compatibility', () => {
+    it('extracts constraints', () => {
       const res = extractPackageFile(gomod3);
       expect(res).toMatchSnapshot();
-      expect(res.compatibility.go).toEqual('1.13');
+      expect(res.constraints.go).toEqual('1.13');
     });
     it('extracts multi-line requires', () => {
       const res = extractPackageFile(gomod2).deps;
diff --git a/lib/manager/gomod/extract.ts b/lib/manager/gomod/extract.ts
index 8e10d6e47b..1b7b33b0d0 100644
--- a/lib/manager/gomod/extract.ts
+++ b/lib/manager/gomod/extract.ts
@@ -44,14 +44,14 @@ function getDep(
 
 export function extractPackageFile(content: string): PackageFile | null {
   logger.trace({ content }, 'gomod.extractPackageFile()');
-  const compatibility: Record<string, any> = {};
+  const constraints: Record<string, any> = {};
   const deps: PackageDependency[] = [];
   try {
     const lines = content.split('\n');
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
       let line = lines[lineNumber];
       if (line.startsWith('go ') && validRange(line.replace('go ', ''))) {
-        compatibility.go = line.replace('go ', '');
+        constraints.go = line.replace('go ', '');
       }
       const replaceMatch = /^replace\s+[^\s]+[\s]+[=][>]\s+([^\s]+)\s+([^\s]+)/.exec(
         line
@@ -90,5 +90,5 @@ export function extractPackageFile(content: string): PackageFile | null {
   if (!deps.length) {
     return null;
   }
-  return { compatibility, deps };
+  return { constraints, deps };
 }
diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
index 0561a3cab0..ec3ed9ab2b 100644
--- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
+++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
@@ -2,7 +2,7 @@
 
 exports[`manager/npm/extract .extractPackageFile() catches invalid names 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "depName": "kgabis/parson",
@@ -30,7 +30,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts engines 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "node": ">= 8.9.2",
     "npm": "^8.0.0",
     "pnpm": "^1.2.0",
@@ -146,7 +146,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts non-npmjs 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "github:owner/a",
@@ -308,7 +308,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts npm package alias 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "1",
@@ -356,7 +356,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts volta 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "node": "8.9.2",
   },
   "deps": Array [
@@ -421,7 +421,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts volta yarn unknown-version 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "node": "8.9.2",
   },
   "deps": Array [
@@ -480,7 +480,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"npm" in lerna.json 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
@@ -615,7 +615,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"yarn" in lerna.json 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
@@ -750,7 +750,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds a lock file 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
@@ -885,7 +885,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds complex yarn workspaces 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [],
   "ignoreNpmrcFile": undefined,
   "lernaClient": "npm",
@@ -908,7 +908,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds lerna 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
@@ -1043,7 +1043,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds simple yarn workspaces 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [],
   "ignoreNpmrcFile": undefined,
   "lernaClient": "npm",
@@ -1066,7 +1066,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() returns an array of dependencies 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
diff --git a/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
index 31c43a6bc7..4223dc4e43 100644
--- a/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
+++ b/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
@@ -41,7 +41,7 @@ Array [
 exports[`manager/npm/extract/locked-versions .getLockedVersions() uses yarn.lock with yarn v1.22.0 1`] = `
 Array [
   Object {
-    "compatibility": Object {},
+    "constraints": Object {},
     "deps": Array [
       Object {
         "currentValue": "1.0.0",
@@ -63,7 +63,7 @@ Array [
 exports[`manager/npm/extract/locked-versions .getLockedVersions() uses yarn.lock with yarn v2.1.0 1`] = `
 Array [
   Object {
-    "compatibility": Object {
+    "constraints": Object {
       "yarn": ">= 2.0.0",
     },
     "deps": Array [
@@ -87,7 +87,7 @@ Array [
 exports[`manager/npm/extract/locked-versions .getLockedVersions() uses yarn.lock with yarn v2.2.0 1`] = `
 Array [
   Object {
-    "compatibility": Object {
+    "constraints": Object {
       "yarn": ">= 2.2.0",
     },
     "deps": Array [
diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts
index 0532e1cb86..affab3ae10 100644
--- a/lib/manager/npm/extract/index.ts
+++ b/lib/manager/npm/extract/index.ts
@@ -151,7 +151,7 @@ export async function extractPackageFile(
     resolutions: 'resolutions',
   };
 
-  const compatibility: Record<string, any> = {};
+  const constraints: Record<string, any> = {};
 
   function extractDependency(
     depType: string,
@@ -173,19 +173,19 @@ export async function extractPackageFile(
         dep.datasource = datasourceGithubTags.id;
         dep.lookupName = 'nodejs/node';
         dep.versioning = nodeVersioning.id;
-        compatibility.node = dep.currentValue;
+        constraints.node = dep.currentValue;
       } else if (depName === 'yarn') {
         dep.datasource = datasourceNpm.id;
         dep.commitMessageTopic = 'Yarn';
-        compatibility.yarn = dep.currentValue;
+        constraints.yarn = dep.currentValue;
       } else if (depName === 'npm') {
         dep.datasource = datasourceNpm.id;
         dep.commitMessageTopic = 'npm';
-        compatibility.npm = dep.currentValue;
+        constraints.npm = dep.currentValue;
       } else if (depName === 'pnpm') {
         dep.datasource = datasourceNpm.id;
         dep.commitMessageTopic = 'pnpm';
-        compatibility.pnpm = dep.currentValue;
+        constraints.pnpm = dep.currentValue;
       } else {
         dep.skipReason = SkipReason.UnknownEngines;
       }
@@ -363,7 +363,7 @@ export async function extractPackageFile(
     lernaPackages,
     skipInstalls,
     yarnWorkspacesPackages,
-    compatibility,
+    constraints,
   };
 }
 
diff --git a/lib/manager/npm/extract/locked-versions.spec.ts b/lib/manager/npm/extract/locked-versions.spec.ts
index 35de12dcc7..90348d08b1 100644
--- a/lib/manager/npm/extract/locked-versions.spec.ts
+++ b/lib/manager/npm/extract/locked-versions.spec.ts
@@ -26,7 +26,7 @@ describe('manager/npm/extract/locked-versions', () => {
           {
             npmLock: 'package-lock.json',
             yarnLock: 'yarn.lock',
-            compatibility: {},
+            constraints: {},
             deps: [
               {
                 depName: 'a',
diff --git a/lib/manager/npm/extract/locked-versions.ts b/lib/manager/npm/extract/locked-versions.ts
index 622bd103d1..a54dcb7de3 100644
--- a/lib/manager/npm/extract/locked-versions.ts
+++ b/lib/manager/npm/extract/locked-versions.ts
@@ -21,9 +21,9 @@ export async function getLockedVersions(
       if (!isYarn1) {
         if (cacheVersion >= 6) {
           // https://github.com/yarnpkg/berry/commit/f753790380cbda5b55d028ea84b199445129f9ba
-          packageFile.compatibility.yarn = '>= 2.2.0';
+          packageFile.constraints.yarn = '>= 2.2.0';
         } else {
-          packageFile.compatibility.yarn = '>= 2.0.0';
+          packageFile.constraints.yarn = '>= 2.0.0';
         }
       }
       for (const dep of packageFile.deps) {
diff --git a/lib/manager/npm/post-update/lerna.spec.ts b/lib/manager/npm/post-update/lerna.spec.ts
index bd42333e0c..ba8881a408 100644
--- a/lib/manager/npm/post-update/lerna.spec.ts
+++ b/lib/manager/npm/post-update/lerna.spec.ts
@@ -75,7 +75,7 @@ describe(getName(__filename), () => {
       const res = await lernaHelper.generateLockFiles(
         lernaPkgFile('yarn'),
         'some-dir',
-        { compatibility: { yarn: '^1.10.0' } },
+        { constraints: { yarn: '^1.10.0' } },
         {}
       );
       expect(execSnapshots).toMatchSnapshot();
@@ -99,7 +99,7 @@ describe(getName(__filename), () => {
         'some-dir',
         {
           dockerMapDotfiles: true,
-          compatibility: { npm: '^6.0.0' },
+          constraints: { npm: '^6.0.0' },
         },
         {}
       );
diff --git a/lib/manager/npm/post-update/lerna.ts b/lib/manager/npm/post-update/lerna.ts
index d467c95fdc..a70dbd2fc0 100644
--- a/lib/manager/npm/post-update/lerna.ts
+++ b/lib/manager/npm/post-update/lerna.ts
@@ -45,7 +45,7 @@ export async function generateLockFiles(
   try {
     if (lernaClient === 'yarn') {
       let installYarn = 'npm i -g yarn';
-      const yarnCompatibility = config.compatibility?.yarn;
+      const yarnCompatibility = config.constraints?.yarn;
       if (validRange(yarnCompatibility)) {
         installYarn += `@${quote(yarnCompatibility)}`;
       }
@@ -56,7 +56,7 @@ export async function generateLockFiles(
       cmdOptions = '--ignore-scripts --ignore-engines --ignore-platform';
     } else if (lernaClient === 'npm') {
       let installNpm = 'npm i -g npm';
-      const npmCompatibility = config.compatibility?.npm;
+      const npmCompatibility = config.constraints?.npm;
       if (validRange(npmCompatibility)) {
         installNpm += `@${quote(npmCompatibility)}`;
         preCommands.push(installNpm);
diff --git a/lib/manager/npm/post-update/node-version.spec.ts b/lib/manager/npm/post-update/node-version.spec.ts
index 06622fec82..36702afb45 100644
--- a/lib/manager/npm/post-update/node-version.spec.ts
+++ b/lib/manager/npm/post-update/node-version.spec.ts
@@ -6,7 +6,7 @@ jest.mock('../../../util/fs');
 describe('getNodeConstraint', () => {
   const config = {
     packageFile: 'package.json',
-    compatibility: { node: '^12.16.0' },
+    constraints: { node: '^12.16.0' },
   };
   it('returns package.json range', async () => {
     fs.readLocalFile = jest.fn();
@@ -39,7 +39,7 @@ describe('getNodeConstraint', () => {
     fs.readLocalFile = jest.fn();
     fs.readLocalFile.mockResolvedValueOnce(null);
     fs.readLocalFile.mockResolvedValueOnce(null);
-    const res = await getNodeConstraint({ ...config, compatibility: null });
+    const res = await getNodeConstraint({ ...config, constraints: null });
     expect(res).toBeNull();
   });
 });
diff --git a/lib/manager/npm/post-update/node-version.ts b/lib/manager/npm/post-update/node-version.ts
index c6391a6cd9..adaf0dff9c 100644
--- a/lib/manager/npm/post-update/node-version.ts
+++ b/lib/manager/npm/post-update/node-version.ts
@@ -19,7 +19,7 @@ async function getNodeFile(filename: string): Promise<string> | null {
 }
 
 function getPackageJsonConstraint(config: PostUpdateConfig): string | null {
-  const constraint: string = config.compatibility?.node;
+  const constraint: string = config.constraints?.node;
   if (constraint && validRange(constraint)) {
     logger.debug(`Using node constraint "${constraint}" from package.json`);
     return constraint;
diff --git a/lib/manager/npm/post-update/npm.spec.ts b/lib/manager/npm/post-update/npm.spec.ts
index bac9acd302..ce9c65c025 100644
--- a/lib/manager/npm/post-update/npm.spec.ts
+++ b/lib/manager/npm/post-update/npm.spec.ts
@@ -166,7 +166,7 @@ describe('generateLockFile', () => {
       'some-dir',
       {},
       'package-lock.json',
-      { binarySource: BinarySource.Docker, compatibility: { npm: '^6.0.0' } }
+      { binarySource: BinarySource.Docker, constraints: { npm: '^6.0.0' } }
     );
     expect(fs.readFile).toHaveBeenCalledTimes(1);
     expect(res.lockFile).toEqual('package-lock-contents');
diff --git a/lib/manager/npm/post-update/npm.ts b/lib/manager/npm/post-update/npm.ts
index 6e26b64711..7e60bd0b4d 100644
--- a/lib/manager/npm/post-update/npm.ts
+++ b/lib/manager/npm/post-update/npm.ts
@@ -27,7 +27,7 @@ export async function generateLockFile(
   let lockFile = null;
   try {
     let installNpm = 'npm i -g npm';
-    const npmCompatibility = config.compatibility?.npm;
+    const npmCompatibility = config.constraints?.npm;
     if (validRange(npmCompatibility)) {
       installNpm += `@${quote(npmCompatibility)}`;
     }
diff --git a/lib/manager/npm/post-update/pnpm.spec.ts b/lib/manager/npm/post-update/pnpm.spec.ts
index d79995ee8f..83026fd337 100644
--- a/lib/manager/npm/post-update/pnpm.spec.ts
+++ b/lib/manager/npm/post-update/pnpm.spec.ts
@@ -20,7 +20,7 @@ delete process.env.NPM_CONFIG_CACHE;
 describe('generateLockFile', () => {
   let config: PostUpdateConfig;
   beforeEach(() => {
-    config = { cacheDir: 'some-cache-dir', compatibility: { pnpm: '^2.0.0' } };
+    config = { cacheDir: 'some-cache-dir', constraints: { pnpm: '^2.0.0' } };
     env.getChildProcessEnv.mockReturnValue(envMock.basic);
   });
   it('generates lock files', async () => {
diff --git a/lib/manager/npm/post-update/pnpm.ts b/lib/manager/npm/post-update/pnpm.ts
index fce7c21ab5..efcca41712 100644
--- a/lib/manager/npm/post-update/pnpm.ts
+++ b/lib/manager/npm/post-update/pnpm.ts
@@ -28,7 +28,7 @@ export async function generateLockFile(
   let cmd = 'pnpm';
   try {
     let installPnpm = 'npm i -g pnpm';
-    const pnpmCompatibility = config.compatibility?.pnpm;
+    const pnpmCompatibility = config.constraints?.pnpm;
     if (validRange(pnpmCompatibility)) {
       installPnpm += `@${quote(pnpmCompatibility)}`;
     }
diff --git a/lib/manager/npm/post-update/yarn.spec.ts b/lib/manager/npm/post-update/yarn.spec.ts
index 926b6c189e..cb0e1ddc93 100644
--- a/lib/manager/npm/post-update/yarn.spec.ts
+++ b/lib/manager/npm/post-update/yarn.spec.ts
@@ -49,7 +49,7 @@ describe(getName(__filename), () => {
       });
       const config = {
         dockerMapDotfiles: true,
-        compatibility: {
+        constraints: {
           yarn: yarnCompatibility,
         },
         postUpdateOptions: ['yarnDedupeFewer', 'yarnDedupeHighest'],
@@ -77,7 +77,7 @@ describe(getName(__filename), () => {
         );
       });
       const config = {
-        compatibility: {
+        constraints: {
           yarn: yarnVersion === '1.22.0' ? '^1.10.0' : '>= 2.0.0',
         },
       };
@@ -135,7 +135,7 @@ describe(getName(__filename), () => {
       });
       const config = {
         dockerMapDotfiles: true,
-        compatibility: {
+        constraints: {
           yarn: yarnCompatibility,
         },
         postUpdateOptions: ['yarnDedupeFewer', 'yarnDedupeHighest'],
diff --git a/lib/manager/npm/post-update/yarn.ts b/lib/manager/npm/post-update/yarn.ts
index d91b73b70a..addc60925f 100644
--- a/lib/manager/npm/post-update/yarn.ts
+++ b/lib/manager/npm/post-update/yarn.ts
@@ -47,7 +47,7 @@ export async function generateLockFile(
   logger.debug(`Spawning yarn install to create ${lockFileName}`);
   let lockFile = null;
   try {
-    const yarnCompatibility = config.compatibility?.yarn;
+    const yarnCompatibility = config.constraints?.yarn;
     const minYarnVersion =
       validRange(yarnCompatibility) && minVersion(yarnCompatibility);
     const isYarn1 = !minYarnVersion || minYarnVersion.major === 1;
diff --git a/lib/manager/pipenv/artifacts.spec.ts b/lib/manager/pipenv/artifacts.spec.ts
index 40dd136d33..95de3ddb70 100644
--- a/lib/manager/pipenv/artifacts.spec.ts
+++ b/lib/manager/pipenv/artifacts.spec.ts
@@ -97,7 +97,7 @@ describe('.updateArtifacts()', () => {
         packageFileName: 'Pipfile',
         updatedDeps: [],
         newPackageFileContent: 'some new content',
-        config: { ...config, compatibility: { python: '3.7' } },
+        config: { ...config, constraints: { python: '3.7' } },
       })
     ).not.toBeNull();
     expect(execSnapshots).toMatchSnapshot();
diff --git a/lib/manager/pipenv/artifacts.ts b/lib/manager/pipenv/artifacts.ts
index f27b6f6001..3359e60288 100644
--- a/lib/manager/pipenv/artifacts.ts
+++ b/lib/manager/pipenv/artifacts.ts
@@ -17,8 +17,8 @@ function getPythonConstraint(
   existingLockFileContent: string,
   config: UpdateArtifactsConfig
 ): string | undefined | null {
-  const { compatibility = {} } = config;
-  const { python } = compatibility;
+  const { constraints = {} } = config;
+  const { python } = constraints;
 
   if (python) {
     logger.debug('Using python constraint from config');
diff --git a/lib/manager/poetry/__snapshots__/extract.spec.ts.snap b/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
index 87bf69039f..3b0748c87d 100644
--- a/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
@@ -9,7 +9,7 @@ Array [
 
 exports[`lib/manager/poetry/extract extractPackageFile() extracts mixed versioning types 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "0.2",
diff --git a/lib/manager/poetry/artifacts.spec.ts b/lib/manager/poetry/artifacts.spec.ts
index 4021424b6c..00d6fe4d77 100644
--- a/lib/manager/poetry/artifacts.spec.ts
+++ b/lib/manager/poetry/artifacts.spec.ts
@@ -151,7 +151,7 @@ describe('.updateArtifacts()', () => {
         newPackageFileContent: '{}',
         config: {
           ...config,
-          compatibility: { python: '~2.7 || ^3.4' },
+          constraints: { python: '~2.7 || ^3.4' },
         },
       })
     ).not.toBeNull();
@@ -180,7 +180,7 @@ describe('.updateArtifacts()', () => {
         newPackageFileContent: '{}',
         config: {
           ...config,
-          compatibility: { poetry: 'poetry>=1.0' },
+          constraints: { poetry: 'poetry>=1.0' },
         },
       })
     ).not.toBeNull();
diff --git a/lib/manager/poetry/artifacts.ts b/lib/manager/poetry/artifacts.ts
index 74e01674c3..0b44638b16 100644
--- a/lib/manager/poetry/artifacts.ts
+++ b/lib/manager/poetry/artifacts.ts
@@ -21,8 +21,8 @@ function getPythonConstraint(
   existingLockFileContent: string,
   config: UpdateArtifactsConfig
 ): string | undefined | null {
-  const { compatibility = {} } = config;
-  const { python } = compatibility;
+  const { constraints = {} } = config;
+  const { python } = constraints;
 
   if (python) {
     logger.debug('Using python constraint from config');
@@ -120,7 +120,7 @@ export async function updateArtifacts({
       }
     }
     const tagConstraint = getPythonConstraint(existingLockFileContent, config);
-    const poetryRequirement = config.compatibility?.poetry || 'poetry';
+    const poetryRequirement = config.constraints?.poetry || 'poetry';
     const poetryInstall = 'pip install ' + quote(poetryRequirement);
     const extraEnv = getSourceCredentialVars(
       newPackageFileContent,
diff --git a/lib/manager/poetry/extract.spec.ts b/lib/manager/poetry/extract.spec.ts
index a9a2feca6e..f0b812696e 100644
--- a/lib/manager/poetry/extract.spec.ts
+++ b/lib/manager/poetry/extract.spec.ts
@@ -62,7 +62,7 @@ describe('lib/manager/poetry/extract', () => {
       const res = extractPackageFile(pyproject1toml, filename);
       expect(res.deps).toMatchSnapshot();
       expect(res.deps).toHaveLength(9);
-      expect(res.compatibility).toEqual({
+      expect(res.constraints).toEqual({
         poetry: 'poetry>=1.0 wheel',
         python: '~2.7 || ^3.4',
       });
diff --git a/lib/manager/poetry/extract.ts b/lib/manager/poetry/extract.ts
index 917fd5285a..cc4ee05fd9 100644
--- a/lib/manager/poetry/extract.ts
+++ b/lib/manager/poetry/extract.ts
@@ -112,22 +112,22 @@ export function extractPackageFile(
     return null;
   }
 
-  const compatibility: Record<string, any> = {};
+  const constraints: Record<string, any> = {};
 
   // https://python-poetry.org/docs/pyproject/#poetry-and-pep-517
   if (
     pyprojectfile['build-system']?.['build-backend'] === 'poetry.masonry.api'
   ) {
-    compatibility.poetry = pyprojectfile['build-system']?.requires.join(' ');
+    constraints.poetry = pyprojectfile['build-system']?.requires.join(' ');
   }
 
   if (is.nonEmptyString(pyprojectfile.tool?.poetry?.dependencies?.python)) {
-    compatibility.python = pyprojectfile.tool?.poetry?.dependencies?.python;
+    constraints.python = pyprojectfile.tool?.poetry?.dependencies?.python;
   }
 
   return {
     deps,
     registryUrls: extractRegistries(pyprojectfile),
-    compatibility,
+    constraints,
   };
 }
diff --git a/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap b/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap
index d6d8b83fa1..2ea2cac148 100644
--- a/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap
+++ b/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap
@@ -3,7 +3,7 @@
 exports[`workers/repository/extract/manager-files getManagerPackageFiles() returns files with extractAllPackageFiles 1`] = `
 Array [
   Object {
-    "compatibility": Object {},
+    "constraints": Object {},
     "deps": Array [
       Object {
         "currentValue": "2.0.0",
diff --git a/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap b/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
index 67ad999a27..ca3db6457d 100644
--- a/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
+++ b/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
@@ -13,7 +13,7 @@ Object {
   "branchName": "some-branch",
   "canBeUnpublished": false,
   "commitMessage": "",
-  "compatibility": Object {},
+  "constraints": Object {},
   "depName": "some-dep",
   "dependencyDashboardApproval": false,
   "dependencyDashboardPrApproval": false,
@@ -74,7 +74,7 @@ Object {
 | ---------- | --------------- | ----- | ----- |
 | npm        | @types/some-dep | 0.5.7 | 0.5.8 |
 ",
-  "compatibility": Object {},
+  "constraints": Object {},
   "datasource": "npm",
   "depName": "some-dep",
   "dependencyDashboardApproval": false,
diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts
index b176bdfddb..d6b94b835c 100644
--- a/lib/workers/repository/updates/generate.spec.ts
+++ b/lib/workers/repository/updates/generate.spec.ts
@@ -74,7 +74,7 @@ describe('workers/repository/updates/generate', () => {
           releaseTimestamp: '2017-02-07T20:01:41+00:00',
           canBeUnpublished: false,
           automerge: true,
-          compatibility: {
+          constraints: {
             foo: '1.0.0',
           },
         },
@@ -94,7 +94,7 @@ describe('workers/repository/updates/generate', () => {
           releaseTimestamp: '2017-02-06T20:01:41+00:00',
           canBeUnpublished: true,
           automerge: false,
-          compatibility: {
+          constraints: {
             foo: '1.0.0',
             bar: '2.0.0',
           },
@@ -123,7 +123,7 @@ describe('workers/repository/updates/generate', () => {
       expect(res.releaseTimestamp).toEqual('2017-02-07T20:01:41+00:00');
       expect(res.canBeUnpublished).toBe(true);
       expect(res.automerge).toBe(false);
-      expect(res.compatibility).toEqual({
+      expect(res.constraints).toEqual({
         foo: '1.0.0',
         bar: '2.0.0',
       });
diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts
index 59daac300a..22a51fe088 100644
--- a/lib/workers/repository/updates/generate.ts
+++ b/lib/workers/repository/updates/generate.ts
@@ -304,9 +304,9 @@ export function generateBranchConfig(
   config.blockedByPin = config.upgrades.every(
     (upgrade) => upgrade.blockedByPin
   );
-  config.compatibility = Object.assign(
+  config.constraints = Object.assign(
     {},
-    ...config.upgrades.map((upgrade) => upgrade.compatibility)
+    ...config.upgrades.map((upgrade) => upgrade.constraints)
   );
   const tableRows = config.upgrades
     .map((upgrade) => getTableValues(upgrade))
-- 
GitLab