Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 4 additions & 2 deletions src/pdealchemy/notebook_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,16 +96,18 @@ def math_eq_editor(
source_text = _read_equation_source(source_path)
except OSError as exc:
return mo.md(f"**Error loading equation file** `{content}`: {exc}")
get_source_text, set_source_text = mo.state(source_text)

source_editor = mo.ui.code_editor(
value=source_text,
language="markdown",
label=f"Equation source: {content}",
on_change=set_source_text,
)

def _save_source(_value: object) -> str:
try:
source_path.write_text(str(source_editor.value), encoding="utf-8")
source_path.write_text(str(get_source_text()), encoding="utf-8")
except OSError as exc:
return f"Save failed: {exc}"
return f"Saved `{content}`."
Expand All @@ -116,7 +118,7 @@ def _save_source(_value: object) -> str:
kind="success",
)
preview = _render_equation_block(
latex=_extract_first_latex_block(str(source_editor.value)),
latex=_extract_first_latex_block(str(get_source_text())),
name=name,
mo=mo,
)
Expand Down
60 changes: 56 additions & 4 deletions tests/notebook/test_notebook_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,18 @@ def _fake_marimo_module() -> SimpleNamespace:


class _FakeCodeEditor:
def __init__(self, value: str) -> None:
self.value = value
def __init__(self, value: str, on_change: Any | None = None) -> None:
self._value = value
self._on_change = on_change

@property
def value(self) -> str:
return self._value

def set_value(self, value: str) -> None:
self._value = value
if self._on_change is not None:
self._on_change(value)


class _FakeButton:
Expand All @@ -43,16 +53,23 @@ def click(self) -> Any:
return self._on_click(None)


class _NoValueReadEditor(_FakeCodeEditor):
@property
def value(self) -> str:
raise RuntimeError("Accessing editor.value in creating cell is not allowed")


class _FakeUi:
def code_editor(
self,
value: str,
*,
language: str,
label: str,
on_change: Any | None = None,
) -> _FakeCodeEditor:
_ = (language, label)
return _FakeCodeEditor(value)
return _FakeCodeEditor(value, on_change=on_change)

def button(
self,
Expand All @@ -76,8 +93,31 @@ def md(text: str) -> tuple[str, str]:
def vstack(blocks: list[object]) -> tuple[str, list[object]]:
return ("vstack", blocks)

@staticmethod
def state(value: str) -> tuple[Any, Any]:
payload: dict[str, str] = {"value": value}

def _get() -> str:
return payload["value"]

def _set(new_value: str) -> None:
payload["value"] = new_value

return _get, _set


class _NoValueReadUi(_FakeUi):
def code_editor(
self,
value: str,
*,
language: str,
label: str,
on_change: Any | None = None,
) -> _NoValueReadEditor:
_ = (language, label)
return _NoValueReadEditor(value, on_change=on_change)

def button(
self,
*,
Expand All @@ -100,6 +140,18 @@ def md(text: str) -> tuple[str, str]:
def vstack(blocks: list[object]) -> tuple[str, list[object]]:
return ("vstack", blocks)

@staticmethod
def state(value: str) -> tuple[Any, Any]:
payload: dict[str, str] = {"value": value}

def _get() -> str:
return payload["value"]

def _set(new_value: str) -> None:
payload["value"] = new_value

return _get, _set


def test_math_eq_renders_raw_latex(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(notebook_utils, "_load_marimo_module", _fake_marimo_module)
Expand Down Expand Up @@ -242,7 +294,7 @@ def test_math_eq_editor_persists_edited_source(
rendered = notebook_utils.math_eq_editor(str(equation_file))
editor = next(block for block in rendered[1] if isinstance(block, _FakeCodeEditor))
button = next(block for block in rendered[1] if isinstance(block, _FakeButton))
editor.value = "\\[\nS-K\n\\]"
editor.set_value("\\[\nS-K\n\\]")

button.click()

Expand Down
Loading