diff --git a/lib/manager/pip_requirements/extract.js b/lib/manager/pip_requirements/extract.js index 70525fbdf322bdea468d1c26cdf4de761d90b930..ec6db816d49273e38e90765710d57963823eeda7 100644 --- a/lib/manager/pip_requirements/extract.js +++ b/lib/manager/pip_requirements/extract.js @@ -3,13 +3,12 @@ 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( - /\?<\w+>/g, - '?:' -)}\\s*`; -const specifierPattern = `${specifierPartPattern}(?:,${specifierPartPattern})*`; +const specifierPartPattern = `\\s*${rangePattern.replace(/\?<\w+>/g, '?:')}`; +const specifierPattern = `${specifierPartPattern}(?:\\s*,${specifierPartPattern})*`; +const dependencyPattern = `(${packagePattern})(${extrasPattern})(${specifierPattern})`; module.exports = { + dependencyPattern, packagePattern, extractPackageFile, }; @@ -25,10 +24,7 @@ function extractPackageFile(content) { } }); - const regex = new RegExp( - `^(${packagePattern})${extrasPattern}(${specifierPattern})$`, - 'g' - ); + const regex = new RegExp(`^${dependencyPattern}$`, 'g'); const deps = content .split('\n') .map((rawline, lineNumber) => { @@ -50,7 +46,7 @@ function extractPackageFile(content) { if (!matches) { return null; } - const [, depName, currentValue] = matches; + const [, depName, , currentValue] = matches; dep = { ...dep, depName, diff --git a/lib/manager/pip_requirements/update.js b/lib/manager/pip_requirements/update.js index 8d8140ead19e491c020fd360d63a29c4e4c1c4a2..7abccae162cb3943d8c815ff6c6ae2228c59d123 100644 --- a/lib/manager/pip_requirements/update.js +++ b/lib/manager/pip_requirements/update.js @@ -1,3 +1,5 @@ +const { dependencyPattern } = require('./extract'); + module.exports = { updateDependency, }; @@ -8,8 +10,8 @@ function updateDependency(fileContent, upgrade) { const lines = fileContent.split('\n'); const oldValue = lines[upgrade.lineNumber]; const newValue = oldValue.replace( - /^.+?(\s.*)?$/, - `${upgrade.depName}${upgrade.newValue}$1` + new RegExp(dependencyPattern), + `$1$2${upgrade.newValue}` ); lines[upgrade.lineNumber] = newValue; return lines.join('\n'); diff --git a/test/manager/pip_requirements/__snapshots__/update.spec.js.snap b/test/manager/pip_requirements/__snapshots__/update.spec.js.snap index dd8609c522c75ad0ebb5ba1d6201e1024bd5b746..70e8df81c789ae18c05923cead50450ea74d5baa 100644 --- a/test/manager/pip_requirements/__snapshots__/update.spec.js.snap +++ b/test/manager/pip_requirements/__snapshots__/update.spec.js.snap @@ -3,7 +3,7 @@ exports[`manager/pip_requirements/update updateDependency replaces existing value 1`] = ` "--index-url http://example.com/private-pypi/ # simple comment -url==1.0.1 +some-package==1.0.1 some-other-package==1.0.0 not_semver==1.9 @@ -21,7 +21,7 @@ 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 +celery [redis]==4.1.2 +foo [bar] == 3.2.1 # handles extra white space " `; diff --git a/test/manager/pip_requirements/update.spec.js b/test/manager/pip_requirements/update.spec.js index bf82236d41296cd4b398e8526743d15c6e6b09a6..8e5bad7fad08583905ce83c82c65d4a47d14272d 100644 --- a/test/manager/pip_requirements/update.spec.js +++ b/test/manager/pip_requirements/update.spec.js @@ -22,7 +22,7 @@ describe('manager/pip_requirements/update', () => { describe('updateDependency', () => { it('replaces existing value', () => { const upgrade = { - depName: 'url', + depName: 'some-package', lineNumber: 2, newValue: '==1.0.1', }; @@ -50,7 +50,7 @@ describe('manager/pip_requirements/update', () => { it('replaces existing value with extras', () => { const upgrade = { depName: 'celery', - lineNumber: 2, + lineNumber: 1, newValue: '==4.1.2', }; const res = updateDependency(requirements4, upgrade);