Skip to content

Commit b7633ab

Browse files
committed
Condense fetchPackages and getPakages methods into getPackages
1 parent 986e84a commit b7633ab

10 files changed

Lines changed: 109 additions & 97 deletions

File tree

api/src/main.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -677,17 +677,10 @@ export interface PackageManager {
677677
/**
678678
* Retrieves the list of packages for the specified Python environment.
679679
* @param environment - The Python environment for which to retrieve packages.
680+
* @param options - Optional settings for package retrieval.
680681
* @returns An array of packages, or undefined if the packages could not be retrieved.
681682
*/
682-
getPackages(environment: PythonEnvironment): Promise<Package[] | undefined>;
683-
684-
/**
685-
* Fetches the latest list of packages from the package manager for the specified Python environment.
686-
* Unlike {@link getPackages}, this always queries the underlying tool and does not use cached results.
687-
* @param environment - The Python environment for which to fetch packages.
688-
* @returns A promise that resolves to an array of packages.
689-
*/
690-
fetchPackages(environment: PythonEnvironment): Promise<Package[]>;
683+
getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined>;
691684

692685
/**
693686
* Updates the cached packages for the specified environment and fires a change event.
@@ -814,6 +807,17 @@ export interface DidChangePythonProjectsEventArgs {
814807
removed: PythonProject[];
815808
}
816809

810+
/**
811+
* Options for retrieving packages from a package manager.
812+
*/
813+
export interface GetPackagesOptions {
814+
/**
815+
* When `true`, bypasses the cache and fetches the latest packages from the underlying tool.
816+
* Defaults to `false`.
817+
*/
818+
skipCache?: boolean;
819+
}
820+
817821
export type PackageManagementOptions =
818822
| {
819823
/**
@@ -1045,9 +1049,10 @@ export interface PythonPackageGetterApi {
10451049
* Get the list of packages in a Python Environment.
10461050
*
10471051
* @param environment The Python Environment for which the list of packages is required.
1052+
* @param options Optional settings for package retrieval.
10481053
* @returns The list of packages in the Python Environment.
10491054
*/
1050-
getPackages(environment: PythonEnvironment): Promise<Package[] | undefined>;
1055+
getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined>;
10511056

10521057
/**
10531058
* Event raised when the list of packages in a Python Environment changes.

examples/sample1/src/api.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -611,17 +611,10 @@ export interface PackageManager {
611611
/**
612612
* Retrieves the list of packages for the specified Python environment.
613613
* @param environment - The Python environment for which to retrieve packages.
614+
* @param options - Optional settings for package retrieval.
614615
* @returns An array of packages, or undefined if the packages could not be retrieved.
615616
*/
616-
getPackages(environment: PythonEnvironment): Promise<Package[] | undefined>;
617-
618-
/**
619-
* Fetches the latest list of packages from the package manager for the specified Python environment.
620-
* Unlike {@link getPackages}, this always queries the underlying tool and does not use cached results.
621-
* @param environment - The Python environment for which to fetch packages.
622-
* @returns A promise that resolves to an array of packages.
623-
*/
624-
fetchPackages(environment: PythonEnvironment): Promise<Package[]>;
617+
getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined>;
625618

626619
/**
627620
* Updates the cached packages for the specified environment and fires a change event.
@@ -734,6 +727,17 @@ export interface DidChangePythonProjectsEventArgs {
734727
removed: PythonProject[];
735728
}
736729

730+
/**
731+
* Options for retrieving packages from a package manager.
732+
*/
733+
export interface GetPackagesOptions {
734+
/**
735+
* When `true`, bypasses the cache and fetches the latest packages from the underlying tool.
736+
* Defaults to `false`.
737+
*/
738+
skipCache?: boolean;
739+
}
740+
737741
/**
738742
* Options for package management.
739743
*/
@@ -970,9 +974,10 @@ export interface PythonPackageGetterApi {
970974
* Get the list of packages in a Python Environment.
971975
*
972976
* @param environment The Python Environment for which the list of packages is required.
977+
* @param options Optional settings for package retrieval.
973978
* @returns The list of packages in the Python Environment.
974979
*/
975-
getPackages(environment: PythonEnvironment): Promise<Package[] | undefined>;
980+
getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined>;
976981

977982
/**
978983
* Event raised when the list of packages in a Python Environment changes.

src/api.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -671,17 +671,10 @@ export interface PackageManager {
671671
/**
672672
* Retrieves the list of packages for the specified Python environment.
673673
* @param environment - The Python environment for which to retrieve packages.
674+
* @param options - Optional settings for package retrieval.
674675
* @returns An array of packages, or undefined if the packages could not be retrieved.
675676
*/
676-
getPackages(environment: PythonEnvironment): Promise<Package[] | undefined>;
677-
678-
/**
679-
* Fetches the latest list of packages from the package manager for the specified Python environment.
680-
* Unlike {@link getPackages}, this always queries the underlying tool and does not use cached results.
681-
* @param environment - The Python environment for which to fetch packages.
682-
* @returns A promise that resolves to an array of packages.
683-
*/
684-
fetchPackages(environment: PythonEnvironment): Promise<Package[]>;
677+
getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined>;
685678

686679
/**
687680
* Updates the cached packages for the specified environment and fires a change event.
@@ -808,6 +801,17 @@ export interface DidChangePythonProjectsEventArgs {
808801
removed: PythonProject[];
809802
}
810803

804+
/**
805+
* Options for retrieving packages from a package manager.
806+
*/
807+
export interface GetPackagesOptions {
808+
/**
809+
* When `true`, bypasses the cache and fetches the latest packages from the underlying tool.
810+
* Defaults to `false`.
811+
*/
812+
skipCache?: boolean;
813+
}
814+
811815
export type PackageManagementOptions =
812816
| {
813817
/**
@@ -1039,9 +1043,10 @@ export interface PythonPackageGetterApi {
10391043
* Get the list of packages in a Python Environment.
10401044
*
10411045
* @param environment The Python Environment for which the list of packages is required.
1046+
* @param options Optional settings for package retrieval.
10421047
* @returns The list of packages in the Python Environment.
10431048
*/
1044-
getPackages(environment: PythonEnvironment): Promise<Package[] | undefined>;
1049+
getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined>;
10451050

10461051
/**
10471052
* Event raised when the list of packages in a Python Environment changes.

src/features/pythonApi.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
EnvironmentManager,
1111
GetEnvironmentScope,
1212
GetEnvironmentsScope,
13+
GetPackagesOptions,
1314
Package,
1415
PackageId,
1516
PackageInfo,
@@ -96,9 +97,9 @@ class PythonEnvironmentApiImpl implements PythonEnvironmentApi {
9697
// *selected* manager's changes propagate (refreshEnvironment checks
9798
// getEnvironmentManager(scope) internally). It updates the cache and
9899
// fires onDidChangeActiveEnvironment, which the Python API listens to.
99-
this.envManagers.refreshEnvironment(e.uri).catch((err) =>
100-
traceError('Failed to refresh environment on change:', err),
101-
);
100+
this.envManagers
101+
.refreshEnvironment(e.uri)
102+
.catch((err) => traceError('Failed to refresh environment on change:', err));
102103
});
103104
}),
104105
);
@@ -257,13 +258,13 @@ class PythonEnvironmentApiImpl implements PythonEnvironmentApi {
257258
}
258259
return manager.refresh(context);
259260
}
260-
async getPackages(context: PythonEnvironment): Promise<Package[] | undefined> {
261+
async getPackages(context: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined> {
261262
await waitForEnvManagerId([context.envId.managerId]);
262263
const manager = this.envManagers.getPackageManager(context);
263264
if (!manager) {
264265
return Promise.resolve(undefined);
265266
}
266-
return manager.getPackages(context);
267+
return manager.getPackages(context, options);
267268
}
268269
onDidChangePackages: Event<DidChangePackagesEventArgs> = this._onDidChangePackages.event;
269270
createPackageItem(info: PackageInfo, environment: PythonEnvironment, manager: PackageManager): Package {

src/internal.api.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
EnvironmentManager,
1010
GetEnvironmentScope,
1111
GetEnvironmentsScope,
12+
GetPackagesOptions,
1213
IconPath,
1314
Package,
1415
PackageChangeKind,
@@ -367,12 +368,8 @@ export class InternalPackageManager implements PackageManager {
367368
return this.manager.refresh(environment);
368369
}
369370

370-
getPackages(environment: PythonEnvironment): Promise<Package[] | undefined> {
371-
return this.manager.getPackages(environment);
372-
}
373-
374-
fetchPackages(environment: PythonEnvironment): Promise<Package[]> {
375-
return this.manager.fetchPackages(environment);
371+
getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined> {
372+
return this.manager.getPackages(environment, options);
376373
}
377374

378375
setPackages(

src/managers/builtin/pipPackageManager.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
} from 'vscode';
1212
import {
1313
DidChangePackagesEventArgs,
14+
GetPackagesOptions,
1415
IconPath,
1516
Package,
1617
PackageChangeKind,
@@ -106,9 +107,12 @@ export class PipPackageManager implements PackageManager, Disposable {
106107
);
107108
}
108109

109-
async getPackages(environment: PythonEnvironment): Promise<Package[] | undefined> {
110-
if (!this.packages.has(environment.envId.id)) {
111-
await this.refresh(environment);
110+
async getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined> {
111+
if (options?.skipCache || !this.packages.has(environment.envId.id)) {
112+
const data = await refreshPipPackages(environment, this.log);
113+
const packages = (data ?? []).map((pkg) => this.api.createPackageItem(pkg, environment, this));
114+
this.packages.set(environment.envId.id, packages);
115+
return packages;
112116
}
113117
return this.packages.get(environment.envId.id);
114118
}
@@ -118,11 +122,6 @@ export class PipPackageManager implements PackageManager, Disposable {
118122
this.packages.clear();
119123
}
120124

121-
async fetchPackages(environment: PythonEnvironment): Promise<Package[]> {
122-
const data = await refreshPipPackages(environment, this.log);
123-
return (data ?? []).map((pkg) => this.api.createPackageItem(pkg, environment, this));
124-
}
125-
126125
setPackages(
127126
environment: PythonEnvironment,
128127
packages: Package[],

src/managers/common/packageChanges.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export async function updatePackagesAndNotify(
4242
environment: PythonEnvironment,
4343
before?: Package[],
4444
): Promise<void> {
45-
const after = await packageManager.fetchPackages(environment);
45+
const after = (await packageManager.getPackages(environment, { skipCache: true })) ?? [];
4646
const changes = getPackageChanges(before ?? [], after);
4747
packageManager.setPackages(environment, after, changes);
4848
}

src/managers/conda/condaPackageManager.ts

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
} from 'vscode';
1010
import {
1111
DidChangePackagesEventArgs,
12+
GetPackagesOptions,
1213
IconPath,
1314
Package,
1415
PackageChangeKind,
@@ -100,9 +101,38 @@ export class CondaPackageManager implements PackageManager, Disposable {
100101
);
101102
}
102103

103-
async getPackages(environment: PythonEnvironment): Promise<Package[] | undefined> {
104-
if (!this.packages.has(environment.envId.id)) {
105-
await this.refresh(environment);
104+
async getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined> {
105+
if (options?.skipCache || !this.packages.has(environment.envId.id)) {
106+
const args = ['list', '-p', environment.environmentPath.fsPath, '--json'];
107+
const data = await runCondaExecutable(args);
108+
109+
let condaPackages: { name: string; version: string }[];
110+
try {
111+
condaPackages = JSON.parse(data) as { name: string; version: string }[];
112+
} catch (e) {
113+
traceError(`Failed to parse conda list JSON output: ${data}`, e);
114+
return [];
115+
}
116+
117+
const packages: Package[] = [];
118+
for (const condaPkg of condaPackages) {
119+
if (condaPkg.name && condaPkg.version) {
120+
packages.push(
121+
this.api.createPackageItem(
122+
{
123+
name: condaPkg.name,
124+
displayName: condaPkg.name,
125+
version: condaPkg.version,
126+
description: condaPkg.version,
127+
},
128+
environment,
129+
this,
130+
),
131+
);
132+
}
133+
}
134+
this.packages.set(environment.envId.id, packages);
135+
return packages;
106136
}
107137
return this.packages.get(environment.envId.id);
108138
}
@@ -112,38 +142,6 @@ export class CondaPackageManager implements PackageManager, Disposable {
112142
this.packages.clear();
113143
}
114144

115-
async fetchPackages(environment: PythonEnvironment): Promise<Package[]> {
116-
const args = ['list', '-p', environment.environmentPath.fsPath, '--json'];
117-
const data = await runCondaExecutable(args);
118-
119-
let condaPackages: { name: string; version: string }[];
120-
try {
121-
condaPackages = JSON.parse(data) as { name: string; version: string }[];
122-
} catch (e) {
123-
traceError(`Failed to parse conda list JSON output: ${data}`, e);
124-
return [];
125-
}
126-
127-
const packages: Package[] = [];
128-
for (const condaPkg of condaPackages) {
129-
if (condaPkg.name && condaPkg.version) {
130-
packages.push(
131-
this.api.createPackageItem(
132-
{
133-
name: condaPkg.name,
134-
displayName: condaPkg.name,
135-
version: condaPkg.version,
136-
description: condaPkg.version,
137-
},
138-
environment,
139-
this,
140-
),
141-
);
142-
}
143-
}
144-
return packages;
145-
}
146-
147145
setPackages(
148146
environment: PythonEnvironment,
149147
packages: Package[],

src/managers/poetry/poetryPackageManager.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import { Disposable } from 'vscode-jsonrpc';
1515
import {
1616
DidChangePackagesEventArgs,
17+
GetPackagesOptions,
1718
IconPath,
1819
Package,
1920
PackageChangeKind,
@@ -124,9 +125,11 @@ export class PoetryPackageManager implements PackageManager, Disposable {
124125
);
125126
}
126127

127-
async getPackages(environment: PythonEnvironment): Promise<Package[] | undefined> {
128-
if (!this.packages.has(environment.envId.id)) {
129-
await this.refresh(environment);
128+
async getPackages(environment: PythonEnvironment, options?: GetPackagesOptions): Promise<Package[] | undefined> {
129+
if (options?.skipCache || !this.packages.has(environment.envId.id)) {
130+
const packages = await this.fetchPackagesFromTool(environment);
131+
this.packages.set(environment.envId.id, packages);
132+
return packages;
130133
}
131134
return this.packages.get(environment.envId.id);
132135
}
@@ -176,7 +179,7 @@ export class PoetryPackageManager implements PackageManager, Disposable {
176179
}
177180
}
178181

179-
async fetchPackages(environment: PythonEnvironment): Promise<Package[]> {
182+
private async fetchPackagesFromTool(environment: PythonEnvironment): Promise<Package[]> {
180183
const poetry = await getPoetry();
181184
if (!poetry) {
182185
throw new Error(

0 commit comments

Comments
 (0)