Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
a422532
feat: Set up a custom renderer for data frames.
Artmann Oct 8, 2025
3f9c6af
wip
Artmann Oct 9, 2025
e334698
feat: Implement deepnote big number chart support and renderer
tkislan Oct 13, 2025
87f4a09
Merge remote-tracking branch 'origin/chris/display-data-frames' into …
tkislan Oct 13, 2025
62297c2
refactor: Clean up debug logs and improve big number block conversion…
tkislan Oct 13, 2025
7878345
feat: Pass block metadata to cell outputs for renderer to access
tkislan Oct 13, 2025
a12d042
feat: Set up a custom renderer for data frames.
Artmann Oct 8, 2025
c19acd4
wip
Artmann Oct 9, 2025
066229a
add the table state.
Artmann Oct 9, 2025
e36b9c0
page size handling
Artmann Oct 9, 2025
558035f
add page navigation
Artmann Oct 13, 2025
5113db6
Generate Python code before executing the cell.
Artmann Oct 13, 2025
1ba9ab4
clean up
Artmann Oct 13, 2025
a51a150
pr feedback.
Artmann Oct 13, 2025
98d7fe6
Update build/esbuild/build.ts
Artmann Oct 13, 2025
a476bfd
feat: Move DEEPNOTE_VSCODE_RAW_CONTENT_KEY into constants file
tkislan Oct 13, 2025
3a4d579
feedback
Artmann Oct 13, 2025
40ede24
feat: Add chart big number converter tests
tkislan Oct 13, 2025
d220422
Reformat test code
tkislan Oct 14, 2025
78d3cb7
Refactor ChartBigNumberBlockConverter tests to use deepStrictEqual fo…
tkislan Oct 14, 2025
4fa78e2
docs and metadata changes.
Artmann Oct 14, 2025
e8ce411
Merge remote-tracking branch 'origin/chris/display-data-frames' into …
tkislan Oct 14, 2025
8ae05ab
use the latest blocks package.
Artmann Oct 14, 2025
3597ce3
Merge branch 'main' into chris/display-data-frames
Artmann Oct 14, 2025
9fec8d4
add the packages permission
Artmann Oct 14, 2025
0537364
simplify execution flow.
Artmann Oct 14, 2025
9b9216a
remove copyright header
Artmann Oct 14, 2025
e5a1bba
clean up the code
Artmann Oct 14, 2025
e7cccb9
Merge branch 'main' into chris/display-data-frames
Artmann Oct 14, 2025
895fe09
revert controller changes
Artmann Oct 14, 2025
54ca963
pr feedback
Artmann Oct 14, 2025
8309267
Merge branch 'main' into chris/display-data-frames
Artmann Oct 14, 2025
df330bc
pr feedback
Artmann Oct 15, 2025
8b88881
fix the tests
Artmann Oct 15, 2025
8386006
guard metadata spread against undefined.
Artmann Oct 15, 2025
8121bfa
Merge remote-tracking branch 'origin/chris/display-data-frames' into …
tkislan Oct 15, 2025
3bdf030
Merge remote-tracking branch 'origin/main' into tomaskislan/grn-4762-…
tkislan Oct 16, 2025
d9afa1a
fix: Merge cleanup
tkislan Oct 16, 2025
e2b6c36
More merge cleanup
tkislan Oct 16, 2025
722ab50
Fix test
tkislan Oct 16, 2025
628ab6e
feat: Add big number chart json config execution support
tkislan Oct 16, 2025
ed5329d
fix: Enhance error handling for big number metadata parsing and impro…
tkislan Oct 16, 2025
6649ca8
refactor: Simplify chart big number renderer by directly rendering to…
tkislan Oct 16, 2025
a3007ac
Merge remote-tracking branch 'origin/main' into tomaskislan/grn-4762-…
tkislan Oct 16, 2025
b25656b
Fix import
tkislan Oct 16, 2025
8014bc3
fix: Change deepnote_big_number_comparison_type to string type for be…
tkislan Oct 16, 2025
85c8b70
fix: Remove constants, accidentaly added to wrong branch
tkislan Oct 16, 2025
68567e0
Merge branch 'main' into tomaskislan/grn-4762-support-big-number-blocks
tkislan Oct 17, 2025
067f757
Merge remote-tracking branch 'origin/main' into tomaskislan/grn-4762-…
tkislan Oct 17, 2025
cc3f23c
Fix imports
tkislan Oct 17, 2025
6ee3612
fix: Remove unused code
tkislan Oct 17, 2025
95fd687
feat(big-number): Integrate react-error-boundary for error handling a…
tkislan Oct 17, 2025
05ab7a0
Update test snapshots
tkislan Oct 17, 2025
5f05be1
Merge branch 'main' into tomaskislan/grn-4762-support-big-number-blocks
jamesbhobbs Oct 20, 2025
8d83d0c
fix: Fix spell check in test
tkislan Oct 21, 2025
60442ec
Merge remote-tracking branch 'origin/main' into tomaskislan/grn-4762-…
tkislan Oct 21, 2025
236cccd
Merge branch 'main' into tomaskislan/grn-4762-support-big-number-blocks
tkislan Oct 22, 2025
f8dcd85
Merge branch 'main' into tomaskislan/grn-4762-support-big-number-blocks
jamesbhobbs Oct 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions build/esbuild/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,18 @@ async function buildAll() {
path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'dataframeRenderer', 'dataframeRenderer.js'),
{ target: 'web', watch: isWatchMode }
),
build(
path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'chart-big-number-renderer', 'index.ts'),
path.join(
extensionFolder,
'dist',
'webviews',
'webview-side',
'chartBigNumberRenderer',
'chartBigNumberRenderer.js'
),
{ target: 'web', watch: isWatchMode }
),
build(
path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'vega-renderer', 'index.ts'),
path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'vegaRenderer', 'vegaRenderer.js'),
Expand Down
3 changes: 2 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 11 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1848,6 +1848,15 @@
],
"requiresMessaging": "optional"
},
{
"id": "deepnote-chart-big-number-renderer",
"displayName": "Deepnote Chart Big Number Renderer",
"entrypoint": "./dist/webviews/webview-side/chartBigNumberRenderer/chartBigNumberRenderer.js",
"mimeTypes": [
"application/vnd.deepnote.chart.big-number+json"
],
"requiresMessaging": "optional"
},
{
"id": "deepnote-vega-renderer",
"displayName": "Deepnote Vega Chart Renderer",
Expand Down Expand Up @@ -2235,7 +2244,8 @@
"vscode-tas-client": "^0.1.84",
"ws": "^6.2.3",
"zeromq": "^6.5.0",
"zeromqold": "npm:zeromq@^6.0.0-beta.6"
"zeromqold": "npm:zeromq@^6.0.0-beta.6",
"zod": "^4.1.12"
},
"devDependencies": {
"@actions/core": "^1.11.1",
Expand Down
2 changes: 1 addition & 1 deletion src/kernels/execution/cellExecution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import type * as KernelMessage from '@jupyterlab/services/lib/kernel/messages';
import { NotebookCell, NotebookCellExecution, workspace, NotebookCellOutput } from 'vscode';

import { createPythonCode } from '@deepnote/blocks';
import type { Kernel } from '@jupyterlab/services';
import { CellExecutionCreator } from './cellExecutionCreator';
import { analyzeKernelErrors, createOutputWithErrorMessageForDisplay } from '../../platform/errors/errorUtils';
Expand Down Expand Up @@ -32,7 +33,6 @@ import { KernelError } from '../errors/kernelError';
import { getCachedSysPrefix } from '../../platform/interpreter/helpers';
import { getCellMetadata } from '../../platform/common/utils';
import { NotebookCellExecutionState, notebookCellExecutions } from '../../platform/notebooks/cellExecutionStateService';
import { createPythonCode } from '@deepnote/blocks';
import { DeepnoteDataConverter } from '../../notebooks/deepnote/deepnoteDataConverter';

/**
Expand Down
12 changes: 11 additions & 1 deletion src/kernels/execution/cellExecutionMessageHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
window,
extensions
} from 'vscode';
import { coerce, SemVer } from 'semver';

import type { Kernel } from '@jupyterlab/services';
import { CellExecutionCreator } from './cellExecutionCreator';
Expand All @@ -45,7 +46,7 @@ import { handleTensorBoardDisplayDataOutput } from './executionHelpers';
import { Identifiers, RendererExtension, WIDGET_MIMETYPE } from '../../platform/common/constants';
import { CellOutputDisplayIdTracker } from './cellDisplayIdTracker';
import { createDeferred } from '../../platform/common/utils/async';
import { coerce, SemVer } from 'semver';
import { CHART_BIG_NUMBER_MIME_TYPE } from '../../platform/deepnote/deepnoteConstants';

// Helper interface for the set_next_input execute reply payload
interface ISetNextInputPayload {
Expand Down Expand Up @@ -1181,6 +1182,15 @@ export class CellExecutionMessageHandler implements IDisposable {
const output = translateCellDisplayOutput(
new NotebookCellOutput(outputToBeUpdated.outputItems, outputToBeUpdated.outputContainer.metadata)
);

const data = msg.content.data;
// deepnote-toolkit returns the text/plain mime type for big number outputs
// and for the custom renderer to be used, we need to return the application/vnd.deepnote.chart.big-number+json mime type
if (outputToBeUpdated.cell.metadata['__deepnotePocket']?.['type'] === 'big-number') {
data[CHART_BIG_NUMBER_MIME_TYPE] = data['text/plain'];
delete data['text/plain'];
}
Comment on lines +1189 to +1192
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add comment why we need this


const newOutput = cellOutputToVSCCellOutput(
{
...output,
Expand Down
37 changes: 22 additions & 15 deletions src/kernels/execution/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,32 @@
// Licensed under the MIT License.

import type * as nbformat from '@jupyterlab/nbformat';
import { NotebookCellOutput, NotebookCellOutputItem, NotebookCell, Position, Range } from 'vscode';
import { NotebookCell, NotebookCellOutput, NotebookCellOutputItem, Position, Range } from 'vscode';
// eslint-disable-next-line @typescript-eslint/no-require-imports
import type { KernelMessage } from '@jupyterlab/services';
import fastDeepEqual from 'fast-deep-equal';
import * as path from '../../platform/vscode-path/path';
import * as uriPath from '../../platform/vscode-path/resources';
import { Pocket } from '../../platform/deepnote/pocket';
import { PYTHON_LANGUAGE } from '../../platform/common/constants';
import { concatMultilineString, splitMultilineString } from '../../platform/common/utils';
import { StopWatch } from '../../platform/common/utils/stopWatch';
import { base64ToUint8Array, uint8ArrayToBase64 } from '../../platform/common/utils/string';
import { CHART_BIG_NUMBER_MIME_TYPE } from '../../platform/deepnote/deepnoteConstants';
import { getExtensionSpecificStack } from '../../platform/errors/errors';
import { createOutputWithErrorMessageForDisplay } from '../../platform/errors/errorUtils';
import { getCachedEnvironment, getVersion } from '../../platform/interpreter/helpers';
import { logger } from '../../platform/logging';
import type { NotebookCellExecutionState } from '../../platform/notebooks/cellExecutionStateService';
import * as path from '../../platform/vscode-path/path';
import * as uriPath from '../../platform/vscode-path/resources';
import { sendTelemetryEvent, Telemetry } from '../../telemetry';
import { createOutputWithErrorMessageForDisplay } from '../../platform/errors/errorUtils';
import { CellExecutionCreator } from './cellExecutionCreator';
import { IKernelController, KernelConnectionMetadata } from '../types';
import {
isPythonKernelConnection,
getInterpreterFromKernelConnectionMetadata,
kernelConnectionMetadataHasKernelModel,
getKernelRegistrationInfo
getKernelRegistrationInfo,
isPythonKernelConnection,
kernelConnectionMetadataHasKernelModel
} from '../helpers';
import { StopWatch } from '../../platform/common/utils/stopWatch';
import { getExtensionSpecificStack } from '../../platform/errors/errors';
import { getCachedEnvironment, getVersion } from '../../platform/interpreter/helpers';
import { base64ToUint8Array, uint8ArrayToBase64 } from '../../platform/common/utils/string';
import type { NotebookCellExecutionState } from '../../platform/notebooks/cellExecutionStateService';
import { IKernelController, KernelConnectionMetadata } from '../types';
import { CellExecutionCreator } from './cellExecutionCreator';

export enum CellOutputMimeTypes {
error = 'application/vnd.code.notebook.error',
Expand Down Expand Up @@ -260,6 +262,9 @@ function translateDisplayDataOutput(
}
}
*/
const deepnotePocket = cellMetadata?.__deepnotePocket as Pocket | undefined;
const deepnoteBlockType = deepnotePocket?.type;

const metadata = getOutputMetadata(output, cellIndex, cellId, cellMetadata);
// If we have SVG or PNG, then add special metadata to indicate whether to display `open plot`
if ('image/svg+xml' in output.data || 'image/png' in output.data) {
Expand All @@ -269,7 +274,9 @@ function translateDisplayDataOutput(
if (output.data) {
// eslint-disable-next-line no-restricted-syntax
for (const key in output.data) {
items.push(convertJupyterOutputToBuffer(key, output.data[key]));
// TODO - remove this once this is handled in the deepnote-toolkit
let effectiveKey = deepnoteBlockType === 'big-number' ? CHART_BIG_NUMBER_MIME_TYPE : key;
items.push(convertJupyterOutputToBuffer(effectiveKey, output.data[key] ?? output.data[effectiveKey]));
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/notebooks/deepnote/converters/blockConverter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NotebookCellData } from 'vscode';

import type { DeepnoteBlock } from '../deepnoteTypes';
import type { DeepnoteBlock } from '../../../platform/deepnote/deepnoteTypes';

export interface BlockConverter {
applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { NotebookCellData, NotebookCellKind } from 'vscode';
import { z } from 'zod';

import type { BlockConverter } from './blockConverter';
import type { DeepnoteBlock } from '../../../platform/deepnote/deepnoteTypes';
import { DeepnoteBigNumberMetadataSchema } from '../deepnoteSchemas';
import { parseJsonWithFallback } from '../dataConversionUtils';
import { DEEPNOTE_VSCODE_RAW_CONTENT_KEY } from './constants';

const DEFAULT_BIG_NUMBER_CONFIG = DeepnoteBigNumberMetadataSchema.parse({});

export class ChartBigNumberBlockConverter implements BlockConverter {
applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void {
block.content = '';

const config = DeepnoteBigNumberMetadataSchema.safeParse(parseJsonWithFallback(cell.value));

if (config.success !== true) {
block.metadata = {
...block.metadata,
[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: cell.value
};

return;
}

if (block.metadata != null) {
delete block.metadata[DEEPNOTE_VSCODE_RAW_CONTENT_KEY];
}

block.metadata = {
...(block.metadata ?? {}),
...config.data
};
}

canConvert(blockType: string): boolean {
return blockType.toLowerCase() === 'big-number';
}

convertToCell(block: DeepnoteBlock): NotebookCellData {
const deepnoteJupyterRawContentResult = z.string().safeParse(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]);
const deepnoteBigNumberMetadataResult = DeepnoteBigNumberMetadataSchema.safeParse(block.metadata);

if (deepnoteBigNumberMetadataResult.error != null) {
console.error('Error parsing deepnote big number metadata:', deepnoteBigNumberMetadataResult.error);
console.debug('Metadata:', JSON.stringify(block.metadata));
}

const configStr = deepnoteJupyterRawContentResult.success
? deepnoteJupyterRawContentResult.data
: deepnoteBigNumberMetadataResult.success
? JSON.stringify(deepnoteBigNumberMetadataResult.data, null, 2)
: JSON.stringify(DEFAULT_BIG_NUMBER_CONFIG, null, 2);

const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json');

return cell;
}

getSupportedTypes(): string[] {
return ['big-number'];
}
}
Loading