From abddd65daa542f222192b43e051c4275cb3d4c81 Mon Sep 17 00:00:00 2001 From: Ion Alberdi Date: Wed, 3 May 2023 09:15:58 +0200 Subject: [PATCH 1/7] feat(poetry) Support tag as git-dependency on github Parse git dependencies like {git = "https://github.com/tiangolo/fastapi.git", tag="1.2.3"} or {git = "git@github.com:tiangolo/fastapi.git", tag="1.2.3"} and support them as github-tabs datasources. --- lib/modules/manager/poetry/extract.spec.ts | 35 ++++++++++++++ lib/modules/manager/poetry/extract.ts | 53 ++++++++++++++++++---- lib/modules/manager/poetry/types.ts | 1 + 3 files changed, 81 insertions(+), 8 deletions(-) diff --git a/lib/modules/manager/poetry/extract.spec.ts b/lib/modules/manager/poetry/extract.spec.ts index a1a459499491b6..f45231b90b3fe7 100644 --- a/lib/modules/manager/poetry/extract.spec.ts +++ b/lib/modules/manager/poetry/extract.spec.ts @@ -1,5 +1,6 @@ import { Fixtures } from '../../../../test/fixtures'; import { fs } from '../../../../test/util'; +import { GithubTagsDatasource } from '../../datasource/github-tags'; import { extractPackageFile } from '.'; jest.mock('../../../util/fs'); @@ -177,6 +178,30 @@ describe('modules/manager/poetry/extract', () => { }); }); + it('parses github dependencies tags on ssh urls', async () => { + const content = + '[tool.poetry.dependencies]\r\nfastapi = {git = "git@github.com:tiangolo/fastapi.git", tag="1.2.3"}\r\nwerkzeug = ">=0.14"'; + const res = (await extractPackageFile(content, filename))!.deps; + expect(res[0].depName).toBe('fastapi'); + expect(res[0].packageName).toBe('tiangolo/fastapi'); + expect(res[0].currentValue).toBe('1.2.3'); + expect(res[0].skipReason).toBeUndefined(); + expect(res[0].datasource).toBe(GithubTagsDatasource.id); + expect(res).toHaveLength(2); + }); + + it('parses github dependencies tags on http urls', async () => { + const content = + '[tool.poetry.dependencies]\r\nfastapi = {git = "https://github.com/tiangolo/fastapi.git", tag="1.2.3"}\r\nwerkzeug = ">=0.14"'; + const res = (await extractPackageFile(content, filename))!.deps; + expect(res[0].depName).toBe('fastapi'); + expect(res[0].packageName).toBe('tiangolo/fastapi'); + expect(res[0].currentValue).toBe('1.2.3'); + expect(res[0].skipReason).toBeUndefined(); + expect(res[0].datasource).toBe(GithubTagsDatasource.id); + expect(res).toHaveLength(2); + }); + it('skips git dependencies', async () => { const content = '[tool.poetry.dependencies]\r\nflask = {git = "https://github.com/pallets/flask.git"}\r\nwerkzeug = ">=0.14"'; @@ -197,6 +222,16 @@ describe('modules/manager/poetry/extract', () => { expect(res).toHaveLength(2); }); + it('skips git dependencies on tags that are not in github', async () => { + const content = + '[tool.poetry.dependencies]\r\naws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"}\r\nwerkzeug = ">=0.14"'; + const res = (await extractPackageFile(content, filename))!.deps; + expect(res[0].depName).toBe('aws-sam'); + expect(res[0].currentValue).toBe('1.2.3'); + expect(res[0].skipReason).toBe('git-dependency'); + expect(res).toHaveLength(2); + }); + it('skips path dependencies', async () => { const content = '[tool.poetry.dependencies]\r\nflask = {path = "/some/path/"}\r\nwerkzeug = ">=0.14"'; diff --git a/lib/modules/manager/poetry/extract.ts b/lib/modules/manager/poetry/extract.ts index ae9810dbc0e2fd..4babfe6069ec0a 100644 --- a/lib/modules/manager/poetry/extract.ts +++ b/lib/modules/manager/poetry/extract.ts @@ -8,6 +8,7 @@ import { readLocalFile, } from '../../../util/fs'; import { regEx } from '../../../util/regex'; +import { GithubTagsDatasource } from '../../datasource/github-tags'; import { PypiDatasource } from '../../datasource/pypi'; import * as pep440Versioning from '../../versioning/pep440'; import * as poetryVersioning from '../../versioning/poetry'; @@ -56,16 +57,20 @@ function extractFromSection( } const pep503NormalizeRegex = regEx(/[-_.]+/g); - const packageName = depName - .toLowerCase() - .replace(pep503NormalizeRegex, '-'); + let packageName = depName.toLowerCase().replace(pep503NormalizeRegex, '-'); let skipReason: SkipReason | null = null; let currentValue = sectionContent[depName]; let nestedVersion = false; + let datasource = PypiDatasource.id; + let lockedVersion: string | null = null; + if (packageName in poetryLockfile) { + lockedVersion = poetryLockfile[packageName]; + } if (!is.string(currentValue)) { const version = currentValue.version; const path = currentValue.path; const git = currentValue.git; + const tag = currentValue.tag; if (version) { currentValue = version; nestedVersion = true; @@ -76,8 +81,19 @@ function extractFromSection( currentValue = ''; skipReason = 'path-dependency'; } else if (git) { - currentValue = ''; - skipReason = 'git-dependency'; + if (tag) { + currentValue = tag; + datasource = GithubTagsDatasource.id; + const githubPackageName = extractGithubPackageName(git); + if (githubPackageName) { + packageName = githubPackageName; + } else { + skipReason = 'git-dependency'; + } + } else { + currentValue = ''; + skipReason = 'git-dependency'; + } } else { currentValue = ''; skipReason = 'multiple-constraint-dep'; @@ -88,10 +104,10 @@ function extractFromSection( depType, currentValue, managerData: { nestedVersion }, - datasource: PypiDatasource.id, + datasource, }; - if (packageName in poetryLockfile) { - dep.lockedVersion = poetryLockfile[packageName]; + if (lockedVersion) { + dep.lockedVersion = lockedVersion; } if (depName !== packageName) { dep.packageName = packageName; @@ -199,3 +215,24 @@ export async function extractPackageFile( } return res; } + +function extractGithubPackageName(url: string): string | null { + const httpRegex = regEx(/^(?:https?:\/\/)?(?:www\.)?github.com\/(.*)$/); + const sshRegex = regEx(/^git@github.com:(.*)?$/); + + const httpMatch = httpRegex.exec(url); + const sshMatch = sshRegex.exec(url); + + function removeDotGit(packageName: string): string { + return packageName.replace('.git', ''); + } + + if (httpMatch) { + return removeDotGit(httpMatch[1]); + } + + if (sshMatch) { + return removeDotGit(sshMatch[1]); + } + return null; +} diff --git a/lib/modules/manager/poetry/types.ts b/lib/modules/manager/poetry/types.ts index 935cd37436d9f9..6fa510ad515f9c 100644 --- a/lib/modules/manager/poetry/types.ts +++ b/lib/modules/manager/poetry/types.ts @@ -20,6 +20,7 @@ export interface PoetryFile { export interface PoetryDependency { path?: string; git?: string; + tag?: string; version?: string; } From c80122b8d61c8b73200d7053234d0369433b772e Mon Sep 17 00:00:00 2001 From: Ion Alberdi Date: Wed, 3 May 2023 14:06:12 +0200 Subject: [PATCH 2/7] Implement suggestions from review --- lib/modules/manager/poetry/extract.ts | 27 +++++++-------------------- lib/modules/manager/poetry/index.ts | 6 +++++- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/lib/modules/manager/poetry/extract.ts b/lib/modules/manager/poetry/extract.ts index 4babfe6069ec0a..13daf4ace31a5f 100644 --- a/lib/modules/manager/poetry/extract.ts +++ b/lib/modules/manager/poetry/extract.ts @@ -7,6 +7,7 @@ import { localPathExists, readLocalFile, } from '../../../util/fs'; +import { parseGitUrl } from '../../../util/git/url'; import { regEx } from '../../../util/regex'; import { GithubTagsDatasource } from '../../datasource/github-tags'; import { PypiDatasource } from '../../datasource/pypi'; @@ -70,7 +71,6 @@ function extractFromSection( const version = currentValue.version; const path = currentValue.path; const git = currentValue.git; - const tag = currentValue.tag; if (version) { currentValue = version; nestedVersion = true; @@ -81,8 +81,8 @@ function extractFromSection( currentValue = ''; skipReason = 'path-dependency'; } else if (git) { - if (tag) { - currentValue = tag; + if (currentValue.tag) { + currentValue = currentValue.tag; datasource = GithubTagsDatasource.id; const githubPackageName = extractGithubPackageName(git); if (githubPackageName) { @@ -217,22 +217,9 @@ export async function extractPackageFile( } function extractGithubPackageName(url: string): string | null { - const httpRegex = regEx(/^(?:https?:\/\/)?(?:www\.)?github.com\/(.*)$/); - const sshRegex = regEx(/^git@github.com:(.*)?$/); - - const httpMatch = httpRegex.exec(url); - const sshMatch = sshRegex.exec(url); - - function removeDotGit(packageName: string): string { - return packageName.replace('.git', ''); - } - - if (httpMatch) { - return removeDotGit(httpMatch[1]); - } - - if (sshMatch) { - return removeDotGit(sshMatch[1]); + const parsedUrl = parseGitUrl(url); + if (parsedUrl.source !== 'github.com') { + return null; } - return null; + return `${parsedUrl.owner}/${parsedUrl.name}`; } diff --git a/lib/modules/manager/poetry/index.ts b/lib/modules/manager/poetry/index.ts index 122ebb1d37a823..3655fea38af505 100644 --- a/lib/modules/manager/poetry/index.ts +++ b/lib/modules/manager/poetry/index.ts @@ -1,11 +1,15 @@ import type { ProgrammingLanguage } from '../../../constants'; +import { GithubTagsDatasource } from '../../datasource/github-tags'; import { PypiDatasource } from '../../datasource/pypi'; export { extractPackageFile } from './extract'; export { updateArtifacts } from './artifacts'; export { updateLockedDependency } from './update-locked'; -export const supportedDatasources = [PypiDatasource.id]; +export const supportedDatasources = [ + PypiDatasource.id, + GithubTagsDatasource.id, +]; export const language: ProgrammingLanguage = 'python'; export const supportsLockFileMaintenance = true; From 81364455785463b63664d62c9c925a83b33e2205 Mon Sep 17 00:00:00 2001 From: Ion Alberdi Date: Wed, 3 May 2023 14:34:35 +0200 Subject: [PATCH 3/7] Rewrite tests using codeblock-s --- lib/modules/manager/poetry/extract.spec.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/modules/manager/poetry/extract.spec.ts b/lib/modules/manager/poetry/extract.spec.ts index f45231b90b3fe7..f07d8481837735 100644 --- a/lib/modules/manager/poetry/extract.spec.ts +++ b/lib/modules/manager/poetry/extract.spec.ts @@ -179,8 +179,11 @@ describe('modules/manager/poetry/extract', () => { }); it('parses github dependencies tags on ssh urls', async () => { - const content = - '[tool.poetry.dependencies]\r\nfastapi = {git = "git@github.com:tiangolo/fastapi.git", tag="1.2.3"}\r\nwerkzeug = ">=0.14"'; + const content = ` + [tool.poetry.dependencies] + fastapi = {git = "git@github.com:tiangolo/fastapi.git", tag="1.2.3"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('fastapi'); expect(res[0].packageName).toBe('tiangolo/fastapi'); @@ -191,8 +194,11 @@ describe('modules/manager/poetry/extract', () => { }); it('parses github dependencies tags on http urls', async () => { - const content = - '[tool.poetry.dependencies]\r\nfastapi = {git = "https://github.com/tiangolo/fastapi.git", tag="1.2.3"}\r\nwerkzeug = ">=0.14"'; + const content = ` + [tool.poetry.dependencies] + fastapi = {git = "https://github.com/tiangolo/fastapi.git", tag="1.2.3"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('fastapi'); expect(res[0].packageName).toBe('tiangolo/fastapi'); @@ -223,8 +229,11 @@ describe('modules/manager/poetry/extract', () => { }); it('skips git dependencies on tags that are not in github', async () => { - const content = - '[tool.poetry.dependencies]\r\naws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"}\r\nwerkzeug = ">=0.14"'; + const content = ` +[tool.poetry.dependencies] +aws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"} +nwerkzeug = ">=0.14" +`; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('aws-sam'); expect(res[0].currentValue).toBe('1.2.3'); From 1ad55f19de734926ebea96169a89c1b44f96d233 Mon Sep 17 00:00:00 2001 From: Ion Alberdi Date: Wed, 3 May 2023 14:40:52 +0200 Subject: [PATCH 4/7] Remove useless line in test example --- lib/modules/manager/poetry/extract.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/modules/manager/poetry/extract.spec.ts b/lib/modules/manager/poetry/extract.spec.ts index f07d8481837735..9b046064c5f9e6 100644 --- a/lib/modules/manager/poetry/extract.spec.ts +++ b/lib/modules/manager/poetry/extract.spec.ts @@ -232,7 +232,6 @@ describe('modules/manager/poetry/extract', () => { const content = ` [tool.poetry.dependencies] aws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"} -nwerkzeug = ">=0.14" `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('aws-sam'); From eda121b2f20f4b42d700f318339f5fd004d9f01c Mon Sep 17 00:00:00 2001 From: Ion Alberdi Date: Wed, 3 May 2023 15:04:09 +0200 Subject: [PATCH 5/7] Fix related test --- lib/modules/manager/poetry/extract.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/manager/poetry/extract.spec.ts b/lib/modules/manager/poetry/extract.spec.ts index 9b046064c5f9e6..2b286f893e109c 100644 --- a/lib/modules/manager/poetry/extract.spec.ts +++ b/lib/modules/manager/poetry/extract.spec.ts @@ -237,7 +237,7 @@ aws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"} expect(res[0].depName).toBe('aws-sam'); expect(res[0].currentValue).toBe('1.2.3'); expect(res[0].skipReason).toBe('git-dependency'); - expect(res).toHaveLength(2); + expect(res).toHaveLength(1); }); it('skips path dependencies', async () => { From 508e83cecaaf99b654b2d40fd4c3a1a9d12d2493 Mon Sep 17 00:00:00 2001 From: Ion Alberdi Date: Wed, 3 May 2023 15:01:33 +0200 Subject: [PATCH 6/7] Rewrite remaining tests using codeblock-s --- lib/modules/manager/poetry/extract.spec.ts | 41 ++++++++++++++++------ 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/lib/modules/manager/poetry/extract.spec.ts b/lib/modules/manager/poetry/extract.spec.ts index 2b286f893e109c..40d3ec7f56465c 100644 --- a/lib/modules/manager/poetry/extract.spec.ts +++ b/lib/modules/manager/poetry/extract.spec.ts @@ -142,8 +142,17 @@ describe('modules/manager/poetry/extract', () => { }); it('extracts dependencies from dependency groups', async () => { - const content = - '[tool.poetry.dependencies]\ndep = "^2.0"\n\n[tool.poetry.group.dev.dependencies]\ndev_dep = "^3.0"\n\n[tool.poetry.group.typing.dependencies]\ntyping_dep = "^4.0"'; + const content = ` +[tool.poetry.dependencies] +dep = "^2.0" + + +[tool.poetry.group.dev.dependencies] +dev_dep = "^3.0" + +[tool.poetry.group.typing.dependencies] +typing_dep = "^4.0" +`; const res = await extractPackageFile(content, filename); expect(res?.deps).toMatchObject([ { @@ -209,8 +218,11 @@ describe('modules/manager/poetry/extract', () => { }); it('skips git dependencies', async () => { - const content = - '[tool.poetry.dependencies]\r\nflask = {git = "https://github.com/pallets/flask.git"}\r\nwerkzeug = ">=0.14"'; + const content = ` + [tool.poetry.dependencies] + flask = {git = "https://github.com/pallets/flask.git"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('flask'); expect(res[0].currentValue).toBeEmptyString(); @@ -219,8 +231,11 @@ describe('modules/manager/poetry/extract', () => { }); it('skips git dependencies with version', async () => { - const content = - '[tool.poetry.dependencies]\r\nflask = {git = "https://github.com/pallets/flask.git", version="1.2.3"}\r\nwerkzeug = ">=0.14"'; + const content = ` +[tool.poetry.dependencies] +flask = {git = "https://github.com/pallets/flask.git", version="1.2.3"} +werkzeug = ">=0.14" +`; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('flask'); expect(res[0].currentValue).toBe('1.2.3'); @@ -241,8 +256,11 @@ aws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"} }); it('skips path dependencies', async () => { - const content = - '[tool.poetry.dependencies]\r\nflask = {path = "/some/path/"}\r\nwerkzeug = ">=0.14"'; + const content = ` +[tool.poetry.dependencies] +flask = {path = "/some/path/"} +werkzeug = ">=0.14" +`; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('flask'); expect(res[0].currentValue).toBe(''); @@ -251,8 +269,11 @@ aws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"} }); it('skips path dependencies with version', async () => { - const content = - '[tool.poetry.dependencies]\r\nflask = {path = "/some/path/", version = "1.2.3"}\r\nwerkzeug = ">=0.14"'; + const content = ` +[tool.poetry.dependencies] +flask = {path = "/some/path/", version = "1.2.3"} +werkzeug = ">=0.14" +`; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('flask'); expect(res[0].currentValue).toBe('1.2.3'); From 353164341c5ffb09c4e17b7f838bc51559ec0029 Mon Sep 17 00:00:00 2001 From: Ion Alberdi Date: Wed, 3 May 2023 16:58:02 +0200 Subject: [PATCH 7/7] Rewrite tests using codeBlock from "common-tags" --- lib/modules/manager/poetry/extract.spec.ts | 85 +++++++++++----------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/lib/modules/manager/poetry/extract.spec.ts b/lib/modules/manager/poetry/extract.spec.ts index 40d3ec7f56465c..56fca72715c412 100644 --- a/lib/modules/manager/poetry/extract.spec.ts +++ b/lib/modules/manager/poetry/extract.spec.ts @@ -1,3 +1,4 @@ +import { codeBlock } from 'common-tags'; import { Fixtures } from '../../../../test/fixtures'; import { fs } from '../../../../test/util'; import { GithubTagsDatasource } from '../../datasource/github-tags'; @@ -142,17 +143,17 @@ describe('modules/manager/poetry/extract', () => { }); it('extracts dependencies from dependency groups', async () => { - const content = ` -[tool.poetry.dependencies] -dep = "^2.0" + const content = codeBlock` + [tool.poetry.dependencies] + dep = "^2.0" -[tool.poetry.group.dev.dependencies] -dev_dep = "^3.0" + [tool.poetry.group.dev.dependencies] + dev_dep = "^3.0" -[tool.poetry.group.typing.dependencies] -typing_dep = "^4.0" -`; + [tool.poetry.group.typing.dependencies] + typing_dep = "^4.0" + `; const res = await extractPackageFile(content, filename); expect(res?.deps).toMatchObject([ { @@ -188,11 +189,11 @@ typing_dep = "^4.0" }); it('parses github dependencies tags on ssh urls', async () => { - const content = ` - [tool.poetry.dependencies] - fastapi = {git = "git@github.com:tiangolo/fastapi.git", tag="1.2.3"} - werkzeug = ">=0.14" - `; + const content = codeBlock` + [tool.poetry.dependencies] + fastapi = {git = "git@github.com:tiangolo/fastapi.git", tag="1.2.3"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('fastapi'); expect(res[0].packageName).toBe('tiangolo/fastapi'); @@ -203,11 +204,11 @@ typing_dep = "^4.0" }); it('parses github dependencies tags on http urls', async () => { - const content = ` - [tool.poetry.dependencies] - fastapi = {git = "https://github.com/tiangolo/fastapi.git", tag="1.2.3"} - werkzeug = ">=0.14" - `; + const content = codeBlock` + [tool.poetry.dependencies] + fastapi = {git = "https://github.com/tiangolo/fastapi.git", tag="1.2.3"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('fastapi'); expect(res[0].packageName).toBe('tiangolo/fastapi'); @@ -218,11 +219,11 @@ typing_dep = "^4.0" }); it('skips git dependencies', async () => { - const content = ` - [tool.poetry.dependencies] - flask = {git = "https://github.com/pallets/flask.git"} - werkzeug = ">=0.14" - `; + const content = codeBlock` + [tool.poetry.dependencies] + flask = {git = "https://github.com/pallets/flask.git"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('flask'); expect(res[0].currentValue).toBeEmptyString(); @@ -231,11 +232,11 @@ typing_dep = "^4.0" }); it('skips git dependencies with version', async () => { - const content = ` -[tool.poetry.dependencies] -flask = {git = "https://github.com/pallets/flask.git", version="1.2.3"} -werkzeug = ">=0.14" -`; + const content = codeBlock` + [tool.poetry.dependencies] + flask = {git = "https://github.com/pallets/flask.git", version="1.2.3"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('flask'); expect(res[0].currentValue).toBe('1.2.3'); @@ -244,10 +245,10 @@ werkzeug = ">=0.14" }); it('skips git dependencies on tags that are not in github', async () => { - const content = ` -[tool.poetry.dependencies] -aws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"} -`; + const content = codeBlock` + [tool.poetry.dependencies] + aws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"} + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('aws-sam'); expect(res[0].currentValue).toBe('1.2.3'); @@ -256,11 +257,11 @@ aws-sam = {git = "https://gitlab.com/gitlab-examples/aws-sam.git", tag="1.2.3"} }); it('skips path dependencies', async () => { - const content = ` -[tool.poetry.dependencies] -flask = {path = "/some/path/"} -werkzeug = ">=0.14" -`; + const content = codeBlock` + [tool.poetry.dependencies] + flask = {path = "/some/path/"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('flask'); expect(res[0].currentValue).toBe(''); @@ -269,11 +270,11 @@ werkzeug = ">=0.14" }); it('skips path dependencies with version', async () => { - const content = ` -[tool.poetry.dependencies] -flask = {path = "/some/path/", version = "1.2.3"} -werkzeug = ">=0.14" -`; + const content = codeBlock` + [tool.poetry.dependencies] + flask = {path = "/some/path/", version = "1.2.3"} + werkzeug = ">=0.14" + `; const res = (await extractPackageFile(content, filename))!.deps; expect(res[0].depName).toBe('flask'); expect(res[0].currentValue).toBe('1.2.3');