From 483702b8afba491f5632fa86d02cd2b3256d0388 Mon Sep 17 00:00:00 2001 From: Ayoub Kaanich <kayoub5@live.com> Date: Thu, 1 Nov 2018 11:46:00 +0100 Subject: [PATCH] feat: Support pip_requirements extras --- lib/manager/pip_requirements/extract.js | 6 ++++- .../pip_requirements/requirements4.txt | 3 +++ .../__snapshots__/extract.spec.js.snap | 26 +++++++++++++++++++ .../__snapshots__/update.spec.js.snap | 7 +++++ test/manager/pip_requirements/extract.spec.js | 10 +++++++ test/manager/pip_requirements/update.spec.js | 17 ++++++++++++ 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 test/_fixtures/pip_requirements/requirements4.txt diff --git a/lib/manager/pip_requirements/extract.js b/lib/manager/pip_requirements/extract.js index 5288056399..7637e469d2 100644 --- a/lib/manager/pip_requirements/extract.js +++ b/lib/manager/pip_requirements/extract.js @@ -1,5 +1,6 @@ // based on https://www.python.org/dev/peps/pep-0508/#names const packagePattern = '[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]'; +const extrasPattern = '(?:\\s*\\[[^\\]]+\\])?'; const rangePattern = require('@renovate/pep440/lib/specifier').RANGE_PATTERN; const specifierPartPattern = `\\s*${rangePattern.replace( @@ -24,7 +25,10 @@ function extractDependencies(content) { } }); - const regex = new RegExp(`^(${packagePattern})(${specifierPattern})$`, 'g'); + const regex = new RegExp( + `^(${packagePattern})${extrasPattern}(${specifierPattern})$`, + 'g' + ); const deps = content .split('\n') .map((rawline, lineNumber) => { diff --git a/test/_fixtures/pip_requirements/requirements4.txt b/test/_fixtures/pip_requirements/requirements4.txt new file mode 100644 index 0000000000..7f992217f4 --- /dev/null +++ b/test/_fixtures/pip_requirements/requirements4.txt @@ -0,0 +1,3 @@ +Django[argon2]==2.0.8 +celery [redis]==4.1.1 +foo [bar] == 3.2.1 # handles extra white space diff --git a/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap b/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap index 57ff0f6f86..c62ba779ff 100644 --- a/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap +++ b/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap @@ -115,3 +115,29 @@ Array [ }, ] `; + +exports[`lib/manager/pip_requirements/extract extractDependencies() handles extras 1`] = ` +Array [ + Object { + "currentValue": "==2.0.8", + "depName": "Django", + "lineNumber": 0, + "purl": "pkg:pypi/Django", + "versionScheme": "pep440", + }, + Object { + "currentValue": "==4.1.1", + "depName": "celery", + "lineNumber": 1, + "purl": "pkg:pypi/celery", + "versionScheme": "pep440", + }, + Object { + "currentValue": " == 3.2.1", + "depName": "foo", + "lineNumber": 2, + "purl": "pkg:pypi/foo", + "versionScheme": "pep440", + }, +] +`; diff --git a/test/manager/pip_requirements/__snapshots__/update.spec.js.snap b/test/manager/pip_requirements/__snapshots__/update.spec.js.snap index aa8a297378..dd8609c522 100644 --- a/test/manager/pip_requirements/__snapshots__/update.spec.js.snap +++ b/test/manager/pip_requirements/__snapshots__/update.spec.js.snap @@ -18,3 +18,10 @@ psycopg2==2.4.6 # renovate: wsgiref==0.1.2 # something else " `; + +exports[`manager/pip_requirements/update updateDependency replaces existing value with extras 1`] = ` +"Django[argon2]==2.0.8 +celery [redis]==4.1.1 +celery==4.1.2 [bar] == 3.2.1 # handles extra white space +" +`; diff --git a/test/manager/pip_requirements/extract.spec.js b/test/manager/pip_requirements/extract.spec.js index 9904e56da4..d08463120e 100644 --- a/test/manager/pip_requirements/extract.spec.js +++ b/test/manager/pip_requirements/extract.spec.js @@ -16,6 +16,11 @@ const requirements3 = fs.readFileSync( 'utf8' ); +const requirements4 = fs.readFileSync( + 'test/_fixtures/pip_requirements/requirements4.txt', + 'utf8' +); + describe('lib/manager/pip_requirements/extract', () => { describe('extractDependencies()', () => { let config; @@ -40,5 +45,10 @@ describe('lib/manager/pip_requirements/extract', () => { expect(res).toMatchSnapshot(); expect(res).toHaveLength(5); }); + it('handles extras', () => { + const res = extractDependencies(requirements4, config).deps; + expect(res).toMatchSnapshot(); + expect(res).toHaveLength(3); + }); }); }); diff --git a/test/manager/pip_requirements/update.spec.js b/test/manager/pip_requirements/update.spec.js index 3caa64fb2f..bf82236d41 100644 --- a/test/manager/pip_requirements/update.spec.js +++ b/test/manager/pip_requirements/update.spec.js @@ -13,6 +13,11 @@ const requirements3 = fs.readFileSync( 'utf8' ); +const requirements4 = fs.readFileSync( + 'test/_fixtures/pip_requirements/requirements4.txt', + 'utf8' +); + describe('manager/pip_requirements/update', () => { describe('updateDependency', () => { it('replaces existing value', () => { @@ -41,5 +46,17 @@ describe('manager/pip_requirements/update', () => { expect(res).not.toEqual(requirements3); expect(res.includes(upgrade.newValue)).toBe(true); }); + + it('replaces existing value with extras', () => { + const upgrade = { + depName: 'celery', + lineNumber: 2, + newValue: '==4.1.2', + }; + const res = updateDependency(requirements4, upgrade); + expect(res).toMatchSnapshot(); + expect(res).not.toEqual(requirements4); + expect(res.includes(upgrade.newValue)).toBe(true); + }); }); }); -- GitLab