Skip to content

Commit

Permalink
Add vias to tree
Browse files Browse the repository at this point in the history
  • Loading branch information
mistercrunch committed May 16, 2024
1 parent 8337108 commit 5edc918
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 27 deletions.
6 changes: 4 additions & 2 deletions src/github.js
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,7 @@ class Github {
useCurrentRepo = false, includeSubpackages = false,
}) {
const cwd = './';

const shellOptions = {
cwd, verbose, raiseOnError: true, exitOnError: false,
};
Expand Down Expand Up @@ -531,9 +532,10 @@ class Github {
await runShellCommand({ command: 'git add .', ...shellOptions });
await runShellCommand({ command: `git commit -m "${commitMessage}"`, ...shellOptions });

const depTree = await runShellCommand({ command: `pipdeptree -r -p ${lib}`, raiseOnError: false, exitOnError: false });
const tree = await this.getSubPackageTree();
const depTree = JSON.stringify(tree[lib].vias, null, 2);
const tbt = '```';
const body = `Updates the python "${lib}" library version from ${before} to ${after}. \n\nGenerated by @supersetbot 🦾\n\npipdeptree:\n${tbt}\n${depTree.stdout}${tbt}`;
const body = `Updates the python "${lib}" library version from ${before} to ${after}. \n\nGenerated by @supersetbot 🦾\n\n🌳:\n${tbt}json\n${depTree}${tbt}`;

if (dryRun) {
console.log(`Skipping PR creation for "${lib}" due to dry-run mode.`);
Expand Down
24 changes: 17 additions & 7 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,9 @@ export function parsePinnedRequirementsTree(requirements) {
.split('\n')
.filter((line) => !line.startsWith('#')) // this removes comments at the top/bottom but not vias since they are indented
.map((line) => line.trim().toLowerCase())
.filter((line) => !line.startsWith('-')) // this removes funky lines refing other files
.filter((line) => !!line);
.filter((line) => !line.startsWith('# via -r ')) // this removes funky lines refing other files
.filter((line) => !line.startsWith('-e ')) // this removes funky lines refing other files
.filter((line) => !!line); // this removes empty lines

const depsObject = {};
let currentDep = null;
Expand All @@ -132,22 +133,30 @@ export function parsePinnedRequirementsTree(requirements) {
if (depMatch) {
currentDep = depMatch[1].trim();
const version = depMatch[2].trim();
if (depsObject[currentDep] === undefined) {
depsObject[currentDep] = { version, deps: [] };
if (currentDep && depsObject[currentDep] === undefined) {
depsObject[currentDep] = {
version, vias: [], deps: [],
};
} else if (version) {
depsObject[currentDep].version = version;
}
} else {
const viaLib = line.replace('# via', '').trim().replace('#', '').trim();
if (viaLib) {
if (viaLib && currentDep) {
if (depsObject[viaLib] === undefined) {
depsObject[viaLib] = { deps: [], version: null };
depsObject[viaLib] = {
deps: [], version: null, vias: [],
};
}
depsObject[viaLib].deps.push(currentDep);

if (depsObject[currentDep] === undefined) {
depsObject[currentDep] = { deps: [], version: null, vias: [] };
}
depsObject[currentDep].vias.push(viaLib);
}
}
});

return depsObject;
}

Expand All @@ -158,6 +167,7 @@ export function mergeParsedRequirementsTree(obj1, obj2) {
keys.forEach((key) => {
merged[key] = {
deps: [...new Set([...(obj1[key]?.deps || []), ...(obj2[key]?.deps || [])])],
vias: [...new Set([...(obj1[key]?.vias || []), ...(obj2[key]?.vias || [])])],
version: obj1[key]?.version || obj2[key]?.version,
};
});
Expand Down
38 changes: 20 additions & 18 deletions src/utils.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ describe('parsePinnedRequirementsTree', () => {
alembic==1.13.1
# via flask-migrate`;
expect(parsePinnedRequirementsTree(requirements)).toEqual({
'flask-migrate': { deps: ['alembic'], version: null },
alembic: { deps: [], version: '1.13.1' },
'flask-migrate': { deps: ['alembic'], version: null, vias: [] },
alembic: { deps: [], version: '1.13.1', vias: ['flask-migrate'] },
});
});

Expand All @@ -22,9 +22,10 @@ describe('parsePinnedRequirementsTree', () => {
'flask-migrate': {
deps: ['alembic', 'async-timeout'],
version: null,
vias: [],
},
alembic: { deps: [], version: '1.13.1' },
'async-timeout': { deps: [], version: '4.0.2' },
alembic: { deps: [], version: '1.13.1', vias: ['flask-migrate'] },
'async-timeout': { deps: [], version: '4.0.2', vias: ['flask-migrate'] },
});
});

Expand All @@ -36,9 +37,9 @@ describe('parsePinnedRequirementsTree', () => {
# jsonschema
`;
expect(parsePinnedRequirementsTree(requirements)).toEqual({
cattrs: { deps: ['attrs'], version: null },
jsonschema: { deps: ['attrs'], version: null },
attrs: { deps: [], version: '23.1.0' },
cattrs: { deps: ['attrs'], version: null, vias: [] },
jsonschema: { deps: ['attrs'], version: null, vias: [] },
attrs: { deps: [], version: '23.1.0', vias: ['cattrs', 'jsonschema'] },
});
});

Expand All @@ -47,18 +48,18 @@ describe('parsePinnedRequirementsTree', () => {
alembic==1.13.1
# via flask-migrate`;
expect(parsePinnedRequirementsTree(requirements)).toEqual({
'flask-migrate': { deps: ['alembic'], version: null },
alembic: { deps: [], version: '1.13.1' },
'flask-migrate': { deps: ['alembic'], version: null, vias: [] },
alembic: { deps: [], version: '1.13.1', vias: ['flask-migrate'] },
});
});
it('ignores lines with dash r', () => {
const requirements = `
-r requirements.txt
# -r requirements.txt
alembic==1.13.1
# via flask-migrate`;
expect(parsePinnedRequirementsTree(requirements)).toEqual({
'flask-migrate': { deps: ['alembic'], version: null },
alembic: { deps: [], version: '1.13.1' },
'flask-migrate': { deps: ['alembic'], version: null, vias: [] },
alembic: { deps: [], version: '1.13.1', vias: ['flask-migrate'] },
});
});
});
Expand All @@ -71,8 +72,9 @@ describe('mergeParsedRequirementsTree', () => {
'flask-migrate': {
deps: ['alembic'],
version: '2.1.2',
vias: [],
},
paramiko: { deps: ['bcrypt'], version: '3.1.1' },
paramiko: { deps: ['bcrypt'], version: '3.1.1', vias: [] },
};
expect(mergeParsedRequirementsTree(obj1, obj2)).toEqual(expected);
});
Expand All @@ -81,8 +83,8 @@ describe('mergeParsedRequirementsTree', () => {
const obj1 = { 'flask-migrate': { deps: ['alembic'] } };
const obj2 = { 'flask-migrate': { deps: ['async-timeout'] }, paramiko: { deps: ['bcrypt'] } };
const expected = {
'flask-migrate': { deps: ['alembic', 'async-timeout'] },
paramiko: { deps: ['bcrypt'] },
'flask-migrate': { deps: ['alembic', 'async-timeout'], vias: [] },
paramiko: { deps: ['bcrypt'], vias: [] },
};
expect(mergeParsedRequirementsTree(obj1, obj2)).toEqual(expected);
});
Expand All @@ -91,16 +93,16 @@ describe('mergeParsedRequirementsTree', () => {
const obj1 = { 'flask-migrate': { deps: ['alembic', 'async-timeout'] } };
const obj2 = { 'flask-migrate': { deps: ['alembic'] }, paramiko: { deps: ['bcrypt'] } };
const expected = {
'flask-migrate': { deps: ['alembic', 'async-timeout'] },
paramiko: { deps: ['bcrypt'] },
'flask-migrate': { deps: ['alembic', 'async-timeout'], vias: [], version: undefined },
paramiko: { deps: ['bcrypt'], vias: [], version: undefined },
};
expect(mergeParsedRequirementsTree(obj1, obj2)).toEqual(expected);
});

it('handles empty objects correctly', () => {
const obj1 = {};
const obj2 = { paramiko: { deps: ['bcrypt'] } };
const expected = { paramiko: { deps: ['bcrypt'] } };
const expected = { paramiko: { deps: ['bcrypt'], vias: [] } };
expect(mergeParsedRequirementsTree(obj1, obj2)).toEqual(expected);
});
});
Expand Down

0 comments on commit 5edc918

Please sign in to comment.