Skip to content

Commit 4d239f1

Browse files
authored
feat: Show an indicator for stale outputs (#297)
1 parent d74e397 commit 4d239f1

10 files changed

Lines changed: 1385 additions & 326 deletions

src/notebooks/deepnote/deepnoteInputBlockCellStatusBarProvider.unit.test.ts

Lines changed: 169 additions & 124 deletions
Large diffs are not rendered by default.

src/notebooks/deepnote/deepnoteNewCellLanguageService.unit.test.ts

Lines changed: 17 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,17 @@
11
import { expect } from 'chai';
22
import { anything, verify, when } from 'ts-mockito';
3-
import { Disposable, NotebookCell, NotebookCellKind, NotebookDocument, TextDocument, Uri } from 'vscode';
3+
import { Disposable, NotebookCellKind, TextDocument } from 'vscode';
44

55
import { IDisposableRegistry } from '../../platform/common/types';
66
import { mockedVSCodeNamespaces, resetVSCodeMocks } from '../../test/vscode-mock';
7+
import { createMockCell, createMockNotebook } from './deepnoteTestHelpers';
78
import { DeepnoteNewCellLanguageService } from './deepnoteNewCellLanguageService';
89

910
suite('DeepnoteNewCellLanguageService', () => {
1011
let service: DeepnoteNewCellLanguageService;
1112
let disposables: Disposable[];
1213
let notebookChangeHandler: ((e: any) => void) | undefined;
1314

14-
function createMockNotebook(notebookType: string): NotebookDocument {
15-
return {
16-
uri: Uri.file('/test/notebook.deepnote'),
17-
notebookType
18-
} as NotebookDocument;
19-
}
20-
21-
function createMockCell(options: {
22-
kind?: NotebookCellKind;
23-
languageId?: string;
24-
content?: string;
25-
metadata?: Record<string, unknown>;
26-
}): NotebookCell {
27-
const { kind = NotebookCellKind.Code, languageId = 'python', content = '', metadata = {} } = options;
28-
29-
return {
30-
index: 0,
31-
notebook: createMockNotebook('deepnote'),
32-
kind,
33-
document: {
34-
uri: Uri.file('/test/notebook.deepnote#cell0'),
35-
languageId,
36-
getText: () => content
37-
} as TextDocument,
38-
metadata,
39-
outputs: [],
40-
executionSummary: undefined
41-
} as unknown as NotebookCell;
42-
}
43-
4415
setup(() => {
4516
resetVSCodeMocks();
4617
disposables = [];
@@ -79,7 +50,7 @@ suite('DeepnoteNewCellLanguageService', () => {
7950

8051
test('ignores non-deepnote notebooks', async () => {
8152
service.activate();
82-
const jupyterNotebook = createMockNotebook('jupyter-notebook');
53+
const jupyterNotebook = createMockNotebook({ notebookType: 'jupyter-notebook' });
8354
const cell = createMockCell({ languageId: 'sql' });
8455

8556
notebookChangeHandler!({
@@ -93,7 +64,7 @@ suite('DeepnoteNewCellLanguageService', () => {
9364

9465
test('ignores markdown cells', async () => {
9566
service.activate();
96-
const notebook = createMockNotebook('deepnote');
67+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
9768
const cell = createMockCell({ kind: NotebookCellKind.Markup, languageId: 'markdown' });
9869

9970
notebookChangeHandler!({
@@ -107,8 +78,8 @@ suite('DeepnoteNewCellLanguageService', () => {
10778

10879
test('ignores cells with content', async () => {
10980
service.activate();
110-
const notebook = createMockNotebook('deepnote');
111-
const cell = createMockCell({ languageId: 'sql', content: 'SELECT * FROM table' });
81+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
82+
const cell = createMockCell({ languageId: 'sql', text: 'SELECT * FROM table' });
11283

11384
notebookChangeHandler!({
11485
notebook,
@@ -121,7 +92,7 @@ suite('DeepnoteNewCellLanguageService', () => {
12192

12293
test('ignores cells that already have Python language', async () => {
12394
service.activate();
124-
const notebook = createMockNotebook('deepnote');
95+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
12596
const cell = createMockCell({ languageId: 'python' });
12697

12798
notebookChangeHandler!({
@@ -135,7 +106,7 @@ suite('DeepnoteNewCellLanguageService', () => {
135106

136107
test('ignores intentional SQL blocks (with __deepnotePocket.type)', async () => {
137108
service.activate();
138-
const notebook = createMockNotebook('deepnote');
109+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
139110
const cell = createMockCell({
140111
languageId: 'sql',
141112
metadata: { __deepnotePocket: { type: 'sql' } }
@@ -152,7 +123,7 @@ suite('DeepnoteNewCellLanguageService', () => {
152123

153124
test('ignores intentional chart blocks (with __deepnotePocket.type)', async () => {
154125
service.activate();
155-
const notebook = createMockNotebook('deepnote');
126+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
156127
const cell = createMockCell({
157128
languageId: 'json',
158129
metadata: { __deepnotePocket: { type: 'chart-vega' } }
@@ -169,7 +140,7 @@ suite('DeepnoteNewCellLanguageService', () => {
169140

170141
test('ignores intentional input blocks (with __deepnotePocket.type)', async () => {
171142
service.activate();
172-
const notebook = createMockNotebook('deepnote');
143+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
173144
const cell = createMockCell({
174145
languageId: 'plaintext',
175146
metadata: { __deepnotePocket: { type: 'input-text' } }
@@ -186,7 +157,7 @@ suite('DeepnoteNewCellLanguageService', () => {
186157

187158
test('changes SQL cell to Python when no __deepnotePocket metadata', async () => {
188159
service.activate();
189-
const notebook = createMockNotebook('deepnote');
160+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
190161
const cell = createMockCell({ languageId: 'sql' });
191162

192163
notebookChangeHandler!({
@@ -200,7 +171,7 @@ suite('DeepnoteNewCellLanguageService', () => {
200171

201172
test('changes JSON cell to Python when no __deepnotePocket metadata', async () => {
202173
service.activate();
203-
const notebook = createMockNotebook('deepnote');
174+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
204175
const cell = createMockCell({ languageId: 'json' });
205176

206177
notebookChangeHandler!({
@@ -214,7 +185,7 @@ suite('DeepnoteNewCellLanguageService', () => {
214185

215186
test('handles multiple added cells', async () => {
216187
service.activate();
217-
const notebook = createMockNotebook('deepnote');
188+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
218189
const sqlCell = createMockCell({ languageId: 'sql' });
219190
const pythonCell = createMockCell({ languageId: 'python' });
220191
const jsonCell = createMockCell({ languageId: 'json' });
@@ -232,7 +203,7 @@ suite('DeepnoteNewCellLanguageService', () => {
232203

233204
test('handles multiple content changes', async () => {
234205
service.activate();
235-
const notebook = createMockNotebook('deepnote');
206+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
236207
const cell1 = createMockCell({ languageId: 'sql' });
237208
const cell2 = createMockCell({ languageId: 'javascript' });
238209

@@ -248,7 +219,7 @@ suite('DeepnoteNewCellLanguageService', () => {
248219

249220
test('ignores content changes with no added cells', async () => {
250221
service.activate();
251-
const notebook = createMockNotebook('deepnote');
222+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
252223

253224
notebookChangeHandler!({
254225
notebook,
@@ -261,8 +232,8 @@ suite('DeepnoteNewCellLanguageService', () => {
261232

262233
test('changes cells with whitespace-only content to Python', async () => {
263234
service.activate();
264-
const notebook = createMockNotebook('deepnote');
265-
const cell = createMockCell({ languageId: 'sql', content: ' \n\t ' });
235+
const notebook = createMockNotebook({ notebookType: 'deepnote' });
236+
const cell = createMockCell({ languageId: 'sql', text: ' \n\t ' });
266237

267238
notebookChangeHandler!({
268239
notebook,

0 commit comments

Comments
 (0)