From e3a1a10b3641c7181eb18f9b480f5d00866fbc8e Mon Sep 17 00:00:00 2001 From: Sigurd Spieckermann Date: Tue, 22 Oct 2024 19:55:59 +0200 Subject: [PATCH] fix(manager/poetry): fix schema for optional dependencies --- .../poetry/__fixtures__/pyproject.1.toml | 8 +- .../poetry/__fixtures__/pyproject.2.toml | 8 +- .../poetry/__snapshots__/extract.spec.ts.snap | 78 ++++++++++--------- lib/modules/manager/poetry/schema.ts | 28 +++++-- 4 files changed, 72 insertions(+), 50 deletions(-) diff --git a/lib/modules/manager/poetry/__fixtures__/pyproject.1.toml b/lib/modules/manager/poetry/__fixtures__/pyproject.1.toml index ffd05ad66c44af..55e620ecafa3e2 100644 --- a/lib/modules/manager/poetry/__fixtures__/pyproject.1.toml +++ b/lib/modules/manager/poetry/__fixtures__/pyproject.1.toml @@ -9,12 +9,14 @@ dep1_ = "0.0.0" dep1 = "0.0.0" dep2 = "^0.6.0" dep3 = "^0.33.6" +extra_dep1 = {version = "^0.8.3", optional = true} +extra_dep2 = {version = "^0.9.4", optional = true} +extra_dep3 = {version = "^0.4.0", optional = true} python = "~2.7 || ^3.4" [tool.poetry.extras] -extra_dep1 = "^0.8.3" -extra_dep2 = "^0.9.4" -extra_dep3 = "^0.4.0" +extra1 = ["extra_dep1", "extra_dep2"] +extra2 = ["extra_dep3"] [tool.poetry.dev-dependencies] dev_dep1 = "^3.0" diff --git a/lib/modules/manager/poetry/__fixtures__/pyproject.2.toml b/lib/modules/manager/poetry/__fixtures__/pyproject.2.toml index d48aebadf8db08..9b47835b4b2683 100644 --- a/lib/modules/manager/poetry/__fixtures__/pyproject.2.toml +++ b/lib/modules/manager/poetry/__fixtures__/pyproject.2.toml @@ -10,11 +10,13 @@ dep2 = { version = "^0.6.0" } dep3 = { path = "/some/path/", version = '^0.33.6' } dep4 = { path = "/some/path/" } dep5 = {} +extra_dep1 = {version = "^0.8.3", optional = true} +extra_dep2 = {version = "^0.9.4", optional = true} +extra_dep3 = {version = "^0.4.0", optional = true} [tool.poetry.extras] -extra_dep1 = "^0.8.3" -extra_dep2 = "^0.9.4" -extra_dep3 = '^0.4.0' +extra1 = ["extra_dep1", "extra_dep2"] +extra2 = ["extra_dep3"] [build-system] requires = ["poetry>=1.0", "wheel"] diff --git a/lib/modules/manager/poetry/__snapshots__/extract.spec.ts.snap b/lib/modules/manager/poetry/__snapshots__/extract.spec.ts.snap index 81b6571687665d..b03d7c86aae301 100644 --- a/lib/modules/manager/poetry/__snapshots__/extract.spec.ts.snap +++ b/lib/modules/manager/poetry/__snapshots__/extract.spec.ts.snap @@ -399,7 +399,8 @@ exports[`modules/manager/poetry/extract extractPackageFile() extracts multiple d "depName": "extra_dep1", "depType": "extras", "managerData": { - "nestedVersion": false, + "nestedVersion": true, + "sourceName": undefined, }, "packageName": "extra-dep1", "versioning": "poetry", @@ -410,7 +411,8 @@ exports[`modules/manager/poetry/extract extractPackageFile() extracts multiple d "depName": "extra_dep2", "depType": "extras", "managerData": { - "nestedVersion": false, + "nestedVersion": true, + "sourceName": undefined, }, "packageName": "extra-dep2", "versioning": "poetry", @@ -421,7 +423,8 @@ exports[`modules/manager/poetry/extract extractPackageFile() extracts multiple d "depName": "extra_dep3", "depType": "extras", "managerData": { - "nestedVersion": false, + "nestedVersion": true, + "sourceName": undefined, }, "packageName": "extra-dep3", "versioning": "poetry", @@ -476,72 +479,75 @@ exports[`modules/manager/poetry/extract extractPackageFile() extracts multiple d "versioning": "poetry", }, { - "commitMessageTopic": "Python", - "currentValue": "~2.7 || ^3.4", - "datasource": "github-releases", - "depName": "python", - "depType": "dependencies", + "currentValue": "^0.8.3", + "datasource": "pypi", + "depName": "extra_dep1", + "depType": "extras", "managerData": { - "nestedVersion": false, + "nestedVersion": true, + "sourceName": undefined, }, - "packageName": "containerbase/python-prebuild", - "registryUrls": null, + "packageName": "extra-dep1", "versioning": "poetry", }, { - "currentValue": "^3.0", + "currentValue": "^0.9.4", "datasource": "pypi", - "depName": "dev_dep1", - "depType": "dev-dependencies", + "depName": "extra_dep2", + "depType": "extras", "managerData": { - "nestedVersion": false, + "nestedVersion": true, + "sourceName": undefined, }, - "packageName": "dev-dep1", + "packageName": "extra-dep2", "versioning": "poetry", }, { - "currentValue": "Invalid version.", + "currentValue": "^0.4.0", "datasource": "pypi", - "depName": "dev_dep2", - "depType": "dev-dependencies", + "depName": "extra_dep3", + "depType": "extras", "managerData": { - "nestedVersion": false, + "nestedVersion": true, + "sourceName": undefined, }, - "packageName": "dev-dep2", - "skipReason": "invalid-version", + "packageName": "extra-dep3", + "versioning": "poetry", }, { - "currentValue": "^0.8.3", - "datasource": "pypi", - "depName": "extra_dep1", - "depType": "extras", + "commitMessageTopic": "Python", + "currentValue": "~2.7 || ^3.4", + "datasource": "github-releases", + "depName": "python", + "depType": "dependencies", "managerData": { "nestedVersion": false, }, - "packageName": "extra-dep1", + "packageName": "containerbase/python-prebuild", + "registryUrls": null, "versioning": "poetry", }, { - "currentValue": "^0.9.4", + "currentValue": "^3.0", "datasource": "pypi", - "depName": "extra_dep2", - "depType": "extras", + "depName": "dev_dep1", + "depType": "dev-dependencies", "managerData": { "nestedVersion": false, }, - "packageName": "extra-dep2", + "packageName": "dev-dep1", "versioning": "poetry", }, { - "currentValue": "^0.4.0", + "currentValue": "Invalid version.", "datasource": "pypi", - "depName": "extra_dep3", - "depType": "extras", + "depName": "dev_dep2", + "depType": "dev-dependencies", "managerData": { "nestedVersion": false, }, - "packageName": "extra-dep3", - "versioning": "poetry", + "packageName": "dev-dep2", + "skipReason": "invalid-version", }, ] `; diff --git a/lib/modules/manager/poetry/schema.ts b/lib/modules/manager/poetry/schema.ts index 687d4ac4bdcb50..dc874f47835f7d 100644 --- a/lib/modules/manager/poetry/schema.ts +++ b/lib/modules/manager/poetry/schema.ts @@ -17,6 +17,15 @@ import * as poetryVersioning from '../../versioning/poetry'; import { dependencyPattern } from '../pip_requirements/extract'; import type { PackageDependency, PackageFileContent } from '../types'; +const PoetryOptionalDependencyMixin = z + .object({ + optional: z.boolean().optional().catch(undefined), + }) + .transform( + ({ optional }): PackageDependency => + optional ? { depType: 'extras' } : {}, + ); + const PoetryPathDependency = z .object({ path: z.string(), @@ -33,7 +42,8 @@ const PoetryPathDependency = z } return dep; - }); + }) + .and(PoetryOptionalDependencyMixin); const PoetryGitDependency = z .object({ @@ -84,7 +94,8 @@ const PoetryGitDependency = z packageName: git, skipReason: 'git-dependency', }; - }); + }) + .and(PoetryOptionalDependencyMixin); const PoetryPypiDependency = z.union([ z @@ -99,7 +110,8 @@ const PoetryPypiDependency = z.union([ managerData: { nestedVersion: true, sourceName: source?.toLowerCase() }, currentValue, }; - }), + }) + .and(PoetryOptionalDependencyMixin), z.string().transform( (version): PackageDependency => ({ datasource: PypiDatasource.id, @@ -172,10 +184,12 @@ export const PoetryDependencies = LooseRecord( function withDepType< Output extends PackageDependency[], Schema extends ZodType, ->(schema: Schema, depType: string): ZodEffects { +>(schema: Schema, depType: string, force: boolean = false): ZodEffects { return schema.transform((deps) => { for (const dep of deps) { - dep.depType = depType; + if (!dep.depType || force) { + dep.depType = depType; + } } return deps; }); @@ -268,8 +282,8 @@ export const PoetrySectionSchema = z 'dev-dependencies': withDepType( PoetryDependencies, 'dev-dependencies', + true, ).optional(), - extras: withDepType(PoetryDependencies, 'extras').optional(), group: PoetryGroupDependencies.optional(), source: PoetrySources, }) @@ -278,14 +292,12 @@ export const PoetrySectionSchema = z version, dependencies = [], 'dev-dependencies': devDependencies = [], - extras: extraDependencies = [], group: groupDependencies = [], source: sourceUrls, }) => { const deps: PackageDependency[] = [ ...dependencies, ...devDependencies, - ...extraDependencies, ...groupDependencies, ];