@marimo-team/islands 0.25.3-dev266 → 0.25.3-dev268
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/{ConnectedDataExplorerComponent-C_hj7Poi.js → ConnectedDataExplorerComponent-eLHPh6uu.js} +9 -9
- package/dist/{ErrorBoundary-CvxlC3F1.js → ErrorBoundary-CQYAoD7X.js} +64 -69
- package/dist/{abnfDiagram-VCTEODGH-DzrZZXRD.js → abnfDiagram-VCTEODGH-hqd0IBtX.js} +2 -2
- package/dist/{any-language-editor-CFeWfC3o.js → any-language-editor-DnG26QXh.js} +1 -1
- package/dist/{architectureDiagram-5GKGNRK7-iF_snyFL.js → architectureDiagram-5GKGNRK7-BzLAFcc0.js} +1 -1
- package/dist/{strings-BCKpLFNU.js → assertNever-DIU3JJbt.js} +14 -14
- package/dist/{chat-ui-DFxNgzXF.js → chat-ui-BAnLgpTe.js} +1964 -1740
- package/dist/{chunk-IMKFNOWR-B7xytD4B.js → chunk-IMKFNOWR-DOeVvuyE.js} +1 -1
- package/dist/{chunk-SHT3W25Y-I8ZFP5L1.js → chunk-SHT3W25Y-DZoFI8wR.js} +1 -1
- package/dist/{chunk-SVP7TREG-Di-uAPdT.js → chunk-SVP7TREG-CWu86PSW.js} +1 -1
- package/dist/{chunk-TICWLB2K-BFpUy0ud.js → chunk-TICWLB2K-BrM0GoP3.js} +1 -1
- package/dist/{classDiagram-ZZMXUADV-Cqm4JGpx.js → classDiagram-ZZMXUADV-DYi4V2bB.js} +2 -2
- package/dist/{classDiagram-v2-VYDZK3BY-DFHRJpN3.js → classDiagram-v2-VYDZK3BY-tN7FIk-m.js} +2 -2
- package/dist/{code-visibility-SRM1JiD_.js → code-visibility-DcZ_RwaH.js} +44 -47
- package/dist/{common-yiRhZ6ZZ.js → common-BGeQilvh.js} +5846 -5519
- package/dist/{config-CmeG_Pb6.js → config-BsPruWMR.js} +2 -2
- package/dist/{createReducer-C_syF8Td.js → createReducer-DdtT_7ji.js} +1 -1
- package/dist/{cynefinDiagram-5FMLGOSQ-cuGOeTBC.js → cynefinDiagram-5FMLGOSQ-D5nCnDc-.js} +1 -1
- package/dist/{dagre-GXQ25YYZ-DJ76aC4k.js → dagre-GXQ25YYZ-BHkd7f_i.js} +1 -1
- package/dist/{data-grid-overlay-editor-DLTzcQ4O.js → data-grid-overlay-editor-Dc4lW4A3.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-DLLc0sw7.js → diagram-S7CK7UJ4-D1ALppT2.js} +1 -1
- package/dist/{diagram-UQ7AKVKN-Tz_d6qmk.js → diagram-UQ7AKVKN-DLv0b83L.js} +1 -1
- package/dist/{diagram-VX7I27RA-D7SzPrDN.js → diagram-VX7I27RA-7XJ7J6qg.js} +1 -1
- package/dist/{diagram-Z3DM3KII-qr37XV58.js → diagram-Z3DM3KII-7M7zbHp_.js} +1 -1
- package/dist/{dialog-BtprQCUw.js → dialog-DzCj1qQv.js} +1 -1
- package/dist/{dropdown-menu-CkJ7ErY6.js → dropdown-menu-CdXE15an.js} +1214 -1208
- package/dist/{ebnfDiagram-PWID7BFC-BKOQb4J0.js → ebnfDiagram-PWID7BFC-DHH1qlmV.js} +2 -2
- package/dist/{erDiagram-RLTQ6QDP-CM15Vq68.js → erDiagram-RLTQ6QDP-fI_0dGef.js} +1 -1
- package/dist/{error-banner-DbRFOd2O.js → error-banner-DPc9eIw5.js} +3 -3
- package/dist/{error-entries-CMoaUX9V.js → error-entries-CxN-Nq3V.js} +524 -456
- package/dist/{feedback-button-DBUrE4OL.js → feedback-button-BqaeQcvX.js} +77 -77
- package/dist/{flowDiagram-HODETNUW-Dt3N5yFT.js → flowDiagram-HODETNUW-Brg9MA6i.js} +2 -2
- package/dist/{formats-gGospKWJ.js → formats-DbSvAPY-.js} +1 -1
- package/dist/{glide-data-editor-Cfv4HeOh.js → glide-data-editor-CiijPXA7.js} +2042 -2041
- package/dist/{glide-utils-Ba9WD2IN.js → glide-utils-BSw3SSHF.js} +29 -35
- package/dist/{globals-dIbBIR5-.js → globals-CpmSWKI_.js} +2 -2
- package/dist/{html-to-image-D_5CMreP.js → html-to-image-8sywF4my.js} +5452 -5751
- package/dist/{infoDiagram-27XIBGKW-C7axJMCl.js → infoDiagram-27XIBGKW-E9e403YT.js} +1 -1
- package/dist/{ishikawaDiagram-5VMMS53U-CdC9Eur7.js → ishikawaDiagram-5VMMS53U-C-RlYDRo.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-BHnMIgD7.js → kanban-definition-UXKFOSKX-CLFl_uqK.js} +1 -1
- package/dist/main.js +6294 -6324
- package/dist/{mermaid-DFYN_PXd.js → mermaid-rd09e1JL.js} +35 -35
- package/dist/{mindmap-definition-YA3MSWOX-BagHoCGU.js → mindmap-definition-YA3MSWOX-BQ8TWtyB.js} +1 -1
- package/dist/{number-overlay-editor-CTiJp5Mj.js → number-overlay-editor-Ft4NiAEN.js} +1 -1
- package/dist/{pegDiagram-XKGWAZYB-8IIZczip.js → pegDiagram-XKGWAZYB-CN8UHFPi.js} +2 -2
- package/dist/pencil-DcT8AE0h.js +10 -0
- package/dist/{pieDiagram-E7YTZNPT-CE6dKBIr.js → pieDiagram-E7YTZNPT-DGuJ0EBd.js} +1 -1
- package/dist/{process-output-CGFNVC60.js → process-output-Dku5POvm.js} +3 -3
- package/dist/{railroadDiagram-O6MQD6OU-CkexPq3b.js → railroadDiagram-O6MQD6OU-BPDA8wy8.js} +2 -2
- package/dist/{requirementDiagram-BXWQKSXE-B0-OkuAe.js → requirementDiagram-BXWQKSXE-ChzLGbGW.js} +1 -1
- package/dist/{reveal-component-DH09ygHo.js → reveal-component-D0cfwbbl.js} +1094 -1094
- package/dist/{select-C33FVPPN.js → select-OxgozOC8.js} +1 -1
- package/dist/{sequenceDiagram-WJ2MYXX4-Dxysg8DX.js → sequenceDiagram-WJ2MYXX4-DFX-bE6O.js} +1 -1
- package/dist/{spec-DH1lmF7Q.js → spec-oJn0RhpQ.js} +2 -2
- package/dist/{stateDiagram-D77RDMKH-DTEN3-OJ.js → stateDiagram-D77RDMKH-BR7cI3wK.js} +2 -2
- package/dist/{stateDiagram-v2-MP3YSRHH-vktk3Xc5.js → stateDiagram-v2-MP3YSRHH-oGqB5UDI.js} +2 -2
- package/dist/{static-state-BldGd99T.js → static-state-CuV6Pc3a.js} +1 -1
- package/dist/style.css +1 -1
- package/dist/{swimlanes-42K2YHIH-Cjveh9OM.js → swimlanes-42K2YHIH-DwSZl1yC.js} +1 -1
- package/dist/{swimlanesDiagram-VR7AAH4N-Bdr7Ev_2.js → swimlanesDiagram-VR7AAH4N-BHlcd-Ri.js} +2 -2
- package/dist/{timeline-definition-24CTP7MA-KIuDcefn.js → timeline-definition-24CTP7MA-DMmP-G2O.js} +1 -1
- package/dist/{toast-CY1_Qv41.js → toast-DbBHmxmB.js} +2 -2
- package/dist/{useAsyncData-DsZMvNXn.js → useAsyncData-BYIAoMqn.js} +1 -1
- package/dist/{useDateFormatter-Dk_xFci4.js → useDateFormatter-ButWkdcK.js} +1 -1
- package/dist/{useDeepCompareMemoize-KMBBux8C.js → useDeepCompareMemoize-Bz0c5GN6.js} +1 -1
- package/dist/{useTheme-BZ2GGLgm.js → useTheme-DPLobSFs.js} +7 -7
- package/dist/{utils-DXkj82sK.js → utils-EBklsC5R.js} +31 -31
- package/dist/{vega-component-C-lqjV0q.js → vega-component-rxIxAAh9.js} +7 -7
- package/dist/{vennDiagram-4TSXK5OY-DrIOUHfb.js → vennDiagram-4TSXK5OY-Db8GtH1G.js} +1 -1
- package/dist/{wardleyDiagram-VM6X3IG4-CJNjf4OH.js → wardleyDiagram-VM6X3IG4-DmIiC3FU.js} +1 -1
- package/dist/{xychartDiagram-S5SC5T6Z-DEshFho-.js → xychartDiagram-S5SC5T6Z-DS9OPrNq.js} +1 -1
- package/package.json +1 -1
- package/src/__mocks__/executions.ts +195 -0
- package/src/__mocks__/notebook.ts +0 -1
- package/src/__tests__/CellStatus.test.tsx +19 -20
- package/src/components/chat/__tests__/chat-display.test.tsx +157 -86
- package/src/components/chat/__tests__/chat-utils.test.ts +42 -0
- package/src/components/chat/__tests__/turn-timing.test.ts +84 -0
- package/src/components/chat/__tests__/use-assistant-turn.test.ts +95 -0
- package/src/components/chat/__tests__/user-message.test.tsx +27 -0
- package/src/components/chat/acp/agent-panel.tsx +2 -0
- package/src/components/chat/agent-activity.tsx +132 -0
- package/src/components/chat/chat-display.tsx +125 -96
- package/src/components/chat/chat-panel.tsx +123 -106
- package/src/components/chat/chat-utils.ts +12 -24
- package/src/components/chat/tool-call/__tests__/tool-labels.test.ts +76 -0
- package/src/components/chat/tool-call/__tests__/tool-step.test.tsx +57 -0
- package/src/components/chat/tool-call/shared.ts +6 -0
- package/src/components/chat/tool-call/tool-call-view.tsx +22 -76
- package/src/components/chat/tool-call/tool-labels.ts +172 -0
- package/src/components/chat/tool-call/tool-step.tsx +145 -0
- package/src/components/chat/turn-timing.ts +73 -0
- package/src/components/chat/use-assistant-turn.ts +65 -0
- package/src/components/chat/use-chat-generation.ts +5 -4
- package/src/components/chat/user-message.tsx +145 -0
- package/src/components/dependency-graph/minimap-content.tsx +3 -2
- package/src/components/editor/__tests__/data-attributes.test.tsx +0 -7
- package/src/components/editor/__tests__/output-persistence.test.tsx +2 -2
- package/src/components/editor/actions/__tests__/useCellActionButton.test.tsx +19 -1
- package/src/components/editor/actions/useCellActionButton.tsx +10 -3
- package/src/components/editor/ai/completion-handlers.tsx +0 -37
- package/src/components/editor/alerts/stdin-blocking-alert.tsx +3 -1
- package/src/components/editor/cell/CellStatus.tsx +23 -19
- package/src/components/editor/cell/RunButton.tsx +16 -6
- package/src/components/editor/cell/StagedAICell.tsx +51 -144
- package/src/components/editor/cell/__tests__/useRunCells.test.ts +45 -0
- package/src/components/editor/cell/cell-context-menu.tsx +4 -1
- package/src/components/editor/cell/code/cell-editor.tsx +7 -5
- package/src/components/editor/cell/collapse.tsx +4 -0
- package/src/components/editor/cell/useRunCells.ts +18 -3
- package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +193 -32
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +2 -2
- package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +145 -81
- package/src/components/editor/chrome/wrapper/pending-ai-changes-badge.tsx +25 -0
- package/src/components/editor/chrome/wrapper/sidebar.tsx +8 -4
- package/src/components/editor/header/status.tsx +4 -2
- package/src/components/editor/links/cell-link.tsx +4 -4
- package/src/components/editor/navigation/navigation.ts +3 -2
- package/src/components/editor/notebook-cell.tsx +85 -94
- package/src/components/editor/renderers/grid-layout/__tests__/grid-layout.test.tsx +75 -0
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +22 -16
- package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +0 -1
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +12 -33
- package/src/components/editor/stdin-blocking-alert.tsx +3 -1
- package/src/components/scratchpad/scratchpad.tsx +4 -1
- package/src/components/slides/minimap.tsx +4 -2
- package/src/components/slides/reveal-component.tsx +14 -10
- package/src/components/slides/slide-cell-view.tsx +28 -24
- package/src/components/slides/slide.tsx +3 -4
- package/src/components/ui/toast.tsx +1 -1
- package/src/core/ai/__tests__/staged-cells.test.ts +74 -126
- package/src/core/ai/staged-cells.ts +48 -38
- package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +0 -389
- package/src/core/cells/__tests__/cell.test.ts +49 -154
- package/src/core/cells/__tests__/cells.test.ts +18 -127
- package/src/core/cells/__tests__/pending-delete-service.test.tsx +11 -20
- package/src/core/cells/__tests__/utils.test.ts +75 -247
- package/src/core/cells/actions.ts +5 -2
- package/src/core/cells/cell.ts +31 -133
- package/src/core/cells/cells.ts +14 -29
- package/src/core/cells/document.ts +3 -3
- package/src/core/cells/focus.ts +27 -6
- package/src/core/cells/layout.ts +1 -1
- package/src/core/cells/pending-delete-service.ts +5 -7
- package/src/core/cells/scrollCellIntoView.ts +6 -0
- package/src/core/cells/types.ts +13 -36
- package/src/core/cells/utils.ts +37 -68
- package/src/core/codemirror/placeholder/__tests__/extensions.test.ts +59 -0
- package/src/core/codemirror/placeholder/extensions.ts +23 -0
- package/src/core/edit-app.tsx +2 -1
- package/src/core/executions/__tests__/atoms.test.ts +99 -0
- package/src/core/executions/__tests__/select.test.ts +268 -0
- package/src/core/executions/atoms.ts +206 -0
- package/src/core/executions/hooks.ts +31 -0
- package/src/core/executions/index.ts +31 -0
- package/src/core/executions/select.ts +175 -0
- package/src/core/export/__tests__/hooks.test.ts +0 -5
- package/src/core/islands/bootstrap.ts +4 -1
- package/src/core/islands/components/output-wrapper.tsx +5 -5
- package/src/core/kernel/handlers.ts +2 -11
- package/src/core/kernel/state.ts +0 -15
- package/src/core/lifecycle/render-policy.ts +12 -26
- package/src/core/network/__tests__/requests-lazy.test.ts +5 -5
- package/src/core/network/requests-lazy.ts +3 -3
- package/src/core/notebook/operations.ts +1 -1
- package/src/core/run-app.tsx +2 -1
- package/src/core/runtime/__tests__/adapter.test.ts +3 -3
- package/src/core/runtime/adapter.ts +4 -4
- package/src/core/session/__tests__/useNotebookSession.hook.test.tsx +34 -0
- package/src/core/session/useNotebookSession.tsx +10 -5
- package/src/core/wasm/bridge.ts +1 -1
- package/src/css/app/Cell.css +7 -36
- package/src/plugins/core/registerReactComponent.tsx +4 -13
- package/src/plugins/impl/chat/chat-ui.tsx +2 -3
- package/src/plugins/impl/common/error-banner.tsx +5 -3
- package/src/stories/cell-status.stories.tsx +17 -10
- package/src/stories/cell.stories.tsx +0 -31
- package/src/stories/layout/vertical/one-column.stories.tsx +0 -9
- package/src/utils/time.ts +10 -0
- package/src/components/chat/reasoning-accordion.tsx +0 -61
- package/src/components/chat/tool-call/tool-activity-group.tsx +0 -49
- package/src/components/chat/tool-call/tool-error-card.tsx +0 -81
- package/src/components/chat/tool-call/tool-history-row.tsx +0 -147
- package/src/components/icons/loading-ellipsis.tsx +0 -46
|
@@ -1,45 +1,41 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
import { describe, expect, it } from "vitest";
|
|
3
|
+
import type { CellExecutionView, CellRunStatus } from "@/core/executions";
|
|
3
4
|
import type { CellMessage, OutputMessage } from "@/core/kernel/messages";
|
|
4
|
-
import type {
|
|
5
|
-
import type { Seconds } from "@/utils/time";
|
|
5
|
+
import type { Milliseconds, Seconds } from "@/utils/time";
|
|
6
6
|
import { outputIsLoading, outputIsStale, transitionCell } from "../cell";
|
|
7
7
|
import { createCellRuntimeState } from "../types";
|
|
8
8
|
|
|
9
|
-
const STATUSES:
|
|
10
|
-
"queued",
|
|
11
|
-
"running",
|
|
12
|
-
"idle",
|
|
13
|
-
"disabled-transitively",
|
|
14
|
-
];
|
|
9
|
+
const STATUSES: CellRunStatus[] = ["queued", "running", "idle"];
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
const NOW = Date.now() as Milliseconds;
|
|
12
|
+
|
|
13
|
+
type View = Pick<
|
|
14
|
+
CellExecutionView,
|
|
15
|
+
"status" | "outcome" | "startedAt" | "rendered"
|
|
16
|
+
>;
|
|
17
|
+
|
|
18
|
+
function view(overrides: Partial<View>): View {
|
|
17
19
|
return {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
timestamp: Date.now(),
|
|
20
|
+
status: "idle",
|
|
21
|
+
outcome: null,
|
|
22
|
+
startedAt: null,
|
|
23
|
+
rendered: false,
|
|
24
|
+
...overrides,
|
|
24
25
|
};
|
|
25
26
|
}
|
|
27
|
+
|
|
26
28
|
describe("outputIsLoading", () => {
|
|
27
29
|
it("should return true if the cell is running", () => {
|
|
28
|
-
expect(outputIsLoading("running"
|
|
30
|
+
expect(outputIsLoading("running")).toBe(true);
|
|
29
31
|
});
|
|
30
32
|
|
|
31
33
|
it("should return true if the cell is queued", () => {
|
|
32
|
-
expect(outputIsLoading("queued"
|
|
34
|
+
expect(outputIsLoading("queued")).toBe(true);
|
|
33
35
|
});
|
|
34
36
|
|
|
35
37
|
it("should return false if the cell is idle", () => {
|
|
36
|
-
expect(outputIsLoading("idle"
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("should return false if the cell is disabled-transitively", () => {
|
|
40
|
-
expect(outputIsLoading("disabled-transitively" as RuntimeState)).toBe(
|
|
41
|
-
false,
|
|
42
|
-
);
|
|
38
|
+
expect(outputIsLoading("idle")).toBe(false);
|
|
43
39
|
});
|
|
44
40
|
});
|
|
45
41
|
|
|
@@ -47,149 +43,53 @@ describe("outputIsStale", () => {
|
|
|
47
43
|
it.each(STATUSES)(
|
|
48
44
|
"should return true if the cell is edited and status is %s",
|
|
49
45
|
(status) => {
|
|
50
|
-
|
|
51
|
-
status: status,
|
|
52
|
-
staleInputs: true,
|
|
53
|
-
output: null,
|
|
54
|
-
runStartTimestamp: null,
|
|
55
|
-
interrupted: false,
|
|
56
|
-
};
|
|
57
|
-
const edited = true;
|
|
58
|
-
expect(outputIsStale(cell, edited)).toBe(true);
|
|
46
|
+
expect(outputIsStale(view({ status }), true, true)).toBe(true);
|
|
59
47
|
},
|
|
60
48
|
);
|
|
61
49
|
|
|
62
50
|
it("should return true if the cell is loading", () => {
|
|
63
|
-
|
|
64
|
-
status: "running" as RuntimeState,
|
|
65
|
-
staleInputs: false,
|
|
66
|
-
output: null,
|
|
67
|
-
runStartTimestamp: null,
|
|
68
|
-
interrupted: false,
|
|
69
|
-
};
|
|
70
|
-
const edited = false;
|
|
71
|
-
expect(outputIsStale(cell, edited)).toBe(true);
|
|
51
|
+
expect(outputIsStale(view({ status: "running" }), false, false)).toBe(true);
|
|
72
52
|
});
|
|
73
53
|
|
|
74
|
-
it("should return false if the cell is running and
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
staleInputs: false,
|
|
78
|
-
output: createOutput(),
|
|
79
|
-
runStartTimestamp: (Date.now() - 1000) as Seconds, // Output received after run started
|
|
80
|
-
interrupted: false,
|
|
81
|
-
};
|
|
82
|
-
const edited = false;
|
|
83
|
-
expect(outputIsStale(cell, edited)).toBe(false);
|
|
54
|
+
it("should return false if the cell is running and has shown output", () => {
|
|
55
|
+
const running = view({ status: "running", rendered: true });
|
|
56
|
+
expect(outputIsStale(running, false, false)).toBe(false);
|
|
84
57
|
});
|
|
85
58
|
|
|
86
|
-
it("should return true if the cell
|
|
87
|
-
|
|
88
|
-
status: "disabled-transitively" as RuntimeState,
|
|
89
|
-
staleInputs: true,
|
|
90
|
-
output: null,
|
|
91
|
-
runStartTimestamp: null,
|
|
92
|
-
interrupted: false,
|
|
93
|
-
};
|
|
94
|
-
const edited = false;
|
|
95
|
-
expect(outputIsStale(cell, edited)).toBe(true);
|
|
59
|
+
it("should return true if the cell has stale inputs", () => {
|
|
60
|
+
expect(outputIsStale(view({}), true, false)).toBe(true);
|
|
96
61
|
});
|
|
97
62
|
|
|
98
63
|
it("should return false if the cell is interrupted", () => {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
output: null,
|
|
103
|
-
runStartTimestamp: null,
|
|
104
|
-
interrupted: true,
|
|
105
|
-
};
|
|
106
|
-
const edited = false;
|
|
107
|
-
expect(outputIsStale(cell, edited)).toBe(false);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it("should return true if the cell is running and output is received before run started", () => {
|
|
111
|
-
const cell = {
|
|
112
|
-
status: "running" as RuntimeState,
|
|
113
|
-
staleInputs: false,
|
|
114
|
-
output: createOutput(),
|
|
115
|
-
runStartTimestamp: (Date.now() + 1000) as Seconds, // Output received before run started
|
|
116
|
-
interrupted: false,
|
|
117
|
-
};
|
|
118
|
-
const edited = false;
|
|
119
|
-
expect(outputIsStale(cell, edited)).toBe(true);
|
|
64
|
+
expect(outputIsStale(view({ outcome: "interrupted" }), false, false)).toBe(
|
|
65
|
+
false,
|
|
66
|
+
);
|
|
120
67
|
});
|
|
121
68
|
|
|
122
|
-
it("should return false if the cell is idle and
|
|
123
|
-
|
|
124
|
-
status: "idle" as RuntimeState,
|
|
125
|
-
staleInputs: false,
|
|
126
|
-
output: createOutput(),
|
|
127
|
-
runStartTimestamp: null,
|
|
128
|
-
interrupted: false,
|
|
129
|
-
};
|
|
130
|
-
const edited = false;
|
|
131
|
-
expect(outputIsStale(cell, edited)).toBe(false);
|
|
69
|
+
it("should return false if the cell is idle and not edited", () => {
|
|
70
|
+
expect(outputIsStale(view({}), false, false)).toBe(false);
|
|
132
71
|
});
|
|
133
72
|
|
|
134
73
|
it("should return true if the cell is queued", () => {
|
|
135
|
-
|
|
136
|
-
status: "queued" as RuntimeState,
|
|
137
|
-
staleInputs: false,
|
|
138
|
-
output: null,
|
|
139
|
-
runStartTimestamp: null,
|
|
140
|
-
interrupted: false,
|
|
141
|
-
};
|
|
142
|
-
const edited = false;
|
|
143
|
-
expect(outputIsStale(cell, edited)).toBe(true);
|
|
74
|
+
expect(outputIsStale(view({ status: "queued" }), false, false)).toBe(true);
|
|
144
75
|
});
|
|
145
76
|
|
|
146
77
|
it("should return true if the cell is running but no output is received", () => {
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
staleInputs: false,
|
|
150
|
-
output: null,
|
|
151
|
-
runStartTimestamp: Date.now() as Seconds,
|
|
152
|
-
interrupted: false,
|
|
153
|
-
};
|
|
154
|
-
const edited = false;
|
|
155
|
-
expect(outputIsStale(cell, edited)).toBe(true);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it("should return false if the cell is idle and not edited", () => {
|
|
159
|
-
const cell = {
|
|
160
|
-
status: "idle" as RuntimeState,
|
|
161
|
-
staleInputs: false,
|
|
162
|
-
output: null,
|
|
163
|
-
runStartTimestamp: null,
|
|
164
|
-
interrupted: false,
|
|
165
|
-
};
|
|
166
|
-
const edited = false;
|
|
167
|
-
expect(outputIsStale(cell, edited)).toBe(false);
|
|
78
|
+
const running = view({ status: "running", startedAt: NOW });
|
|
79
|
+
expect(outputIsStale(running, false, false)).toBe(true);
|
|
168
80
|
});
|
|
169
81
|
|
|
170
82
|
it("should return false if the cell is interrupted but also edited", () => {
|
|
171
83
|
// We likely don't get in this state since before a cell is interrupted, it is run and we remove the edited state
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
output: null,
|
|
176
|
-
runStartTimestamp: null,
|
|
177
|
-
interrupted: true,
|
|
178
|
-
};
|
|
179
|
-
const edited = true;
|
|
180
|
-
expect(outputIsStale(cell, edited)).toBe(false);
|
|
84
|
+
expect(outputIsStale(view({ outcome: "interrupted" }), false, true)).toBe(
|
|
85
|
+
false,
|
|
86
|
+
);
|
|
181
87
|
});
|
|
182
88
|
|
|
183
|
-
it("should return
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
output: null,
|
|
188
|
-
runStartTimestamp: null,
|
|
189
|
-
interrupted: true,
|
|
190
|
-
};
|
|
191
|
-
const edited = false;
|
|
192
|
-
expect(outputIsStale(cell, edited)).toBe(false);
|
|
89
|
+
it("should return false if the cell is interrupted but has stale inputs", () => {
|
|
90
|
+
expect(outputIsStale(view({ outcome: "interrupted" }), true, false)).toBe(
|
|
91
|
+
false,
|
|
92
|
+
);
|
|
193
93
|
});
|
|
194
94
|
});
|
|
195
95
|
|
|
@@ -231,7 +131,7 @@ describe("transitionCell console output ids", () => {
|
|
|
231
131
|
});
|
|
232
132
|
|
|
233
133
|
it("assigns increasing ids to appended outputs", () => {
|
|
234
|
-
let cell = createCellRuntimeState(
|
|
134
|
+
let cell = createCellRuntimeState();
|
|
235
135
|
cell = transitionCell(cell, { console: output("a") } as CellMessage);
|
|
236
136
|
cell = transitionCell(cell, {
|
|
237
137
|
console: output("b", "stderr"),
|
|
@@ -240,7 +140,7 @@ describe("transitionCell console output ids", () => {
|
|
|
240
140
|
});
|
|
241
141
|
|
|
242
142
|
it("continues from the surviving maximum after a collapse", () => {
|
|
243
|
-
let cell = createCellRuntimeState(
|
|
143
|
+
let cell = createCellRuntimeState();
|
|
244
144
|
cell = transitionCell(cell, { console: output("a") } as CellMessage);
|
|
245
145
|
cell = transitionCell(cell, { console: output("b") } as CellMessage);
|
|
246
146
|
expect(cell.consoleOutputs.map((o) => o.id)).toEqual([1]);
|
|
@@ -251,7 +151,7 @@ describe("transitionCell console output ids", () => {
|
|
|
251
151
|
});
|
|
252
152
|
|
|
253
153
|
it("assigns ids when the kernel replaces the whole console", () => {
|
|
254
|
-
const cell = transitionCell(createCellRuntimeState(
|
|
154
|
+
const cell = transitionCell(createCellRuntimeState(), {
|
|
255
155
|
console: [output("a"), output("b", "stderr")],
|
|
256
156
|
} as CellMessage);
|
|
257
157
|
expect(cell.consoleOutputs.map((o) => o.id)).toEqual([1, 2]);
|
|
@@ -275,7 +175,7 @@ describe("transitionCell stdin resolution", () => {
|
|
|
275
175
|
name: "idle",
|
|
276
176
|
message: { status: "idle" } as CellMessage,
|
|
277
177
|
},
|
|
278
|
-
])("when $name", ({
|
|
178
|
+
])("when $name", ({ message }) => {
|
|
279
179
|
it.each(["text/plain", "text/password"] as const)(
|
|
280
180
|
"preserves a processed %s prompt",
|
|
281
181
|
(mimetype) => {
|
|
@@ -285,13 +185,11 @@ describe("transitionCell stdin resolution", () => {
|
|
|
285
185
|
data: "Enter a value: ",
|
|
286
186
|
timestamp: 0,
|
|
287
187
|
};
|
|
288
|
-
const waiting = transitionCell(
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
);
|
|
188
|
+
const waiting = transitionCell(createCellRuntimeState(), {
|
|
189
|
+
console: prompt,
|
|
190
|
+
} as CellMessage);
|
|
292
191
|
const resolved = transitionCell(waiting, message);
|
|
293
192
|
|
|
294
|
-
expect(resolved.interrupted).toBe(name === "interrupted");
|
|
295
193
|
expect(resolved.consoleOutputs[0]).toMatchObject({
|
|
296
194
|
...prompt,
|
|
297
195
|
response: "",
|
|
@@ -310,7 +208,6 @@ describe("transitionCell stdin resolution", () => {
|
|
|
310
208
|
response: "submitted value",
|
|
311
209
|
};
|
|
312
210
|
const answered = createCellRuntimeState({
|
|
313
|
-
status: "running",
|
|
314
211
|
consoleOutputs: [prompt],
|
|
315
212
|
});
|
|
316
213
|
const resolved = transitionCell(answered, message);
|
|
@@ -333,7 +230,6 @@ describe("transitionCell stdin resolution", () => {
|
|
|
333
230
|
// A paused-pdb cell shows an unanswered stdin prompt (the debugger box);
|
|
334
231
|
// once it finishes (e.g. after quitting with `q`), the box is removed.
|
|
335
232
|
const cell = createCellRuntimeState({
|
|
336
|
-
status: "running",
|
|
337
233
|
debuggerActive: true,
|
|
338
234
|
consoleOutputs: [stdinOutput()],
|
|
339
235
|
});
|
|
@@ -347,7 +243,6 @@ describe("transitionCell stdin resolution", () => {
|
|
|
347
243
|
|
|
348
244
|
it("leaves an unanswered prompt interactive while still running", () => {
|
|
349
245
|
const cell = createCellRuntimeState({
|
|
350
|
-
status: "running",
|
|
351
246
|
consoleOutputs: [stdinOutput()],
|
|
352
247
|
});
|
|
353
248
|
const next = transitionCell(cell, {
|