diff --git a/extensions/notebook/src/dialog/configurePython/configurePathPage.ts b/extensions/notebook/src/dialog/configurePython/configurePathPage.ts index a84db25f67..18401e309b 100644 --- a/extensions/notebook/src/dialog/configurePython/configurePathPage.ts +++ b/extensions/notebook/src/dialog/configurePython/configurePathPage.ts @@ -8,7 +8,6 @@ import * as azdata from 'azdata'; import { BasePage } from './basePage'; import * as nls from 'vscode-nls'; import { JupyterServerInstallation } from '../../jupyter/jupyterServerInstallation'; -import { PythonPathInfo } from '../pythonPathLookup'; import * as utils from '../../common/utils'; const localize = nls.loadMessageBundle(); @@ -160,10 +159,9 @@ export class ConfigurePathPage extends BasePage { this.instance.wizard.nextButton.enabled = false; this.pythonDropdownLoader.loading = true; try { - let pythonPaths: PythonPathInfo[]; let dropdownValues: azdata.CategoryValue[]; if (useExistingPython) { - pythonPaths = await this.model.pythonPathsPromise; + let pythonPaths = await this.model.pythonPathLookup.getSuggestions(); if (pythonPaths && pythonPaths.length > 0) { dropdownValues = pythonPaths.map(path => { return { diff --git a/extensions/notebook/src/dialog/configurePython/configurePythonWizard.ts b/extensions/notebook/src/dialog/configurePython/configurePythonWizard.ts index 072b78b813..1d0c31e27e 100644 --- a/extensions/notebook/src/dialog/configurePython/configurePythonWizard.ts +++ b/extensions/notebook/src/dialog/configurePython/configurePythonWizard.ts @@ -5,7 +5,6 @@ import * as nls from 'vscode-nls'; import * as azdata from 'azdata'; -import * as vscode from 'vscode'; import { BasePage } from './basePage'; import { ConfigurePathPage } from './configurePathPage'; import { PickPackagesPage } from './pickPackagesPage'; @@ -13,7 +12,7 @@ import { JupyterServerInstallation, PythonPkgDetails, PythonInstallSettings } fr import * as utils from '../../common/utils'; import { promises as fs } from 'fs'; import { Deferred } from '../../common/promise'; -import { PythonPathInfo, PythonPathLookup } from '../pythonPathLookup'; +import { PythonPathLookup } from '../pythonPathLookup'; const localize = nls.loadMessageBundle(); @@ -21,7 +20,7 @@ export interface ConfigurePythonModel { kernelName: string; pythonLocation: string; useExistingPython: boolean; - pythonPathsPromise: Promise; + pythonPathLookup: PythonPathLookup; packagesToInstall: PythonPkgDetails[]; installation: JupyterServerInstallation; } @@ -35,11 +34,9 @@ export class ConfigurePythonWizard { private model: ConfigurePythonModel; private _setupComplete: Deferred; - private pythonPathsPromise: Promise; - constructor(private jupyterInstallation: JupyterServerInstallation, private readonly _outputChannel: vscode.OutputChannel) { + constructor(private jupyterInstallation: JupyterServerInstallation) { this._setupComplete = new Deferred(); - this.pythonPathsPromise = (new PythonPathLookup(this._outputChannel)).getSuggestions(); } public get wizard(): azdata.window.Wizard { @@ -53,7 +50,7 @@ export class ConfigurePythonWizard { public async start(kernelName?: string, rejectOnCancel?: boolean): Promise { this.model = { kernelName: kernelName, - pythonPathsPromise: this.pythonPathsPromise, + pythonPathLookup: new PythonPathLookup(), installation: this.jupyterInstallation, pythonLocation: JupyterServerInstallation.getPythonPathSetting(), useExistingPython: JupyterServerInstallation.getExistingPythonSetting() diff --git a/extensions/notebook/src/dialog/pythonPathLookup.ts b/extensions/notebook/src/dialog/pythonPathLookup.ts index 2d8ed7f360..ed1f31f9cb 100644 --- a/extensions/notebook/src/dialog/pythonPathLookup.ts +++ b/extensions/notebook/src/dialog/pythonPathLookup.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as glob from 'glob'; -import * as vscode from 'vscode'; import * as utils from '../common/utils'; import * as constants from '../common/constants'; @@ -16,7 +15,7 @@ export interface PythonPathInfo { export class PythonPathLookup { private condaLocations: string[]; - constructor(private readonly _outputChannel: vscode.OutputChannel) { + constructor() { if (process.platform !== constants.winPlatform) { let userFolder = process.env['HOME']; this.condaLocations = [ @@ -57,7 +56,7 @@ export class PythonPathLookup { let condaFiles = condaResults.reduce((first, second) => first.concat(second)); return condaFiles.filter(condaPath => condaPath && condaPath.length > 0); } catch (err) { - this._outputChannel.appendLine(`Problem encountered getting Conda installations: ${err}`); + console.log(`Problem encountered getting Conda installations: ${err}`); } return []; } @@ -86,7 +85,7 @@ export class PythonPathLookup { return results; } - private async getPythonPath(options: { command: string; args?: string[] }): Promise { + private async getPythonPath(options: { command: string; args?: string[] }): Promise { try { let args = Array.isArray(options.args) ? options.args : []; args = args.concat(['-c', '"import sys;print(sys.executable)"']); @@ -97,7 +96,7 @@ export class PythonPathLookup { return value; } } catch (err) { - this._outputChannel.appendLine(`Problem encountered getting Python path: ${err}`); + // Ignoring this error since it's probably from trying to run a non-existent python executable. } return undefined; @@ -141,7 +140,7 @@ export class PythonPathLookup { }); } - private async getInfoForPath(pythonPath: string): Promise { + private async getInfoForPath(pythonPath: string): Promise { try { // "python --version" returns nothing from executeBufferedCommand with Python 2.X, // so use sys.version_info here instead. @@ -160,7 +159,7 @@ export class PythonPathLookup { }; } } catch (err) { - this._outputChannel.appendLine(`Problem encountered getting Python info for path: ${err}`); + console.log(`Problem encountered getting Python info for path: ${err}`); } return undefined; } diff --git a/extensions/notebook/src/jupyter/jupyterController.ts b/extensions/notebook/src/jupyter/jupyterController.ts index a858c3c249..ca17b2216b 100644 --- a/extensions/notebook/src/jupyter/jupyterController.ts +++ b/extensions/notebook/src/jupyter/jupyterController.ts @@ -234,7 +234,7 @@ export class JupyterController { } public doConfigurePython(jupyterInstaller: JupyterServerInstallation): void { - let pythonWizard = new ConfigurePythonWizard(jupyterInstaller, this.appContext.outputChannel); + let pythonWizard = new ConfigurePythonWizard(jupyterInstaller); pythonWizard.start().catch((err: any) => { vscode.window.showErrorMessage(utils.getErrorMessage(err)); }); diff --git a/extensions/notebook/src/jupyter/jupyterServerInstallation.ts b/extensions/notebook/src/jupyter/jupyterServerInstallation.ts index 2ec83c6cff..024c505eb3 100644 --- a/extensions/notebook/src/jupyter/jupyterServerInstallation.ts +++ b/extensions/notebook/src/jupyter/jupyterServerInstallation.ts @@ -435,7 +435,7 @@ export class JupyterServerInstallation implements IJupyterServerInstallation { let isPythonInstalled = JupyterServerInstallation.isPythonInstalled(); let areRequiredPackagesInstalled = await this.areRequiredPackagesInstalled(kernelDisplayName); if (!isPythonInstalled || !areRequiredPackagesInstalled) { - let pythonWizard = new ConfigurePythonWizard(this, this.outputChannel); + let pythonWizard = new ConfigurePythonWizard(this); await pythonWizard.start(kernelDisplayName, true); return pythonWizard.setupComplete.then(() => { this._kernelSetupCache.set(kernelDisplayName, true); diff --git a/extensions/notebook/src/test/python/configurePython.test.ts b/extensions/notebook/src/test/python/configurePython.test.ts index c47013515e..2a91c1edea 100644 --- a/extensions/notebook/src/test/python/configurePython.test.ts +++ b/extensions/notebook/src/test/python/configurePython.test.ts @@ -13,16 +13,14 @@ import { PickPackagesPage } from '../../dialog/configurePython/pickPackagesPage' import { python3DisplayName, allKernelsName } from '../../common/constants'; import { TestContext, createViewContext, TestButton } from '../common'; import { EventEmitter } from 'vscode'; -import { MockOutputChannel } from '../common/stubs'; +import { PythonPathLookup } from '../../dialog/pythonPathLookup'; describe('Configure Python Wizard', function () { let testWizard: ConfigurePythonWizard; let viewContext: TestContext; let testInstallation: JupyterServerInstallation; - let mockOutputChannel: TypeMoq.IMock; beforeEach(() => { - mockOutputChannel = TypeMoq.Mock.ofType(MockOutputChannel); let mockInstall = TypeMoq.Mock.ofType(JupyterServerInstallation); mockInstall.setup(i => i.getInstalledPipPackages(TypeMoq.It.isAnyString())).returns(() => Promise.resolve([])); mockInstall.setup(i => i.getRequiredPackagesForKernel(TypeMoq.It.isAnyString())).returns(() => [{ name: 'TestPkg', version: '1.0.0'}]); @@ -44,21 +42,21 @@ describe('Configure Python Wizard', function () { }); it('Start wizard test', async () => { - let wizard = new ConfigurePythonWizard(testInstallation, mockOutputChannel.object); + let wizard = new ConfigurePythonWizard(testInstallation); await wizard.start(); await wizard.close(); await should(wizard.setupComplete).be.resolved(); }); it('Reject setup on cancel test', async () => { - let wizard = new ConfigurePythonWizard(testInstallation, mockOutputChannel.object); + let wizard = new ConfigurePythonWizard(testInstallation); await wizard.start(undefined, true); await wizard.close(); await should(wizard.setupComplete).be.rejected(); }); it('Error message test', async () => { - let wizard = new ConfigurePythonWizard(testInstallation, mockOutputChannel.object); + let wizard = new ConfigurePythonWizard(testInstallation); await wizard.start(); should(wizard.wizard.message).be.undefined(); @@ -72,16 +70,21 @@ describe('Configure Python Wizard', function () { should(wizard.wizard.message).be.undefined(); await wizard.close(); + await should(wizard.setupComplete).be.resolved(); }); it('Configure Path Page test', async () => { let testPythonLocation = '/not/a/real/path'; - let model = { - useExistingPython: true, - pythonPathsPromise: Promise.resolve([{ + let mockPathLookup = TypeMoq.Mock.ofType(PythonPathLookup); + mockPathLookup.setup(p => p.getSuggestions()).returns(() => + Promise.resolve([{ installDir: testPythonLocation, version: '4000' }]) + ); + let model = { + useExistingPython: true, + pythonPathLookup: mockPathLookup.object }; let page = azdata.window.createWizardPage('Page 1');