diff --git a/lib/manager/pip_requirements/__fixtures__/requirements1.txt b/lib/manager/pip_requirements/__fixtures__/requirements1.txt index 23aaa25e901908d76331009ad60889acad1fbdf0..fbee0f3f4272d3c9827e0a71cd3fc73661e604b9 100644 --- a/lib/manager/pip_requirements/__fixtures__/requirements1.txt +++ b/lib/manager/pip_requirements/__fixtures__/requirements1.txt @@ -3,4 +3,4 @@ some-package==0.3.1 some-other-package==1.0.0 not_semver==1.9 - +unconstrained diff --git a/lib/manager/pip_requirements/__snapshots__/extract.spec.ts.snap b/lib/manager/pip_requirements/__snapshots__/extract.spec.ts.snap index 325dfdbde1116a8de9865fa308b88b1bb1e3b76f..b0c232a42c19db48719fbb199ef4320fec922f9e 100644 --- a/lib/manager/pip_requirements/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/pip_requirements/__snapshots__/extract.spec.ts.snap @@ -63,6 +63,37 @@ Array [ ] `; +exports[`manager/pip_requirements/extract extractPackageFile() extracts using extractAllPackageFiles 1`] = ` +Array [ + Object { + "deps": Array [ + Object { + "currentValue": "==0.3.1", + "currentVersion": "0.3.1", + "datasource": "pypi", + "depName": "some-package", + }, + Object { + "currentValue": "==1.0.0", + "currentVersion": "1.0.0", + "datasource": "pypi", + "depName": "some-other-package", + }, + Object { + "currentValue": "==1.9", + "currentVersion": "1.9", + "datasource": "pypi", + "depName": "not_semver", + }, + ], + "packageFile": "unused_file_name", + "registryUrls": Array [ + "http://example.com/private-pypi/", + ], + }, +] +`; + exports[`manager/pip_requirements/extract extractPackageFile() handles comments and commands 1`] = ` Array [ Object { diff --git a/lib/manager/pip_requirements/extract.spec.ts b/lib/manager/pip_requirements/extract.spec.ts index b73af574fa7bb2447882b6c7d025bd8cdb73e023..471d7bd72b7c8a5daf630c9fc3a09427994aba94 100644 --- a/lib/manager/pip_requirements/extract.spec.ts +++ b/lib/manager/pip_requirements/extract.spec.ts @@ -1,6 +1,8 @@ -import { getName, loadFixture } from '../../../test/util'; +import { fs, getName, loadFixture } from '../../../test/util'; import { setAdminConfig } from '../../config/admin'; -import { extractPackageFile } from './extract'; +import { extractAllPackageFiles, extractPackageFile } from './extract'; + +jest.mock('../../util/fs'); const requirements1 = loadFixture('requirements1.txt'); const requirements2 = loadFixture('requirements2.txt'); @@ -41,6 +43,16 @@ describe(getName(), () => { expect(res.registryUrls).toEqual(['http://example.com/private-pypi/']); expect(res.deps).toHaveLength(3); }); + it('extracts using extractAllPackageFiles', async () => { + fs.readLocalFile.mockResolvedValueOnce(requirements1); + const outerRes = await extractAllPackageFiles(config, [ + 'unused_file_name', + ]); + expect(outerRes).toMatchSnapshot(); + const [res] = outerRes; + expect(res.registryUrls).toEqual(['http://example.com/private-pypi/']); + expect(res.deps).toHaveLength(3); + }); it('extracts multiple dependencies', () => { const res = extractPackageFile( requirements2, diff --git a/lib/manager/pip_requirements/extract.ts b/lib/manager/pip_requirements/extract.ts index f5e357bbea95ec7775e8f11cf2bc545e6f4b0680..64070e88b1a882a9164e48a98d3aac3280d823ad 100644 --- a/lib/manager/pip_requirements/extract.ts +++ b/lib/manager/pip_requirements/extract.ts @@ -4,6 +4,7 @@ import { getAdminConfig } from '../../config/admin'; import * as datasourcePypi from '../../datasource/pypi'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; +import { readLocalFile } from '../../util/fs'; import { isSkipComment } from '../../util/ignore'; import type { ExtractConfig, PackageDependency, PackageFile } from '../types'; @@ -101,3 +102,26 @@ export function extractPackageFile( } return res; } + +export async function extractAllPackageFiles( + config: ExtractConfig, + packageFiles: string[] +): Promise<PackageFile[]> { + const requirementsFiles: PackageFile[] = []; + for (const packageFile of packageFiles) { + const content = await readLocalFile(packageFile, 'utf8'); + // istanbul ignore else + if (content) { + const deps = extractPackageFile(content, packageFile, config); + if (deps) { + requirementsFiles.push({ + packageFile, + ...deps, + }); + } + } else { + logger.debug({ packageFile }, 'requirements file has no content'); + } + } + return requirementsFiles; +} diff --git a/lib/manager/pip_requirements/index.ts b/lib/manager/pip_requirements/index.ts index b2c951aa37c73d56d8e0aeb2daddb53671ef39aa..b57282d7f9560463e63aa440cdbff3f6614aafa3 100644 --- a/lib/manager/pip_requirements/index.ts +++ b/lib/manager/pip_requirements/index.ts @@ -1,7 +1,7 @@ import { LANGUAGE_PYTHON } from '../../constants/languages'; export { updateArtifacts } from './artifacts'; -export { extractPackageFile } from './extract'; +export { extractAllPackageFiles } from './extract'; export { getRangeStrategy } from './range'; export const language = LANGUAGE_PYTHON;