@marimo-team/frontend 0.25.3-dev104 → 0.25.3-dev108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{CellStatus-DVrvejMC.js → CellStatus-_Aw9_foI.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-Dft8R6l5.js → ConnectedDataExplorerComponent-BRgqbAsc.js} +1 -1
- package/dist/assets/{ErrorBoundary-0akNKvJm.js → ErrorBoundary-DxSzjvbx.js} +2 -2
- package/dist/assets/{JsonOutput-DeUmpc_f.js → JsonOutput-B7pGj79O.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-BazxeAYV.js → MarimoErrorOutput-Bzo6Bkp5.js} +1 -1
- package/dist/assets/{RenderHTML-CbAdeual.js → RenderHTML-D6AC0IhC.js} +1 -1
- package/dist/assets/{RunButton-CjKwgCFU.js → RunButton-BjYsPiKa.js} +1 -1
- package/dist/assets/{add-cell-with-ai-BKVEws3J.js → add-cell-with-ai-DlpS2-wQ.js} +4 -4
- package/dist/assets/{add-connection-dialog-DS7LTz1T.js → add-connection-dialog-CyNAB_W2.js} +1 -1
- package/dist/assets/{agent-panel-B34QcdOK.js → agent-panel-_lzeDJ1g.js} +1 -1
- package/dist/assets/{ai-model-dropdown-DqFJCFVR.js → ai-model-dropdown-DSTTUxpi.js} +1 -1
- package/dist/assets/{app-config-button-CVh4UKi9.js → app-config-button-ChYKLsLO.js} +1 -1
- package/dist/assets/{blob-Bw0ZQoLx.js → blob-DTYOX-m5.js} +1 -1
- package/dist/assets/{cell-editor-DQ0io5Ye.js → cell-editor-Beg8ahPA.js} +2 -2
- package/dist/assets/{cell-link-DvOIu6A3.js → cell-link-D3rkqgbU.js} +1 -1
- package/dist/assets/{cells-Do-63MKT.js → cells-2HETnlvE.js} +5 -5
- package/dist/assets/{chat-display-DnkhBxdh.js → chat-display-0GIEXLvN.js} +1 -1
- package/dist/assets/{chat-panel-CN3qoX9G.js → chat-panel-BuWn4Z_F.js} +1 -1
- package/dist/assets/{chat-ui-B54K5qqr.js → chat-ui-X0s3vvdf.js} +1 -1
- package/dist/assets/{column-preview-DmxzHzaW.js → column-preview-yI7-INkZ.js} +1 -1
- package/dist/assets/{command-palette-CciCeRhy.js → command-palette-D6WLW1Ie.js} +1 -1
- package/dist/assets/{common-BCyx7t1i.js → common-DgXKwblm.js} +1 -1
- package/dist/assets/{components-CDvWXfXq.js → components-CuMhY4Sf.js} +1 -1
- package/dist/assets/{datasource-DieftweT.js → datasource-D9JMcEAP.js} +1 -1
- package/dist/assets/{dependency-graph-panel-IfcqTHgq.js → dependency-graph-panel-BVJWPCvw.js} +3 -3
- package/dist/assets/{documentation-panel-DeLCgVcq.js → documentation-panel--wI4XHso.js} +1 -1
- package/dist/assets/{download-BzfVCqUq.js → download-Dod42wfD.js} +1 -1
- package/dist/assets/{edit-page-HMyk4cWw.js → edit-page-EmacXgdB.js} +4 -4
- package/dist/assets/{error-entries-DjjWrbt4.js → error-entries-D00nWhWE.js} +1 -1
- package/dist/assets/{error-panel-CiG3JJA3.js → error-panel-CcN_1PWf.js} +1 -1
- package/dist/assets/{feedback-button-B8zVQEi6.js → feedback-button-ByGgqUsX.js} +1 -1
- package/dist/assets/feedback-button-tbWwJ_t6.js +1 -0
- package/dist/assets/{file-explorer-panel-BPD8Q0L-.js → file-explorer-panel-eTEqtMPW.js} +1 -1
- package/dist/assets/{file-name-input-CdkF9K3I.js → file-name-input-D5SfTNWh.js} +1 -1
- package/dist/assets/{floating-outline-TfDWJXBm.js → floating-outline-B-k3P_AO.js} +1 -1
- package/dist/assets/{gallery-page-BJpenPdQ.js → gallery-page-BzbMhDHi.js} +1 -1
- package/dist/assets/{glide-data-editor-DO15Nm-R.js → glide-data-editor-BMqhUrHI.js} +1 -1
- package/dist/assets/{home-page-mvqldGvD.js → home-page-BvA1BCmX.js} +1 -1
- package/dist/assets/{hooks-C4AJfqV0.js → hooks-CaRBg2ni.js} +1 -1
- package/dist/assets/{index-C2XzUsS7.js → index-hwaZTQ9l.js} +9 -9
- package/dist/assets/{layout-1kSh6fBF.js → layout-C-NAerIZ.js} +3 -3
- package/dist/assets/{logs-panel--QbHo7uS.js → logs-panel-B3T1GFBk.js} +1 -1
- package/dist/assets/{markdown-renderer-DJ7H8Rps.js → markdown-renderer-BhiTvxtL.js} +1 -1
- package/dist/assets/{name-cell-input-6Gd19S8T.js → name-cell-input-CgAObR6N.js} +1 -1
- package/dist/assets/{outline-panel-CjKvunvX.js → outline-panel-BhBb7Vqw.js} +1 -1
- package/dist/assets/{packages-panel-Gyrqi-MZ.js → packages-panel-Dz8rOIrh.js} +1 -1
- package/dist/assets/{panel-accordion-state-D49TNCLQ.js → panel-accordion-state-ZsUdpAYn.js} +1 -1
- package/dist/assets/{panels-DfbxoeGa.js → panels-B0lqLcI0.js} +1 -1
- package/dist/assets/{process-output-CgkoeA1-.js → process-output-CeOMwE17.js} +1 -1
- package/dist/assets/{readonly-code-display-BMbl_4BR.js → readonly-code-display-TvOC7ESE.js} +1 -1
- package/dist/assets/{readonly-python-code-BnPfpOJM.js → readonly-python-code-Cqkfdeyo.js} +1 -1
- package/dist/assets/{reveal-component-D84yAzG7.js → reveal-component-y06O6YuH.js} +1 -1
- package/dist/assets/{run-page-B10s8Pre.js → run-page-DHE6ET5K.js} +1 -1
- package/dist/assets/{runtime-details-state-Bkmgb59p.js → runtime-details-state-CKqJSfSR.js} +1 -1
- package/dist/assets/{scratchpad-panel-DtyjJ3yN.js → scratchpad-panel-BW_HfG5l.js} +1 -1
- package/dist/assets/{session-panel-Chaq1do8.js → session-panel-CdHdKUCF.js} +1 -1
- package/dist/assets/{snippets-panel-BaZmddOW.js → snippets-panel-DYLWOLYw.js} +1 -1
- package/dist/assets/{spec-uCpVvaAR.js → spec-DlH4Mp7d.js} +1 -1
- package/dist/assets/{state-Db73TZVD.js → state-DAqdiGqq.js} +1 -1
- package/dist/assets/{state-CqnCwHhY.js → state-DZN9vZ6z.js} +1 -1
- package/dist/assets/{tracing-C2vQMUI0.js → tracing-B0J2ctTm.js} +1 -1
- package/dist/assets/{tracing-panel-B4L2S2ac.js → tracing-panel-C1OCpoeE.js} +2 -2
- package/dist/assets/{tree-actions-JXDiioHK.js → tree-actions-sjBxIglc.js} +1 -1
- package/dist/assets/{useAddCell-CP3HIjGl.js → useAddCell-CaXnFGki.js} +1 -1
- package/dist/assets/{useCellActionButton-yi1_-emd.js → useCellActionButton-CJ90CMEj.js} +1 -1
- package/dist/assets/{useDeleteCell-BPLwyClM.js → useDeleteCell-D9N85822.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-DmBiydXO.js → useDependencyPanelTab-CzAE0cm-.js} +1 -1
- package/dist/assets/{useNotebookActions-CfmgcJGx.js → useNotebookActions-CTKkktJB.js} +1 -1
- package/dist/assets/{useRunCells-jF-7tJkw.js → useRunCells-DGakx8hj.js} +1 -1
- package/dist/assets/{useSplitCell-B6zWL8Zf.js → useSplitCell-AK5BKPGM.js} +1 -1
- package/dist/index.html +21 -21
- package/package.json +2 -2
- package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
- package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
- package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
- package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
- package/src/components/data-table/charts/charts.tsx +5 -5
- package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
- package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
- package/src/components/dependency-graph/elements.ts +24 -21
- package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
- package/src/components/editor/output/ansi-reduce.ts +30 -23
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
- package/src/core/ai/tools/base.ts +16 -7
- package/src/core/ai/tools/edit-notebook-tool.ts +47 -45
- package/src/core/ai/tools/registry.ts +13 -8
- package/src/core/ai/tools/sample-tool.ts +6 -7
- package/src/core/cells/__tests__/session.test.ts +117 -36
- package/src/core/codemirror/__tests__/setup.test.ts +28 -28
- package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
- package/src/core/codemirror/language/extension.ts +8 -8
- package/src/core/codemirror/language/languages/markdown.ts +8 -6
- package/src/core/codemirror/language/languages/python.ts +13 -7
- package/src/core/codemirror/language/languages/sql/sql.ts +9 -7
- package/src/core/codemirror/language/types.ts +7 -7
- package/src/core/codemirror/rtc/extension.ts +24 -12
- package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
- package/src/core/codemirror/rtc/loro/sync.ts +1 -0
- package/src/core/codemirror/utils.ts +1 -0
- package/src/core/host/__tests__/static.test.ts +167 -0
- package/src/core/host/backend.ts +10 -0
- package/src/core/host/static.ts +70 -0
- package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
- package/src/core/static/__tests__/files.test.ts +38 -10
- package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
- package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataTablePlugin.tsx +15 -18
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -1
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
- package/src/plugins/impl/plotly/selection.ts +25 -19
- package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
- package/dist/assets/feedback-button-DQdMkSvR.js +0 -1
|
@@ -60,14 +60,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
60
60
|
};
|
|
61
61
|
|
|
62
62
|
it("should create an instance", () => {
|
|
63
|
-
const model = new ColumnChartSpecModel(
|
|
64
|
-
[],
|
|
65
|
-
mockFieldTypes,
|
|
66
|
-
mockStats,
|
|
67
|
-
mockBinValues,
|
|
68
|
-
mockValueCounts,
|
|
69
|
-
{ includeCharts: true },
|
|
70
|
-
);
|
|
63
|
+
const model = new ColumnChartSpecModel({
|
|
64
|
+
data: [],
|
|
65
|
+
fieldTypes: mockFieldTypes,
|
|
66
|
+
stats: mockStats,
|
|
67
|
+
binValues: mockBinValues,
|
|
68
|
+
valueCounts: mockValueCounts,
|
|
69
|
+
opts: { includeCharts: true },
|
|
70
|
+
});
|
|
71
71
|
expect(model).toBeInstanceOf(ColumnChartSpecModel);
|
|
72
72
|
});
|
|
73
73
|
|
|
@@ -77,14 +77,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
77
77
|
});
|
|
78
78
|
|
|
79
79
|
it("should return header summary with spec when includeCharts is true", () => {
|
|
80
|
-
const model = new ColumnChartSpecModel(
|
|
81
|
-
[],
|
|
82
|
-
mockFieldTypes,
|
|
83
|
-
mockStats,
|
|
84
|
-
mockBinValues,
|
|
85
|
-
mockValueCounts,
|
|
86
|
-
{ includeCharts: true },
|
|
87
|
-
);
|
|
80
|
+
const model = new ColumnChartSpecModel({
|
|
81
|
+
data: [],
|
|
82
|
+
fieldTypes: mockFieldTypes,
|
|
83
|
+
stats: mockStats,
|
|
84
|
+
binValues: mockBinValues,
|
|
85
|
+
valueCounts: mockValueCounts,
|
|
86
|
+
opts: { includeCharts: true },
|
|
87
|
+
});
|
|
88
88
|
const dateSummary = model.getHeaderSummary("date");
|
|
89
89
|
expect(dateSummary.stats).toEqual(mockStats.date);
|
|
90
90
|
expect(dateSummary.type).toBe("date");
|
|
@@ -92,14 +92,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
92
92
|
});
|
|
93
93
|
|
|
94
94
|
it("should return header summary without spec when includeCharts is false", () => {
|
|
95
|
-
const model = new ColumnChartSpecModel(
|
|
96
|
-
[],
|
|
97
|
-
mockFieldTypes,
|
|
98
|
-
mockStats,
|
|
99
|
-
mockBinValues,
|
|
100
|
-
mockValueCounts,
|
|
101
|
-
{ includeCharts: false },
|
|
102
|
-
);
|
|
95
|
+
const model = new ColumnChartSpecModel({
|
|
96
|
+
data: [],
|
|
97
|
+
fieldTypes: mockFieldTypes,
|
|
98
|
+
stats: mockStats,
|
|
99
|
+
binValues: mockBinValues,
|
|
100
|
+
valueCounts: mockValueCounts,
|
|
101
|
+
opts: { includeCharts: false },
|
|
102
|
+
});
|
|
103
103
|
const numberSummary = model.getHeaderSummary("number");
|
|
104
104
|
expect(numberSummary.stats).toEqual(mockStats.number);
|
|
105
105
|
expect(numberSummary.type).toBe("number");
|
|
@@ -107,14 +107,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
107
107
|
});
|
|
108
108
|
|
|
109
109
|
it("should return null spec for unknown types", () => {
|
|
110
|
-
const model = new ColumnChartSpecModel(
|
|
111
|
-
[],
|
|
112
|
-
mockFieldTypes,
|
|
113
|
-
mockStats,
|
|
114
|
-
mockBinValues,
|
|
115
|
-
mockValueCounts,
|
|
116
|
-
{ includeCharts: true },
|
|
117
|
-
);
|
|
110
|
+
const model = new ColumnChartSpecModel({
|
|
111
|
+
data: [],
|
|
112
|
+
fieldTypes: mockFieldTypes,
|
|
113
|
+
stats: mockStats,
|
|
114
|
+
binValues: mockBinValues,
|
|
115
|
+
valueCounts: mockValueCounts,
|
|
116
|
+
opts: { includeCharts: true },
|
|
117
|
+
});
|
|
118
118
|
const unknownSummary = model.getHeaderSummary("unknown");
|
|
119
119
|
expect(unknownSummary.spec).toBeNull();
|
|
120
120
|
});
|
|
@@ -133,14 +133,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
133
133
|
{ bin_start: "2023-06-01", bin_end: "2023-12-31", count: 20 },
|
|
134
134
|
],
|
|
135
135
|
};
|
|
136
|
-
const model = new ColumnChartSpecModel(
|
|
137
|
-
[],
|
|
138
|
-
specialFieldTypes,
|
|
139
|
-
specialStats,
|
|
140
|
-
specialBinValues,
|
|
141
|
-
mockValueCounts,
|
|
142
|
-
{ includeCharts: true },
|
|
143
|
-
);
|
|
136
|
+
const model = new ColumnChartSpecModel({
|
|
137
|
+
data: [],
|
|
138
|
+
fieldTypes: specialFieldTypes,
|
|
139
|
+
stats: specialStats,
|
|
140
|
+
binValues: specialBinValues,
|
|
141
|
+
valueCounts: mockValueCounts,
|
|
142
|
+
opts: { includeCharts: true },
|
|
143
|
+
});
|
|
144
144
|
const summary = model.getHeaderSummary("column.with[special:chars]");
|
|
145
145
|
expect(summary.spec).toBeDefined();
|
|
146
146
|
expect(
|
|
@@ -150,14 +150,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
150
150
|
});
|
|
151
151
|
|
|
152
152
|
it("should expect bin values to be used for number and integer columns", () => {
|
|
153
|
-
const model = new ColumnChartSpecModel(
|
|
154
|
-
[],
|
|
155
|
-
mockFieldTypes,
|
|
156
|
-
mockStats,
|
|
157
|
-
mockBinValues,
|
|
158
|
-
mockValueCounts,
|
|
159
|
-
{ includeCharts: true },
|
|
160
|
-
);
|
|
153
|
+
const model = new ColumnChartSpecModel({
|
|
154
|
+
data: [],
|
|
155
|
+
fieldTypes: mockFieldTypes,
|
|
156
|
+
stats: mockStats,
|
|
157
|
+
binValues: mockBinValues,
|
|
158
|
+
valueCounts: mockValueCounts,
|
|
159
|
+
opts: { includeCharts: true },
|
|
160
|
+
});
|
|
161
161
|
const summary = model.getHeaderSummary("number");
|
|
162
162
|
expect(summary.spec).toBeDefined();
|
|
163
163
|
// @ts-expect-error data.values should be available
|
|
@@ -185,14 +185,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
185
185
|
const allNullBins: Record<ColumnName, BinValues> = {
|
|
186
186
|
number: [],
|
|
187
187
|
};
|
|
188
|
-
const model = new ColumnChartSpecModel(
|
|
189
|
-
[],
|
|
190
|
-
mockFieldTypes,
|
|
191
|
-
allNullStats,
|
|
192
|
-
allNullBins,
|
|
193
|
-
{},
|
|
194
|
-
{ includeCharts: true },
|
|
195
|
-
);
|
|
188
|
+
const model = new ColumnChartSpecModel({
|
|
189
|
+
data: [],
|
|
190
|
+
fieldTypes: mockFieldTypes,
|
|
191
|
+
stats: allNullStats,
|
|
192
|
+
binValues: allNullBins,
|
|
193
|
+
valueCounts: {},
|
|
194
|
+
opts: { includeCharts: true },
|
|
195
|
+
});
|
|
196
196
|
const summary = model.getHeaderSummary("number");
|
|
197
197
|
expect(summary.spec).toBeDefined();
|
|
198
198
|
// @ts-expect-error hconcat should be available
|
|
@@ -221,14 +221,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
221
221
|
const stats: Record<ColumnName, Partial<ColumnHeaderStats>> = {
|
|
222
222
|
number: { nulls: 12, total: 12 },
|
|
223
223
|
};
|
|
224
|
-
const model = new ColumnChartSpecModel(
|
|
225
|
-
[],
|
|
226
|
-
mockFieldTypes,
|
|
224
|
+
const model = new ColumnChartSpecModel({
|
|
225
|
+
data: [],
|
|
226
|
+
fieldTypes: mockFieldTypes,
|
|
227
227
|
stats,
|
|
228
|
-
nanOnlyBins,
|
|
229
|
-
{},
|
|
230
|
-
{ includeCharts: true },
|
|
231
|
-
);
|
|
228
|
+
binValues: nanOnlyBins,
|
|
229
|
+
valueCounts: {},
|
|
230
|
+
opts: { includeCharts: true },
|
|
231
|
+
});
|
|
232
232
|
const first = model.getHeaderSummary("number");
|
|
233
233
|
const second = model.getHeaderSummary("number");
|
|
234
234
|
// All NaN bins are invalid → null-only chart
|
|
@@ -241,14 +241,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
241
241
|
});
|
|
242
242
|
|
|
243
243
|
it("should render a null bar for all-null temporal columns", () => {
|
|
244
|
-
const model = new ColumnChartSpecModel(
|
|
245
|
-
[],
|
|
246
|
-
mockFieldTypes,
|
|
247
|
-
{ datetime: { nulls: 12, total: 12 } },
|
|
248
|
-
{ datetime: [] },
|
|
249
|
-
{},
|
|
250
|
-
{ includeCharts: true },
|
|
251
|
-
);
|
|
244
|
+
const model = new ColumnChartSpecModel({
|
|
245
|
+
data: [],
|
|
246
|
+
fieldTypes: mockFieldTypes,
|
|
247
|
+
stats: { datetime: { nulls: 12, total: 12 } },
|
|
248
|
+
binValues: { datetime: [] },
|
|
249
|
+
valueCounts: {},
|
|
250
|
+
opts: { includeCharts: true },
|
|
251
|
+
});
|
|
252
252
|
const summary = model.getHeaderSummary("datetime");
|
|
253
253
|
expect(summary.spec).toBeDefined();
|
|
254
254
|
// @ts-expect-error data.values
|
|
@@ -265,26 +265,26 @@ describe("ColumnChartSpecModel", () => {
|
|
|
265
265
|
});
|
|
266
266
|
|
|
267
267
|
it("should return null when numeric bins are empty and there are no nulls", () => {
|
|
268
|
-
const model = new ColumnChartSpecModel(
|
|
269
|
-
[],
|
|
270
|
-
mockFieldTypes,
|
|
271
|
-
{ number: { min: 0, max: 1 } },
|
|
272
|
-
{ number: [] },
|
|
273
|
-
{},
|
|
274
|
-
{ includeCharts: true },
|
|
275
|
-
);
|
|
268
|
+
const model = new ColumnChartSpecModel({
|
|
269
|
+
data: [],
|
|
270
|
+
fieldTypes: mockFieldTypes,
|
|
271
|
+
stats: { number: { min: 0, max: 1 } },
|
|
272
|
+
binValues: { number: [] },
|
|
273
|
+
valueCounts: {},
|
|
274
|
+
opts: { includeCharts: true },
|
|
275
|
+
});
|
|
276
276
|
expect(model.getHeaderSummary("number").spec).toBeNull();
|
|
277
277
|
});
|
|
278
278
|
|
|
279
279
|
it("should handle datetime bin values", () => {
|
|
280
|
-
const model = new ColumnChartSpecModel(
|
|
281
|
-
[],
|
|
282
|
-
mockFieldTypes,
|
|
283
|
-
mockStats,
|
|
284
|
-
mockBinValues,
|
|
285
|
-
mockValueCounts,
|
|
286
|
-
{ includeCharts: true },
|
|
287
|
-
);
|
|
280
|
+
const model = new ColumnChartSpecModel({
|
|
281
|
+
data: [],
|
|
282
|
+
fieldTypes: mockFieldTypes,
|
|
283
|
+
stats: mockStats,
|
|
284
|
+
binValues: mockBinValues,
|
|
285
|
+
valueCounts: mockValueCounts,
|
|
286
|
+
opts: { includeCharts: true },
|
|
287
|
+
});
|
|
288
288
|
|
|
289
289
|
const summary = model.getHeaderSummary("datetime");
|
|
290
290
|
expect(summary.spec).toBeDefined();
|
|
@@ -301,14 +301,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
301
301
|
...mockStats,
|
|
302
302
|
datetime: { min: "2023-01-01", max: "2023-12-31" },
|
|
303
303
|
};
|
|
304
|
-
const model2 = new ColumnChartSpecModel(
|
|
305
|
-
[],
|
|
306
|
-
mockFieldTypes,
|
|
307
|
-
mockStats2,
|
|
308
|
-
mockBinValues,
|
|
309
|
-
mockValueCounts,
|
|
310
|
-
{ includeCharts: true },
|
|
311
|
-
);
|
|
304
|
+
const model2 = new ColumnChartSpecModel({
|
|
305
|
+
data: [],
|
|
306
|
+
fieldTypes: mockFieldTypes,
|
|
307
|
+
stats: mockStats2,
|
|
308
|
+
binValues: mockBinValues,
|
|
309
|
+
valueCounts: mockValueCounts,
|
|
310
|
+
opts: { includeCharts: true },
|
|
311
|
+
});
|
|
312
312
|
const summary2 = model2.getHeaderSummary("datetime");
|
|
313
313
|
expect(summary2.spec).toBeDefined();
|
|
314
314
|
|
|
@@ -318,14 +318,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
318
318
|
});
|
|
319
319
|
|
|
320
320
|
it("should handle boolean stats", () => {
|
|
321
|
-
const model = new ColumnChartSpecModel(
|
|
322
|
-
[],
|
|
323
|
-
mockFieldTypes,
|
|
324
|
-
mockStats,
|
|
325
|
-
mockBinValues,
|
|
326
|
-
mockValueCounts,
|
|
327
|
-
{ includeCharts: true },
|
|
328
|
-
);
|
|
321
|
+
const model = new ColumnChartSpecModel({
|
|
322
|
+
data: [],
|
|
323
|
+
fieldTypes: mockFieldTypes,
|
|
324
|
+
stats: mockStats,
|
|
325
|
+
binValues: mockBinValues,
|
|
326
|
+
valueCounts: mockValueCounts,
|
|
327
|
+
opts: { includeCharts: true },
|
|
328
|
+
});
|
|
329
329
|
const summary = model.getHeaderSummary("boolean");
|
|
330
330
|
expect(summary.spec).toBeDefined();
|
|
331
331
|
// @ts-expect-error data.values should be available
|
|
@@ -340,14 +340,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
340
340
|
});
|
|
341
341
|
|
|
342
342
|
it("should handle string value counts", () => {
|
|
343
|
-
const model = new ColumnChartSpecModel(
|
|
344
|
-
[],
|
|
345
|
-
mockFieldTypes,
|
|
346
|
-
mockStats,
|
|
347
|
-
mockBinValues,
|
|
348
|
-
mockValueCounts,
|
|
349
|
-
{ includeCharts: true },
|
|
350
|
-
);
|
|
343
|
+
const model = new ColumnChartSpecModel({
|
|
344
|
+
data: [],
|
|
345
|
+
fieldTypes: mockFieldTypes,
|
|
346
|
+
stats: mockStats,
|
|
347
|
+
binValues: mockBinValues,
|
|
348
|
+
valueCounts: mockValueCounts,
|
|
349
|
+
opts: { includeCharts: true },
|
|
350
|
+
});
|
|
351
351
|
const summary = model.getHeaderSummary("string");
|
|
352
352
|
expect(summary.spec).toBeDefined();
|
|
353
353
|
// @ts-expect-error data.values should be available
|
|
@@ -374,64 +374,64 @@ describe("ColumnChartSpecModel", () => {
|
|
|
374
374
|
]);
|
|
375
375
|
|
|
376
376
|
it("url data", () => {
|
|
377
|
-
const model = new ColumnChartSpecModel(
|
|
378
|
-
mockData,
|
|
377
|
+
const model = new ColumnChartSpecModel({
|
|
378
|
+
data: mockData,
|
|
379
379
|
fieldTypes,
|
|
380
|
-
mockStats,
|
|
381
|
-
mockBinValues,
|
|
382
|
-
mockValueCounts,
|
|
383
|
-
{ includeCharts: true },
|
|
384
|
-
);
|
|
380
|
+
stats: mockStats,
|
|
381
|
+
binValues: mockBinValues,
|
|
382
|
+
valueCounts: mockValueCounts,
|
|
383
|
+
opts: { includeCharts: true },
|
|
384
|
+
});
|
|
385
385
|
expect(model.getHeaderSummary("date").spec).toMatchSnapshot();
|
|
386
386
|
});
|
|
387
387
|
|
|
388
388
|
it("csv data", () => {
|
|
389
|
-
const model = new ColumnChartSpecModel(
|
|
390
|
-
`data:text/csv;base64,${btoa("a,b,c\n1,2,3\n4,5,6")}`,
|
|
389
|
+
const model = new ColumnChartSpecModel({
|
|
390
|
+
data: `data:text/csv;base64,${btoa("a,b,c\n1,2,3\n4,5,6")}`,
|
|
391
391
|
fieldTypes,
|
|
392
|
-
mockStats,
|
|
393
|
-
mockBinValues,
|
|
394
|
-
mockValueCounts,
|
|
395
|
-
{ includeCharts: true },
|
|
396
|
-
);
|
|
392
|
+
stats: mockStats,
|
|
393
|
+
binValues: mockBinValues,
|
|
394
|
+
valueCounts: mockValueCounts,
|
|
395
|
+
opts: { includeCharts: true },
|
|
396
|
+
});
|
|
397
397
|
expect(model.getHeaderSummary("a").spec).toMatchSnapshot();
|
|
398
398
|
});
|
|
399
399
|
|
|
400
400
|
it("csv string", () => {
|
|
401
|
-
const model = new ColumnChartSpecModel(
|
|
402
|
-
"a,b,c\n1,2,3\n4,5,6",
|
|
401
|
+
const model = new ColumnChartSpecModel({
|
|
402
|
+
data: "a,b,c\n1,2,3\n4,5,6",
|
|
403
403
|
fieldTypes,
|
|
404
|
-
mockStats,
|
|
405
|
-
mockBinValues,
|
|
406
|
-
mockValueCounts,
|
|
407
|
-
{ includeCharts: true },
|
|
408
|
-
);
|
|
404
|
+
stats: mockStats,
|
|
405
|
+
binValues: mockBinValues,
|
|
406
|
+
valueCounts: mockValueCounts,
|
|
407
|
+
opts: { includeCharts: true },
|
|
408
|
+
});
|
|
409
409
|
expect(model.getHeaderSummary("a").spec).toMatchSnapshot();
|
|
410
410
|
});
|
|
411
411
|
|
|
412
412
|
it("array", () => {
|
|
413
|
-
const model = new ColumnChartSpecModel(
|
|
414
|
-
["a", "b", "c"],
|
|
413
|
+
const model = new ColumnChartSpecModel({
|
|
414
|
+
data: ["a", "b", "c"],
|
|
415
415
|
fieldTypes,
|
|
416
|
-
mockStats,
|
|
417
|
-
mockBinValues,
|
|
418
|
-
mockValueCounts,
|
|
419
|
-
{ includeCharts: true },
|
|
420
|
-
);
|
|
416
|
+
stats: mockStats,
|
|
417
|
+
binValues: mockBinValues,
|
|
418
|
+
valueCounts: mockValueCounts,
|
|
419
|
+
opts: { includeCharts: true },
|
|
420
|
+
});
|
|
421
421
|
expect(model.getHeaderSummary("a").spec).toMatchSnapshot();
|
|
422
422
|
});
|
|
423
423
|
});
|
|
424
424
|
|
|
425
425
|
describe("file URL handling", () => {
|
|
426
426
|
it("should handle marimo file URLs with ./@file prefix", () => {
|
|
427
|
-
const model = new ColumnChartSpecModel(
|
|
428
|
-
"./@file/data.csv",
|
|
429
|
-
mockFieldTypes,
|
|
430
|
-
mockStats,
|
|
431
|
-
mockBinValues,
|
|
432
|
-
mockValueCounts,
|
|
433
|
-
{ includeCharts: true },
|
|
434
|
-
);
|
|
427
|
+
const model = new ColumnChartSpecModel({
|
|
428
|
+
data: "./@file/data.csv",
|
|
429
|
+
fieldTypes: mockFieldTypes,
|
|
430
|
+
stats: mockStats,
|
|
431
|
+
binValues: mockBinValues,
|
|
432
|
+
valueCounts: mockValueCounts,
|
|
433
|
+
opts: { includeCharts: true },
|
|
434
|
+
});
|
|
435
435
|
|
|
436
436
|
const summary = model.getHeaderSummary("date");
|
|
437
437
|
expect(summary.spec).toBeDefined();
|
|
@@ -440,14 +440,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
440
440
|
});
|
|
441
441
|
|
|
442
442
|
it("should handle marimo file URLs with /@file prefix", () => {
|
|
443
|
-
const model = new ColumnChartSpecModel(
|
|
444
|
-
"/@file/data.csv",
|
|
445
|
-
mockFieldTypes,
|
|
446
|
-
mockStats,
|
|
447
|
-
mockBinValues,
|
|
448
|
-
mockValueCounts,
|
|
449
|
-
{ includeCharts: true },
|
|
450
|
-
);
|
|
443
|
+
const model = new ColumnChartSpecModel({
|
|
444
|
+
data: "/@file/data.csv",
|
|
445
|
+
fieldTypes: mockFieldTypes,
|
|
446
|
+
stats: mockStats,
|
|
447
|
+
binValues: mockBinValues,
|
|
448
|
+
valueCounts: mockValueCounts,
|
|
449
|
+
opts: { includeCharts: true },
|
|
450
|
+
});
|
|
451
451
|
|
|
452
452
|
const summary = model.getHeaderSummary("date");
|
|
453
453
|
expect(summary.spec).toBeDefined();
|
|
@@ -456,14 +456,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
456
456
|
});
|
|
457
457
|
|
|
458
458
|
it("should handle absolute HTTP URLs", () => {
|
|
459
|
-
const model = new ColumnChartSpecModel(
|
|
460
|
-
"https://external.com/data.csv",
|
|
461
|
-
mockFieldTypes,
|
|
462
|
-
mockStats,
|
|
463
|
-
mockBinValues,
|
|
464
|
-
mockValueCounts,
|
|
465
|
-
{ includeCharts: true },
|
|
466
|
-
);
|
|
459
|
+
const model = new ColumnChartSpecModel({
|
|
460
|
+
data: "https://external.com/data.csv",
|
|
461
|
+
fieldTypes: mockFieldTypes,
|
|
462
|
+
stats: mockStats,
|
|
463
|
+
binValues: mockBinValues,
|
|
464
|
+
valueCounts: mockValueCounts,
|
|
465
|
+
opts: { includeCharts: true },
|
|
466
|
+
});
|
|
467
467
|
|
|
468
468
|
const summary = model.getHeaderSummary("date");
|
|
469
469
|
expect(summary.spec).toBeDefined();
|
|
@@ -473,14 +473,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
473
473
|
|
|
474
474
|
it("should handle data URLs", () => {
|
|
475
475
|
const dataUrl = "data:text/csv;base64,YSxiLGMKMSwyLDMKNCw1LDY=";
|
|
476
|
-
const model = new ColumnChartSpecModel(
|
|
477
|
-
dataUrl,
|
|
478
|
-
mockFieldTypes,
|
|
479
|
-
mockStats,
|
|
480
|
-
mockBinValues,
|
|
481
|
-
mockValueCounts,
|
|
482
|
-
{ includeCharts: true },
|
|
483
|
-
);
|
|
476
|
+
const model = new ColumnChartSpecModel({
|
|
477
|
+
data: dataUrl,
|
|
478
|
+
fieldTypes: mockFieldTypes,
|
|
479
|
+
stats: mockStats,
|
|
480
|
+
binValues: mockBinValues,
|
|
481
|
+
valueCounts: mockValueCounts,
|
|
482
|
+
opts: { includeCharts: true },
|
|
483
|
+
});
|
|
484
484
|
|
|
485
485
|
const summary = model.getHeaderSummary("date");
|
|
486
486
|
expect(summary.spec).toBeDefined();
|
|
@@ -491,14 +491,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
491
491
|
|
|
492
492
|
it("should handle CSV string data", () => {
|
|
493
493
|
const csvString = "a,b,c\n1,2,3\n4,5,6";
|
|
494
|
-
const model = new ColumnChartSpecModel(
|
|
495
|
-
csvString,
|
|
496
|
-
mockFieldTypes,
|
|
497
|
-
mockStats,
|
|
498
|
-
mockBinValues,
|
|
499
|
-
mockValueCounts,
|
|
500
|
-
{ includeCharts: true },
|
|
501
|
-
);
|
|
494
|
+
const model = new ColumnChartSpecModel({
|
|
495
|
+
data: csvString,
|
|
496
|
+
fieldTypes: mockFieldTypes,
|
|
497
|
+
stats: mockStats,
|
|
498
|
+
binValues: mockBinValues,
|
|
499
|
+
valueCounts: mockValueCounts,
|
|
500
|
+
opts: { includeCharts: true },
|
|
501
|
+
});
|
|
502
502
|
|
|
503
503
|
const summary = model.getHeaderSummary("date");
|
|
504
504
|
expect(summary.spec).toBeDefined();
|
|
@@ -509,14 +509,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
509
509
|
|
|
510
510
|
it("should handle arrow data", () => {
|
|
511
511
|
const arrowData = "ARROW1\n";
|
|
512
|
-
const model = new ColumnChartSpecModel(
|
|
513
|
-
`data:text/plain;base64,${btoa(arrowData)}`,
|
|
514
|
-
mockFieldTypes,
|
|
515
|
-
mockStats,
|
|
516
|
-
mockBinValues,
|
|
517
|
-
mockValueCounts,
|
|
518
|
-
{ includeCharts: true },
|
|
519
|
-
);
|
|
512
|
+
const model = new ColumnChartSpecModel({
|
|
513
|
+
data: `data:text/plain;base64,${btoa(arrowData)}`,
|
|
514
|
+
fieldTypes: mockFieldTypes,
|
|
515
|
+
stats: mockStats,
|
|
516
|
+
binValues: mockBinValues,
|
|
517
|
+
valueCounts: mockValueCounts,
|
|
518
|
+
opts: { includeCharts: true },
|
|
519
|
+
});
|
|
520
520
|
const spec = model.getHeaderSummary("date").spec;
|
|
521
521
|
expect(spec).toMatchSnapshot();
|
|
522
522
|
expect(spec?.data?.format?.type).toBe("arrow");
|
|
@@ -529,14 +529,14 @@ describe("ColumnChartSpecModel", () => {
|
|
|
529
529
|
{ a: 1, b: 2, c: 3 },
|
|
530
530
|
{ a: 4, b: 5, c: 6 },
|
|
531
531
|
];
|
|
532
|
-
const model = new ColumnChartSpecModel(
|
|
533
|
-
arrayData,
|
|
534
|
-
mockFieldTypes,
|
|
535
|
-
mockStats,
|
|
536
|
-
mockBinValues,
|
|
537
|
-
mockValueCounts,
|
|
538
|
-
{ includeCharts: true },
|
|
539
|
-
);
|
|
532
|
+
const model = new ColumnChartSpecModel({
|
|
533
|
+
data: arrayData,
|
|
534
|
+
fieldTypes: mockFieldTypes,
|
|
535
|
+
stats: mockStats,
|
|
536
|
+
binValues: mockBinValues,
|
|
537
|
+
valueCounts: mockValueCounts,
|
|
538
|
+
opts: { includeCharts: true },
|
|
539
|
+
});
|
|
540
540
|
|
|
541
541
|
const summary = model.getHeaderSummary("date");
|
|
542
542
|
expect(summary.spec).toBeDefined();
|
|
@@ -39,13 +39,13 @@ describe("create vega spec", () => {
|
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
it("should create and augment a spec", () => {
|
|
42
|
-
const spec = createSpecWithoutData(
|
|
43
|
-
ChartType.BAR,
|
|
44
|
-
createBasicFormValues(),
|
|
45
|
-
"light",
|
|
46
|
-
400,
|
|
47
|
-
300,
|
|
48
|
-
);
|
|
42
|
+
const spec = createSpecWithoutData({
|
|
43
|
+
chartType: ChartType.BAR,
|
|
44
|
+
formValues: createBasicFormValues(),
|
|
45
|
+
theme: "light",
|
|
46
|
+
width: 400,
|
|
47
|
+
height: 300,
|
|
48
|
+
});
|
|
49
49
|
expect(spec).toMatchSnapshot();
|
|
50
50
|
expect(typeof spec !== "string").toBe(true); // Not error message
|
|
51
51
|
expect((spec as TopLevelSpec).data).toEqual({ values: [] });
|
|
@@ -59,25 +59,25 @@ describe("create vega spec", () => {
|
|
|
59
59
|
const formValues = createBasicFormValues();
|
|
60
60
|
formValues.general!.xColumn!.field = undefined;
|
|
61
61
|
|
|
62
|
-
const spec = createSpecWithoutData(
|
|
63
|
-
ChartType.BAR,
|
|
62
|
+
const spec = createSpecWithoutData({
|
|
63
|
+
chartType: ChartType.BAR,
|
|
64
64
|
formValues,
|
|
65
|
-
"light",
|
|
66
|
-
400,
|
|
67
|
-
300,
|
|
68
|
-
);
|
|
65
|
+
theme: "light",
|
|
66
|
+
width: 400,
|
|
67
|
+
height: 300,
|
|
68
|
+
});
|
|
69
69
|
expect(spec).toEqual(X_AXIS_REQUIRED);
|
|
70
70
|
|
|
71
71
|
// Undefined yColumn
|
|
72
72
|
const formValues2 = createBasicFormValues();
|
|
73
73
|
formValues2.general!.yColumn!.field = undefined;
|
|
74
|
-
const spec2 = createSpecWithoutData(
|
|
75
|
-
ChartType.BAR,
|
|
76
|
-
formValues2,
|
|
77
|
-
"light",
|
|
78
|
-
400,
|
|
79
|
-
300,
|
|
80
|
-
);
|
|
74
|
+
const spec2 = createSpecWithoutData({
|
|
75
|
+
chartType: ChartType.BAR,
|
|
76
|
+
formValues: formValues2,
|
|
77
|
+
theme: "light",
|
|
78
|
+
width: 400,
|
|
79
|
+
height: 300,
|
|
80
|
+
});
|
|
81
81
|
expect(spec2).toEqual(Y_AXIS_REQUIRED);
|
|
82
82
|
});
|
|
83
83
|
});
|