Skip to content

Commit a9e2dcc

Browse files
author
Kartik Raj
authored
Add non-blocking discovery APIs for Jupyter (#17452)
* Add non-blocking discovery APIs for Jupyter * Add suggestionToQuickPickItem as well * News entry
1 parent a68f98f commit a9e2dcc

9 files changed

Lines changed: 48 additions & 14 deletions

File tree

news/1 Enhancements/17452.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Added non-blocking discovery APIs for Jupyter.

src/client/interpreter/configuration/interpreterSelector/commands/setInterpreter.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,16 +210,16 @@ export class SetInterpreterCommand extends BaseInterpreterSelectorCommand {
210210
resource: Resource,
211211
): Promise<QuickPickType[]> {
212212
const updatedItems = [...items.values()];
213-
const env = event.old ?? event.update;
213+
const env = event.old ?? event.new;
214214
let envIndex = -1;
215215
if (env) {
216216
envIndex = updatedItems.findIndex(
217217
(item) => isInterpreterQuickPickItem(item) && arePathsSame(item.interpreter.path, env.path),
218218
);
219219
}
220-
if (event.update) {
220+
if (event.new) {
221221
const newSuggestion: QuickPickType = this.interpreterSelector.suggestionToQuickPickItem(
222-
event.update,
222+
event.new,
223223
resource,
224224
);
225225
if (envIndex === -1) {
@@ -228,7 +228,7 @@ export class SetInterpreterCommand extends BaseInterpreterSelectorCommand {
228228
updatedItems[envIndex] = newSuggestion;
229229
}
230230
}
231-
if (envIndex !== -1 && event.update === undefined) {
231+
if (envIndex !== -1 && event.new === undefined) {
232232
updatedItems.splice(envIndex, 1);
233233
}
234234
await this.setRecommendedItem(updatedItems, resource);

src/client/interpreter/contracts.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export type PythonEnvironmentsChangedEvent = {
3636
type?: FileChangeType;
3737
resource?: Uri;
3838
old?: PythonEnvironment;
39-
update?: PythonEnvironment | undefined;
39+
new?: PythonEnvironment | undefined;
4040
};
4141

4242
export const IComponentAdapter = Symbol('IComponentAdapter');
@@ -110,6 +110,7 @@ export interface ICondaLocatorService {
110110

111111
export const IInterpreterService = Symbol('IInterpreterService');
112112
export interface IInterpreterService {
113+
readonly onRefreshStart: Event<void>;
113114
triggerRefresh(query?: PythonLocatorQuery): Promise<void>;
114115
readonly refreshPromise: Promise<void> | undefined;
115116
readonly onDidChangeInterpreters: Event<PythonEnvironmentsChangedEvent>;

src/client/interpreter/interpreterService.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ export class InterpreterService implements Disposable, IInterpreterService {
5757
});
5858
}
5959

60+
public get onRefreshStart(): Event<void> {
61+
return this.pyenvs.onRefreshStart;
62+
}
63+
6064
public triggerRefresh(query?: PythonLocatorQuery): Promise<void> {
6165
return inDiscoveryExperimentSync(this.experimentService)
6266
? this.pyenvs.triggerRefresh(query)

src/client/jupyter/jupyterIntegration.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
IInterpreterDisplay,
3232
IInterpreterService,
3333
IInterpreterStatusbarVisibilityFilter,
34+
PythonEnvironmentsChangedEvent,
3435
} from '../interpreter/contracts';
3536
import { PythonEnvironment } from '../pythonEnvironments/info';
3637
import { IDataViewerDataProvider, IJupyterUriProvider } from './types';
@@ -72,6 +73,19 @@ type PythonApiForJupyterExtension = {
7273
/**
7374
* IInterpreterService
7475
*/
76+
readonly refreshPromise: Promise<void> | undefined;
77+
/**
78+
* IInterpreterService
79+
*/
80+
readonly onDidChangeInterpreters: Event<PythonEnvironmentsChangedEvent>;
81+
/**
82+
* Equivalent to getInterpreters() in IInterpreterService
83+
*/
84+
getKnownInterpreters(resource?: Uri): PythonEnvironment[];
85+
/**
86+
* @deprecated Use `getKnownInterpreters`, `onDidChangeInterpreters`, and `refreshPromise` instead.
87+
* Equivalent to getAllInterpreters() in IInterpreterService
88+
*/
7589
getInterpreters(resource?: Uri): Promise<PythonEnvironment[]>;
7690
/**
7791
* IInterpreterService
@@ -91,6 +105,11 @@ type PythonApiForJupyterExtension = {
91105
allowExceptions?: boolean,
92106
): Promise<NodeJS.ProcessEnv | undefined>;
93107
isWindowsStoreInterpreter(pythonPath: string): Promise<boolean>;
108+
suggestionToQuickPickItem(suggestion: PythonEnvironment, workspaceUri?: Uri | undefined): IInterpreterQuickPickItem;
109+
getKnownSuggestions(resource: Resource): Promise<IInterpreterQuickPickItem[]>;
110+
/**
111+
* @deprecated Use `getKnownSuggestions` and `suggestionToQuickPickItem` instead.
112+
*/
94113
getSuggestions(resource: Resource): Promise<IInterpreterQuickPickItem[]>;
95114
/**
96115
* IInstaller
@@ -170,6 +189,9 @@ export class JupyterExtensionIntegration {
170189
getActiveInterpreter: async (resource?: Uri) => this.interpreterService.getActiveInterpreter(resource),
171190
getInterpreterDetails: async (pythonPath: string) =>
172191
this.interpreterService.getInterpreterDetails(pythonPath),
192+
refreshPromise: this.interpreterService.refreshPromise,
193+
onDidChangeInterpreters: this.interpreterService.onDidChangeInterpreters,
194+
getKnownInterpreters: (resource: Uri | undefined) => this.pyenvs.getInterpreters(resource),
173195
getInterpreters: async (resource: Uri | undefined) => this.interpreterService.getAllInterpreters(resource),
174196
getActivatedEnvironmentVariables: async (
175197
resource: Resource,
@@ -184,6 +206,13 @@ export class JupyterExtensionIntegration {
184206
},
185207
getSuggestions: async (resource: Resource): Promise<IInterpreterQuickPickItem[]> =>
186208
this.interpreterSelector.getAllSuggestions(resource),
209+
getKnownSuggestions: async (resource: Resource): Promise<IInterpreterQuickPickItem[]> =>
210+
this.interpreterSelector.getSuggestions(resource),
211+
suggestionToQuickPickItem: (
212+
suggestion: PythonEnvironment,
213+
workspaceUri?: Uri | undefined,
214+
): IInterpreterQuickPickItem =>
215+
this.interpreterSelector.suggestionToQuickPickItem(suggestion, workspaceUri),
187216
install: async (
188217
product: JupyterProductToInstall,
189218
resource?: InterpreterUri,

src/client/pythonEnvironments/base/locators/composite/envsCollectionCache.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ export class PythonEnvInfoCache extends PythonEnvsWatcher<PythonEnvCollectionCha
8181
const invalidIndexes = areEnvsValid.map((isValid, index) => (isValid ? -1 : index)).filter((i) => i !== -1);
8282
invalidIndexes.forEach((index) => {
8383
const env = this.envs.splice(index, 1)[0];
84-
// Ensure we fire events for any envs removed from collection.
85-
this.fire({ old: env, update: undefined });
84+
this.fire({ old: env, new: undefined });
8685
});
8786
}
8887

@@ -94,7 +93,7 @@ export class PythonEnvInfoCache extends PythonEnvsWatcher<PythonEnvCollectionCha
9493
const found = this.envs.find((e) => areSameEnv(e, env));
9594
if (!found) {
9695
this.envs.push(env);
97-
this.fire({ update: env });
96+
this.fire({ new: env });
9897
}
9998
}
10099

@@ -106,7 +105,7 @@ export class PythonEnvInfoCache extends PythonEnvsWatcher<PythonEnvCollectionCha
106105
} else {
107106
this.envs[index] = newValue;
108107
}
109-
this.fire({ old: oldValue, update: newValue });
108+
this.fire({ old: oldValue, new: newValue });
110109
}
111110
}
112111

src/client/pythonEnvironments/base/watcher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export type PythonEnvCollectionChangedEvent = BasicPythonEnvCollectionChangedEve
3636

3737
export type BasicPythonEnvCollectionChangedEvent = {
3838
old?: PythonEnvInfo;
39-
update?: PythonEnvInfo | undefined;
39+
new?: PythonEnvInfo | undefined;
4040
};
4141

4242
/**

src/client/pythonEnvironments/legacyIOC.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class ComponentAdapter implements IComponentAdapter {
149149
this.api.onChanged((event) => {
150150
this.changed.fire({
151151
type: event.type,
152-
update: event.update ? convertEnvInfo(event.update) : undefined,
152+
new: event.new ? convertEnvInfo(event.new) : undefined,
153153
old: event.old ? convertEnvInfo(event.old) : undefined,
154154
resource: event.searchLocation,
155155
});
@@ -276,8 +276,8 @@ class ComponentAdapter implements IComponentAdapter {
276276
const onAddedToCollection = createDeferred();
277277
// Watch for collection changed events.
278278
this.api.onChanged(async (e: PythonEnvCollectionChangedEvent) => {
279-
if (e.update) {
280-
if (await filter(convertEnvInfo(e.update))) {
279+
if (e.new) {
280+
if (await filter(convertEnvInfo(e.new))) {
281281
onAddedToCollection.resolve();
282282
}
283283
}

src/test/configuration/interpreterSelector/commands/setInterpreter.unit.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ suite('Set Interpreter Command', () => {
276276

277277
const changeEvent: PythonEnvironmentsChangedEvent = {
278278
old: item.interpreter,
279-
update: refreshedItem.interpreter,
279+
new: refreshedItem.interpreter,
280280
};
281281
// eslint-disable-next-line @typescript-eslint/no-explicit-any
282282
await onChangedCallback!(changeEvent, quickPick as any); // Invoke callback, meaning that the items are supposed to change.

0 commit comments

Comments
 (0)