Skip to content

Commit ac59e73

Browse files
Copiloteleanorjboyd
andcommitted
Add uv detection and displayName update functionality
Co-authored-by: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com>
1 parent 1713614 commit ac59e73

File tree

2 files changed

+103
-1
lines changed

2 files changed

+103
-1
lines changed

src/managers/builtin/venvManager.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import {
5252
setVenvForWorkspace,
5353
setVenvForWorkspaces,
5454
} from './venvUtils';
55+
import { isUvInstalled } from './helpers';
5556

5657
export class VenvManager implements EnvironmentManager {
5758
private collection: PythonEnvironment[] = [];
@@ -66,7 +67,7 @@ export class VenvManager implements EnvironmentManager {
6667
public readonly onDidChangeEnvironments = this._onDidChangeEnvironments.event;
6768

6869
readonly name: string;
69-
readonly displayName: string;
70+
displayName: string; // Made mutable to update with uv detection
7071
readonly preferredPackageManagerId: string;
7172
readonly description?: string | undefined;
7273
readonly tooltip?: string | MarkdownString | undefined;
@@ -97,6 +98,13 @@ export class VenvManager implements EnvironmentManager {
9798
this._initialized = createDeferred();
9899

99100
try {
101+
// Check if uv is available and update display name accordingly
102+
const uvAvailable = await isUvInstalled(this.log);
103+
if (uvAvailable) {
104+
this.displayName = 'venv [uv]';
105+
this.log?.info('uv detected - updating venv manager display name');
106+
}
107+
100108
await this.internalRefresh(undefined, false, VenvManagerStrings.venvInitialize);
101109
} finally {
102110
this._initialized.resolve();
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import * as assert from 'assert';
2+
import * as sinon from 'sinon';
3+
import { LogOutputChannel } from 'vscode';
4+
import { VenvManager } from '../../../managers/builtin/venvManager';
5+
import * as helpers from '../../../managers/builtin/helpers';
6+
7+
suite('VenvManager uv labeling tests', () => {
8+
let sandbox: sinon.SinonSandbox;
9+
10+
setup(() => {
11+
sandbox = sinon.createSandbox();
12+
});
13+
14+
teardown(() => {
15+
sandbox.restore();
16+
});
17+
18+
test('should display "venv" when uv is not available', async () => {
19+
// Mock isUvInstalled to return false
20+
sandbox.stub(helpers, 'isUvInstalled').resolves(false);
21+
22+
// Create mocks for required dependencies
23+
const mockNativeFinder = {} as any;
24+
const mockApi = {} as any;
25+
const mockBaseManager = {} as any;
26+
const mockLog = {} as LogOutputChannel;
27+
28+
const mockInternalRefresh = sandbox.stub(VenvManager.prototype, 'internalRefresh' as any).resolves();
29+
30+
const manager = new VenvManager(mockNativeFinder, mockApi, mockBaseManager, mockLog);
31+
32+
// Verify initial state
33+
assert.strictEqual(manager.displayName, 'venv');
34+
35+
await manager.initialize();
36+
37+
// Verify displayName remains unchanged when uv is not available
38+
assert.strictEqual(manager.displayName, 'venv');
39+
assert.ok(mockInternalRefresh.calledOnce);
40+
});
41+
42+
test('should display "venv [uv]" when uv is available', async () => {
43+
// Mock isUvInstalled to return true
44+
sandbox.stub(helpers, 'isUvInstalled').resolves(true);
45+
46+
// Create mocks for required dependencies
47+
const mockNativeFinder = {} as any;
48+
const mockApi = {} as any;
49+
const mockBaseManager = {} as any;
50+
const mockLog = {
51+
info: sandbox.stub()
52+
} as any;
53+
54+
const mockInternalRefresh = sandbox.stub(VenvManager.prototype, 'internalRefresh' as any).resolves();
55+
56+
const manager = new VenvManager(mockNativeFinder, mockApi, mockBaseManager, mockLog);
57+
58+
// Verify initial state
59+
assert.strictEqual(manager.displayName, 'venv');
60+
61+
await manager.initialize();
62+
63+
// Verify displayName is updated when uv is available
64+
assert.strictEqual(manager.displayName, 'venv [uv]');
65+
assert.ok(mockInternalRefresh.calledOnce);
66+
assert.ok(mockLog.info.calledWith('uv detected - updating venv manager display name'));
67+
});
68+
69+
test('should only initialize once and preserve displayName', async () => {
70+
// Mock isUvInstalled to return true
71+
sandbox.stub(helpers, 'isUvInstalled').resolves(true);
72+
73+
// Create mocks for required dependencies
74+
const mockNativeFinder = {} as any;
75+
const mockApi = {} as any;
76+
const mockBaseManager = {} as any;
77+
const mockLog = {
78+
info: sandbox.stub()
79+
} as any;
80+
81+
const mockInternalRefresh = sandbox.stub(VenvManager.prototype, 'internalRefresh' as any).resolves();
82+
83+
const manager = new VenvManager(mockNativeFinder, mockApi, mockBaseManager, mockLog);
84+
85+
// Initialize multiple times
86+
await manager.initialize();
87+
await manager.initialize();
88+
89+
// Verify displayName is set correctly and internal refresh is called only once
90+
assert.strictEqual(manager.displayName, 'venv [uv]');
91+
assert.ok(mockInternalRefresh.calledOnce);
92+
assert.ok(mockLog.info.calledOnce);
93+
});
94+
});

0 commit comments

Comments
 (0)