Skip to content

Commit 62d2122

Browse files
committed
feat: added install files parameter to pip
1 parent c4e929d commit 62d2122

File tree

4 files changed

+74
-3
lines changed

4 files changed

+74
-3
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { ParameterSetting, Plan, StatefulParameter, getPty } from 'codify-plugin-lib';
2+
3+
import { codifySpawn } from '../../../utils/codify-spawn.js';
4+
import { PipResourceConfig } from './pip.js';
5+
6+
export class PipInstallFilesParameter extends StatefulParameter<PipResourceConfig, Array<string>> {
7+
getSettings(): ParameterSetting {
8+
return {
9+
type: 'array',
10+
itemType: 'directory',
11+
}
12+
}
13+
14+
async refresh(desired: null | string[], config: Partial<PipResourceConfig>): Promise<null | string[]> {
15+
const $ = getPty();
16+
17+
return (await Promise.all(desired?.map(async (d) => {
18+
const { data } = await $.spawnSafe(`pip -vvv freeze -r ${d}`)
19+
20+
if (!data || data.includes('WARNING:')) {
21+
return null;
22+
}
23+
24+
return d;
25+
}) ?? [])).filter(Boolean) as string[];
26+
}
27+
28+
async add(valueToAdd: string[], plan: Plan<PipResourceConfig>): Promise<void> {
29+
if (valueToAdd.length === 0) {
30+
return;
31+
}
32+
33+
await codifySpawn(`pip install ${valueToAdd.map((v) => `-r ${v}`).join(' ')}`)
34+
}
35+
36+
async modify(newValue: string[], previousValue: string[], plan: Plan<PipResourceConfig>): Promise<void> {
37+
const toInstall = newValue.filter((n) => !previousValue.includes(n));
38+
const toUninstall = previousValue.filter((p) => !newValue.includes(p));
39+
40+
if (toUninstall.length > 0) {
41+
await codifySpawn(`pip uninstall ${toUninstall.map((v) => `-r ${v}`).join(' ')}`)
42+
}
43+
44+
if (toInstall.length > 0) {
45+
await codifySpawn(`pip install ${toInstall.map((v) => `-r ${v}`).join(' ')}`)
46+
}
47+
}
48+
49+
async remove(valueToRemove: string[], plan: Plan<PipResourceConfig>): Promise<void> {
50+
if (valueToRemove.length === 0) {
51+
return;
52+
}
53+
54+
await codifySpawn(`pip uninstall ${valueToRemove.map((v) => `-r ${v}`).join(' ')}`)
55+
}
56+
57+
}

src/resources/python/pip/pip-schema.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@
3131
}
3232
]
3333
}
34+
},
35+
"installFiles": {
36+
"description": "A list of requirement files to install.",
37+
"type": "array",
38+
"items": {
39+
"type": "string"
40+
}
3441
}
3542
},
3643
"additionalProperties": false,

src/resources/python/pip/pip.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@ import { ResourceConfig } from 'codify-schemas';
1111

1212
import { codifySpawn } from '../../../utils/codify-spawn.js';
1313
import schema from './pip-schema.json';
14+
import { PipInstallFilesParameter } from './install-files.js';
1415

1516
interface PipListResult {
1617
name: string;
1718
version?: string;
1819
}
1920

2021
export interface PipResourceConfig extends ResourceConfig {
21-
install: Array<PipListResult | string>,
22-
virtualEnv?: string,
22+
install: Array<PipListResult | string>;
23+
installFiles: string[];
24+
virtualEnv?: string;
2325
}
2426

2527
export class Pip extends Resource<PipResourceConfig> {
@@ -37,6 +39,7 @@ export class Pip extends Resource<PipResourceConfig> {
3739
filterInStatelessMode: (desired, current) =>
3840
current.filter((c) => desired.find((d) => this.isSame(c, d)))
3941
},
42+
installFiles: { type: 'stateful', definition: new PipInstallFilesParameter(), },
4043
virtualEnv: { type: 'directory', setting: true }
4144
},
4245
allowMultiple: {

test/python/pip.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,17 @@ describe('Pip resource integration tests', () => {
2525
})
2626

2727
it('Installs python and installs a package using pip', { timeout: 300000 }, async () => {
28+
const requirementsPath = path.join(os.homedir(), 'requirements.txt')
29+
fs.writeFileSync(requirementsPath, 'aayush-color')
30+
2831
await PluginTester.fullTest(pluginPath, [
2932
{
3033
type: 'pip',
3134
install: [
3235
'ffmpeg',
3336
{ name: 'qoverage', version: "0.1.12"},
34-
]
37+
],
38+
installFiles: [requirementsPath]
3539
}
3640
], {
3741
skipUninstall: true,

0 commit comments

Comments
 (0)