From 3ee67c562a6f1f00b1fbe4cc4e4d5ae8ef63c79b Mon Sep 17 00:00:00 2001 From: David Brochart Date: Mon, 27 Nov 2023 19:39:53 +0100 Subject: [PATCH] Change notebook code cell stream output schema --- javascript/src/ycell.ts | 27 +++++++++++++++++++++++++-- jupyter_ydoc/ynotebook.py | 7 ++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/javascript/src/ycell.ts b/javascript/src/ycell.ts index ccafbf8..20e4c78 100644 --- a/javascript/src/ycell.ts +++ b/javascript/src/ycell.ts @@ -761,13 +761,35 @@ export class YCodeCell return JSONExt.deepCopy(this._youtputs.toArray()); } + createOutputs(outputs: Array): Array { + const newOutputs: Array = []; + for (const output of outputs) { + if (output.output_type === 'stream') { + const { text, ...outputWithoutText } = output; + const _newOutput: { [id: string]: any } = outputWithoutText; + const newText = new Y.Array(); + newText.push(text as string[]); + _newOutput['text'] = newText; + const newOutput = new Y.Map(); + for (const [key, value] of Object.entries(_newOutput)) { + newOutput.set(key, value); + } + newOutputs.push(newOutput); + } else { + newOutputs.push(output); + } + } + return newOutputs; + } + /** * Replace all outputs. */ setOutputs(outputs: Array): void { this.transact(() => { this._youtputs.delete(0, this._youtputs.length); - this._youtputs.insert(0, outputs); + const newOutputs = this.createOutputs(outputs); + this._youtputs.insert(0, newOutputs); }, false); } @@ -789,7 +811,8 @@ export class YCodeCell end < this._youtputs.length ? end - start : this._youtputs.length - start; this.transact(() => { this._youtputs.delete(start, fin); - this._youtputs.insert(start, outputs); + const newOutputs = this.createOutputs(outputs); + this._youtputs.insert(start, newOutputs); }, false); } diff --git a/jupyter_ydoc/ynotebook.py b/jupyter_ydoc/ynotebook.py index 5166af1..7f70bdd 100644 --- a/jupyter_ydoc/ynotebook.py +++ b/jupyter_ydoc/ynotebook.py @@ -157,7 +157,12 @@ def create_ycell(self, value: Dict[str, Any]) -> Map: if "attachments" in cell and not cell["attachments"]: del cell["attachments"] elif cell_type == "code": - cell["outputs"] = Array(cell.get("outputs", [])) + outputs = cell.get("outputs", []) + for idx, output in enumerate(outputs): + if output.get("output_type") == "stream": + output["text"] = Array(output.get("text", [])) + outputs[idx] = Map(output) + cell["outputs"] = Array(outputs) return Map(cell)