Skip to content

Commit f8e9f5b

Browse files
authored
Get more nightly tests to pass (#11881)
* More logging for ipywidgets failures. * Dont output images * Fix commands to not execute after shutdown * Add some comments describing command dispose * Fix up logging and add missing dependencies * Add news entries for Barry's fix * Dont add news entries here. Too confusing
1 parent bbfb239 commit f8e9f5b

File tree

7 files changed

+65
-24
lines changed

7 files changed

+65
-24
lines changed

build/conda-functional-requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ django
1717
isort
1818
pathlib2>=2.2.0 ; python_version<'3.6' # Python 2.7 compatibility (pytest)
1919
pythreejs
20+
ipysheet
2021
ipyvolume
2122
beakerx
23+
py4j
2224
bqplot
2325
K3D
2426
debugpy

src/client/datascience/common.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import type { nbformat } from '@jupyterlab/coreutils';
55
import { Memento } from 'vscode';
66
import { splitMultilineString } from '../../datascience-ui/common';
77
import { noop } from '../common/utils/misc';
8+
import { traceError, traceInfo } from '../logging';
89
import { Settings } from './constants';
10+
import { ICell } from './types';
911

1012
// Can't figure out a better way to do this. Enumerate
1113
// the allowed keys of different output formats.
@@ -98,3 +100,23 @@ export function pruneCell(cell: nbformat.ICell): nbformat.ICell {
98100

99101
return result;
100102
}
103+
104+
export function traceCellResults(prefix: string, results: ICell[]) {
105+
if (results.length > 0 && results[0].data.cell_type === 'code') {
106+
const cell = results[0].data as nbformat.ICodeCell;
107+
const error = cell.outputs && cell.outputs[0] ? cell.outputs[0].evalue : undefined;
108+
if (error) {
109+
traceError(`${prefix} Error : ${error}`);
110+
} else if (cell.outputs && cell.outputs[0]) {
111+
if (cell.outputs[0].output_type.includes('image')) {
112+
traceInfo(`${prefix} Output: image`);
113+
} else {
114+
const data = cell.outputs[0].data;
115+
const text = cell.outputs[0].text;
116+
traceInfo(`${prefix} Output: ${text || JSON.stringify(data)}`);
117+
}
118+
}
119+
} else {
120+
traceInfo(`${prefix} no output.`);
121+
}
122+
}

src/client/datascience/jupyter/jupyterDebugger.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { IConfigurationService, IExperimentsManager, Version } from '../../commo
1717
import * as localize from '../../common/utils/localize';
1818
import { EXTENSION_ROOT_DIR } from '../../constants';
1919
import { captureTelemetry, sendTelemetryEvent } from '../../telemetry';
20+
import { traceCellResults } from '../common';
2021
import { Identifiers, Telemetry } from '../constants';
2122
import {
2223
CellState,
@@ -164,30 +165,14 @@ export class JupyterDebugger implements IJupyterDebugger, ICellHashListener {
164165
if (importResults.length === 0 || importResults[0].state === CellState.error) {
165166
traceWarning(`${this.debuggerPackage} not found in path.`);
166167
} else {
167-
this.traceCellResults('import startup', importResults);
168+
traceCellResults('import startup', importResults);
168169
}
169170

170171
// Then enable tracing
171172
await this.executeSilently(notebook, this.tracingEnableCode);
172173
}
173174
}
174175

175-
private traceCellResults(prefix: string, results: ICell[]) {
176-
if (results.length > 0 && results[0].data.cell_type === 'code') {
177-
const cell = results[0].data as nbformat.ICodeCell;
178-
const error = cell.outputs && cell.outputs[0] ? cell.outputs[0].evalue : undefined;
179-
if (error) {
180-
traceError(`${prefix} Error : ${error}`);
181-
} else if (cell.outputs && cell.outputs[0]) {
182-
const data = cell.outputs[0].data;
183-
const text = cell.outputs[0].text;
184-
traceInfo(`${prefix} Output: ${text || JSON.stringify(data)}`);
185-
}
186-
} else {
187-
traceInfo(`${prefix} no output.`);
188-
}
189-
}
190-
191176
private async connect(
192177
notebook: INotebook,
193178
runByLine: boolean,
@@ -322,7 +307,7 @@ export class JupyterDebugger implements IJupyterDebugger, ICellHashListener {
322307
notebook,
323308
`import sys\r\nsys.path.extend([${debuggerPathList}])\r\nsys.path`
324309
);
325-
this.traceCellResults('Appending paths', result);
310+
traceCellResults('Appending paths', result);
326311
}
327312
}
328313

@@ -369,7 +354,7 @@ export class JupyterDebugger implements IJupyterDebugger, ICellHashListener {
369354
purpose: 'parsePtvsdVersionInfo' | 'parseDebugpyVersionInfo' | 'pythonVersionInfo'
370355
): Version | undefined {
371356
if (cells.length < 1 || cells[0].state !== CellState.finished) {
372-
this.traceCellResults(purpose, cells);
357+
traceCellResults(purpose, cells);
373358
return undefined;
374359
}
375360

@@ -397,7 +382,7 @@ export class JupyterDebugger implements IJupyterDebugger, ICellHashListener {
397382
}
398383
}
399384

400-
this.traceCellResults(purpose, cells);
385+
traceCellResults(purpose, cells);
401386

402387
return undefined;
403388
}
@@ -452,7 +437,7 @@ export class JupyterDebugger implements IJupyterDebugger, ICellHashListener {
452437
return;
453438
}
454439
}
455-
this.traceCellResults(`Installing ${this.debuggerPackage}`, debuggerInstallResults);
440+
traceCellResults(`Installing ${this.debuggerPackage}`, debuggerInstallResults);
456441
sendTelemetryEvent(Telemetry.PtvsdInstallFailed);
457442
traceError(`Failed to install ${this.debuggerPackage}`);
458443
// Failed to install debugger, throw to exit debugging

