Skip to content

Commit

Permalink
fix(manager/pep621): group pdm binary calls based on dependency groups (
Browse files Browse the repository at this point in the history
  • Loading branch information
secustor committed May 30, 2023
1 parent f32b04f commit 0a4be4a
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 11 deletions.
5 changes: 3 additions & 2 deletions lib/modules/manager/pep621/extract.ts
Expand Up @@ -7,6 +7,7 @@ import type {
} from '../types';
import { processors } from './processors';
import {
depTypes,
parseDependencyGroupRecord,
parseDependencyList,
parsePyProject,
Expand All @@ -32,11 +33,11 @@ export function extractPackageFile(

// pyProject standard definitions
deps.push(
...parseDependencyList('project.dependencies', def.project?.dependencies)
...parseDependencyList(depTypes.dependencies, def.project?.dependencies)
);
deps.push(
...parseDependencyGroupRecord(
'project.optional-dependencies',
depTypes.optionalDependencies,
def.project?.['optional-dependencies']
)
);
Expand Down
33 changes: 32 additions & 1 deletion lib/modules/manager/pep621/processors/pdm.spec.ts
Expand Up @@ -5,6 +5,7 @@ import { GlobalConfig } from '../../../../config/global';
import type { RepoGlobalConfig } from '../../../../config/types';
import { getPkgReleases as _getPkgReleases } from '../../../datasource';
import type { UpdateArtifactsConfig } from '../../types';
import { depTypes } from '../utils';
import { PdmProcessor } from './pdm';

jest.mock('../../../../util/fs');
Expand Down Expand Up @@ -130,7 +131,28 @@ describe('modules/manager/pep621/processors/pdm', () => {
releases: [{ version: 'v2.6.1' }, { version: 'v2.5.0' }],
});

const updatedDeps = [{ packageName: 'dep1' }, { packageName: 'dep2' }];
const updatedDeps = [
{
packageName: 'dep1',
depType: depTypes.dependencies,
},
{ packageName: 'dep2', depType: depTypes.dependencies },
{
depName: 'group1/dep3',
depType: depTypes.optionalDependencies,
},
{ depName: 'group1/dep4', depType: depTypes.optionalDependencies },
{
depName: 'group2/dep5',
depType: depTypes.pdmDevDependencies,
},
{ depName: 'group2/dep6', depType: depTypes.pdmDevDependencies },
{
depName: 'group3/dep7',
depType: depTypes.pdmDevDependencies,
},
{ depName: 'group3/dep8', depType: depTypes.pdmDevDependencies },
];
const result = await processor.updateArtifacts(
{
packageFileName: 'pyproject.toml',
Expand All @@ -153,6 +175,15 @@ describe('modules/manager/pep621/processors/pdm', () => {
{
cmd: 'pdm update dep1 dep2',
},
{
cmd: 'pdm update -G group1 dep3 dep4',
},
{
cmd: 'pdm update -dG group2 dep5 dep6',
},
{
cmd: 'pdm update -dG group3 dep7 dep8',
},
]);
});

Expand Down
58 changes: 50 additions & 8 deletions lib/modules/manager/pep621/processors/pdm.ts
Expand Up @@ -9,9 +9,10 @@ import type {
PackageDependency,
UpdateArtifact,
UpdateArtifactsResult,
Upgrade,
} from '../../types';
import type { PyProject } from '../schema';
import { parseDependencyGroupRecord } from '../utils';
import { depTypes, parseDependencyGroupRecord } from '../utils';
import type { PyProjectProcessor } from './types';

export class PdmProcessor implements PyProjectProcessor {
Expand All @@ -23,7 +24,7 @@ export class PdmProcessor implements PyProjectProcessor {

deps.push(
...parseDependencyGroupRecord(
'tool.pdm.dev-dependencies',
depTypes.pdmDevDependencies,
pdm['dev-dependencies']
)
);
Expand Down Expand Up @@ -84,13 +85,13 @@ export class PdmProcessor implements PyProjectProcessor {

// on lockFileMaintenance do not specify any packages and update the complete lock file
// else only update specific packages
let packageList = '';
if (!isLockFileMaintenance) {
packageList = ' ';
packageList += updatedDeps.map((value) => value.packageName).join(' ');
const cmds: string[] = [];
if (isLockFileMaintenance) {
cmds.push('pdm update');
} else {
cmds.push(...generateCMDs(updatedDeps));
}
const cmd = `pdm update${packageList}`;
await exec(cmd, execOptions);
await exec(cmds, execOptions);

// check for changes
const fileChanges: UpdateArtifactsResult[] = [];
Expand Down Expand Up @@ -126,3 +127,44 @@ export class PdmProcessor implements PyProjectProcessor {
}
}
}

function generateCMDs(updatedDeps: Upgrade[]): string[] {
const cmds: string[] = [];
const packagesByCMD: Record<string, string[]> = {};
for (const dep of updatedDeps) {
switch (dep.depType) {
case depTypes.optionalDependencies: {
const [group, name] = dep.depName!.split('/');
addPackageToCMDRecord(packagesByCMD, `pdm update -G ${group}`, name);
break;
}
case depTypes.pdmDevDependencies: {
const [group, name] = dep.depName!.split('/');
addPackageToCMDRecord(packagesByCMD, `pdm update -dG ${group}`, name);
break;
}
default: {
addPackageToCMDRecord(packagesByCMD, `pdm update`, dep.packageName!);
}
}
}

for (const commandPrefix in packagesByCMD) {
const packageList = packagesByCMD[commandPrefix].join(' ');
const cmd = `${commandPrefix} ${packageList}`;
cmds.push(cmd);
}

return cmds;
}

function addPackageToCMDRecord(
packagesByCMD: Record<string, string[]>,
commandPrefix: string,
packageName: string
): void {
if (is.nullOrUndefined(packagesByCMD[commandPrefix])) {
packagesByCMD[commandPrefix] = [];
}
packagesByCMD[commandPrefix].push(packageName);
}
6 changes: 6 additions & 0 deletions lib/modules/manager/pep621/utils.ts
Expand Up @@ -11,6 +11,12 @@ const pep508Regex = regEx(
/^(?<packageName>[A-Z0-9._-]+)\s*(\[(?<extras>[A-Z0-9,._-]+)\])?\s*(?<currentValue>[^;]+)?(;\s*(?<marker>.*))?/i
);

export const depTypes = {
dependencies: 'project.dependencies',
optionalDependencies: 'project.optional-dependencies',
pdmDevDependencies: 'tool.pdm.dev-dependencies',
};

export function parsePEP508(
value: string | null | undefined
): Pep508ParseResult | null {
Expand Down

0 comments on commit 0a4be4a

Please sign in to comment.