Skip to content

Commit 6bc409d

Browse files
authored
Ensures development mode ids are calculated from development path (#97)
Fixes #96
1 parent 0a0bb6b commit 6bc409d

File tree

5 files changed

+61
-26
lines changed

5 files changed

+61
-26
lines changed

src/api.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,9 @@ export interface EnvironmentManager {
316316
readonly displayName?: string;
317317

318318
/**
319-
* The preferred package manager ID for the environment manager.
319+
* The preferred package manager ID for the environment manager. This is a combination
320+
* of publisher id, extension id, and {@link EnvironmentManager.name package manager name}.
321+
* `<publisher-id>.<extension-id>:<package-manager-name>`
320322
*
321323
* @example
322324
* 'ms-python.python:pip'

src/common/extension.apis.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@ import { Extension, extensions } from 'vscode';
44
export function getExtension<T = any>(extensionId: string): Extension<T> | undefined {
55
return extensions.getExtension(extensionId);
66
}
7+
8+
export function allExtensions(): readonly Extension<any>[] {
9+
return extensions.all;
10+
}

src/common/extensions.apis.ts

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/common/utils/frameUtils.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { ENVS_EXTENSION_ID, PYTHON_EXTENSION_ID } from '../constants';
2+
import { parseStack } from '../errors/utils';
3+
import { allExtensions, getExtension } from '../extension.apis';
4+
5+
interface FrameData {
6+
filePath: string;
7+
functionName: string;
8+
}
9+
10+
function getFrameData(): FrameData[] {
11+
const frames = parseStack(new Error());
12+
return frames.map((frame) => ({
13+
filePath: frame.getFileName(),
14+
functionName: frame.getFunctionName(),
15+
}));
16+
}
17+
18+
export function getCallingExtension(): string {
19+
const pythonExts = [ENVS_EXTENSION_ID, PYTHON_EXTENSION_ID];
20+
21+
const extensions = allExtensions();
22+
const otherExts = extensions.filter((ext) => !pythonExts.includes(ext.id));
23+
const frames = getFrameData().filter((frame) => !!frame.filePath);
24+
25+
for (const frame of frames) {
26+
const filename = frame.filePath;
27+
if (filename) {
28+
const ext = otherExts.find((ext) => filename.includes(ext.id));
29+
if (ext) {
30+
return ext.id;
31+
}
32+
}
33+
}
34+
35+
// `ms-python.vscode-python-envs` extension in Development mode
36+
const candidates = frames.filter((frame) => otherExts.some((s) => frame.filePath.includes(s.extensionPath)));
37+
const envsExtPath = getExtension(ENVS_EXTENSION_ID)?.extensionPath;
38+
if (!envsExtPath) {
39+
throw new Error('Something went wrong with feature registration');
40+
}
41+
42+
if (candidates.length === 0 && frames.every((frame) => frame.filePath.startsWith(envsExtPath))) {
43+
return PYTHON_EXTENSION_ID;
44+
}
45+
46+
// 3rd party extension in Development mode
47+
const candidateExt = otherExts.find((ext) => candidates[0].filePath.includes(ext.extensionPath));
48+
if (candidateExt) {
49+
return candidateExt.id;
50+
}
51+
52+
throw new Error('Unable to determine calling extension id, registration failed');
53+
}

src/features/envManagers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import {
3030
PythonProjectManager,
3131
PythonProjectSettings,
3232
} from '../internal.api';
33-
import { getCallingExtension } from '../common/extensions.apis';
33+
import { getCallingExtension } from '../common/utils/frameUtils';
3434
import {
3535
EnvironmentManagerAlreadyRegisteredError,
3636
PackageManagerAlreadyRegisteredError,

0 commit comments

Comments
 (0)