src/test/common/platform/filesystem.functional.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ suite('FileSystem', () => {
592592

593593
suite('createWriteStream', () => {
594594
test('wraps the low-level impl', async () => {
595-
const filename = await fix.resolve('x/y/z/spam.py');
595+
const filename = await fix.resolve('x/y/z/spam2.py');
596596
const expected = fs.createWriteStream(filename);
597597
expected.destroy();
598598

src/test/datascience/dataScienceIocContainer.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ import { registerInterpreterTypes } from '../../client/interpreter/serviceRegist
381381
import { VirtualEnvironmentManager } from '../../client/interpreter/virtualEnvs';
382382
import { IVirtualEnvironmentManager } from '../../client/interpreter/virtualEnvs/types';
383383
import { LanguageServerSurveyBanner } from '../../client/languageServices/languageServerSurveyBanner';
384+
import { traceInfo } from '../../client/logging';
384385
import { CodeExecutionHelper } from '../../client/terminals/codeExecution/helper';
385386
import { ICodeExecutionHelper } from '../../client/terminals/types';
386387
import { IVsCodeApi } from '../../datascience-ui/react-common/postOffice';
@@ -401,6 +402,7 @@ import { MockLiveShareApi } from './mockLiveShare';
401402
import { MockPythonSettings } from './mockPythonSettings';
402403
import { MockWorkspaceConfiguration } from './mockWorkspaceConfig';
403404
import { MockWorkspaceFolder } from './mockWorkspaceFolder';
405+
import { TestExecutionLogger } from './testexecutionLogger';
404406
import { TestInteractiveWindowProvider } from './testInteractiveWindowProvider';
405407
import { TestNativeEditorProvider } from './testNativeEditorProvider';
406408
import { TestPersistentStateFactory } from './testPersistentStateFactory';
@@ -489,6 +491,9 @@ export class DataScienceIocContainer extends UnitTestIocContainer {
489491
}
490492

491493
public async dispose(): Promise<void> {
494+
// Make sure to disable all command handling during dispose. Don't want
495+
// anything to startup again.
496+
this.commandManager.dispose();
492497
try {
493498
// Make sure to delete any temp files written by native editor storage
494499
const globPr = promisify(glob);
@@ -793,6 +798,7 @@ export class DataScienceIocContainer extends UnitTestIocContainer {
793798
this.serviceManager.add<INotebookExecutionLogger>(INotebookExecutionLogger, HoverProvider);
794799
this.serviceManager.add<IGatherProvider>(IGatherProvider, GatherProvider);
795800
this.serviceManager.add<IGatherLogger>(IGatherLogger, GatherLogger, undefined, [INotebookExecutionLogger]);
801+
this.serviceManager.add<INotebookExecutionLogger>(INotebookExecutionLogger, TestExecutionLogger);
796802
this.serviceManager.addSingleton<ICodeLensFactory>(ICodeLensFactory, CodeLensFactory, undefined, [
797803
IInteractiveWindowListener
798804
]);
@@ -1244,8 +1250,10 @@ export class DataScienceIocContainer extends UnitTestIocContainer {
12441250
this.forceSettingsChanged(undefined, list[0].path);
12451251

12461252
// Log this all the time. Useful in determining why a test may not pass.
1253+
const message = `Setting interpreter to ${list[0].displayName || list[0].path} -> ${list[0].path}`;
1254+
traceInfo(message);
12471255
// tslint:disable-next-line: no-console
1248-
console.log(`Setting interpreter to ${list[0].displayName || list[0].path} -> ${list[0].path}`);
1256+
console.log(message);
12491257

12501258
// Also set this as the interpreter to use for jupyter
12511259
await this.serviceManager

src/test/datascience/mockCommandManager.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ import { ICommandNameArgumentTypeMapping } from '../../client/common/application
88
import { ICommandManager } from '../../client/common/application/types';
99

1010
// tslint:disable:no-any no-http-string no-multiline-string max-func-body-length
11-
1211
export class MockCommandManager implements ICommandManager {
1312
private commands: Map<string, (...args: any[]) => any> = new Map<string, (...args: any[]) => any>();
1413

14+
public dispose() {
15+
this.commands.clear();
16+
}
1517
public registerCommand<
1618
E extends keyof ICommandNameArgumentTypeMapping,
1719
U extends ICommandNameArgumentTypeMapping[E]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
import { injectable } from 'inversify';
4+
import { traceCellResults } from '../../client/datascience/common';
5+
import { ICell, INotebookExecutionLogger } from '../../client/datascience/types';
6+
import { traceInfo } from '../../client/logging';
7+
import { concatMultilineStringInput } from '../../datascience-ui/common';
8+
9+
@injectable()
10+
export class TestExecutionLogger implements INotebookExecutionLogger {
11+
public preExecute(cell: ICell, _silent: boolean): Promise<void> {
12+
traceInfo(`Cell Execution for ${cell.id} : \n${concatMultilineStringInput(cell.data.source)}\n`);
13+
return Promise.resolve();
14+
}
15+
public postExecute(cell: ICell, _silent: boolean): Promise<void> {
16+
traceCellResults(`Cell Execution complete for ${cell.id}\n`, [cell]);
17+
return Promise.resolve();
18+
}
19+
public onKernelRestarted(): void {
20+
// Can ignore this.
21+
}
22+
}

0 commit comments

Comments
 (0)