Skip to content

Commit 6104602

Browse files
committed
Use PythonVersion version when getting latest python version
1 parent 860c6bd commit 6104602

2 files changed

Lines changed: 41 additions & 1 deletion

File tree

src/managers/common/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import path from 'path';
44
import { commands, ConfigurationTarget, l10n, window, workspace } from 'vscode';
55
import { PythonCommandRunConfiguration, PythonEnvironment, PythonEnvironmentApi } from '../../api';
66
import { traceLog, traceVerbose } from '../../common/logging';
7+
import { PythonVersion } from '../../common/pythonVersion';
78
import { isWindows } from '../../common/utils/platformUtils';
89
import { ShellConstants } from '../../features/common/shellConstants';
910
import { getDefaultEnvManagerSetting, setDefaultEnvManagerBroken } from '../../features/settings/settingHelpers';
@@ -68,9 +69,12 @@ export function getLatest(collection: PythonEnvironment[]): PythonEnvironment |
6869
const candidates = nonErroredEnvs.length > 0 ? nonErroredEnvs : collection;
6970

7071
let latest = candidates[0];
72+
let latestVersion: PythonVersion | undefined;
7173
for (const env of candidates) {
72-
if (pep440Valid(env.version) && pep440Valid(latest.version) && pep440Compare(env.version, latest.version) > 0) {
74+
const version = PythonVersion.tryParse(env.version);
75+
if (version && (!latestVersion || version.compareTo(latestVersion) > 0)) {
7376
latest = env;
77+
latestVersion = version;
7478
}
7579
}
7680
return latest;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import assert from 'node:assert';
2+
import path from 'node:path';
3+
import { getLatest } from '../../../managers/common/utils';
4+
import { createMockPythonEnvironment } from '../../mocks/pythonEnvironment';
5+
6+
suite('getLatest', () => {
7+
test('selects the latest normalized Python version', () => {
8+
const systemPython = createMockPythonEnvironment({
9+
envPath: path.join('usr', 'bin', 'python3'),
10+
version: '3.9.6.final.0',
11+
});
12+
const homebrewPython = createMockPythonEnvironment({
13+
envPath: path.join('opt', 'homebrew', 'bin', 'python3'),
14+
version: '3.14.3.final.0',
15+
});
16+
17+
assert.strictEqual(getLatest([systemPython, homebrewPython]), homebrewPython);
18+
});
19+
20+
test('prefers a comparable version when the first version is invalid', () => {
21+
const invalid = createMockPythonEnvironment({ envPath: path.join('invalid', 'python'), version: 'unknown' });
22+
const valid = createMockPythonEnvironment({ envPath: path.join('valid', 'python'), version: '3.14.3' });
23+
24+
assert.strictEqual(getLatest([invalid, valid]), valid);
25+
});
26+
27+
test('excludes errored environments when a usable environment exists', () => {
28+
const older = createMockPythonEnvironment({ envPath: path.join('older', 'python'), version: '3.9.6' });
29+
const errored = {
30+
...createMockPythonEnvironment({ envPath: path.join('errored', 'python'), version: '3.14.3' }),
31+
error: 'Broken interpreter',
32+
};
33+
34+
assert.strictEqual(getLatest([older, errored]), older);
35+
});
36+
});

0 commit comments

Comments
 (0)