From 7d1de673fbcb65e22b7a6027ba72931f77458319 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:12:30 +0000 Subject: [PATCH 1/2] fix: handle TOML parsing errors in config reader - Add error handling for tomlkit.exceptions.TOMLKitError - Add tests for valid and invalid TOML parsing - Fixes #3668 Co-Authored-By: Myles Scolnick --- marimo/_utils/config/config.py | 2 +- tests/_utils/config/test_config_reader.py | 40 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/_utils/config/test_config_reader.py diff --git a/marimo/_utils/config/config.py b/marimo/_utils/config/config.py index 9749461f05c..54f6c63e773 100644 --- a/marimo/_utils/config/config.py +++ b/marimo/_utils/config/config.py @@ -36,7 +36,7 @@ def read_toml(self, cls: Type[T], *, fallback: T) -> T: with open(self.filepath, "r") as file: data = tomlkit.parse(file.read()) return parse_raw(data, cls, allow_unknown_keys=True) - except FileNotFoundError: + except (FileNotFoundError, tomlkit.exceptions.TOMLKitError): return fallback def write_toml(self, data: Any) -> None: diff --git a/tests/_utils/config/test_config_reader.py b/tests/_utils/config/test_config_reader.py new file mode 100644 index 00000000000..bccbd7674b8 --- /dev/null +++ b/tests/_utils/config/test_config_reader.py @@ -0,0 +1,40 @@ +# Copyright 2024 Marimo. All rights reserved. +from __future__ import annotations + +import os +from dataclasses import dataclass +from tempfile import NamedTemporaryFile + +from marimo._utils.config.config import ConfigReader + + +@dataclass +class TestConfig: + value: str + + +def test_read_toml_invalid_syntax() -> None: + with NamedTemporaryFile(mode="w", suffix=".toml", delete=False) as f: + # Write invalid TOML content (missing value after comma) + f.write("key = 'value',") + f.flush() + + reader = ConfigReader(f.name) + fallback = TestConfig(value="fallback") + result = reader.read_toml(TestConfig, fallback=fallback) + assert result == fallback + + os.unlink(f.name) + + +def test_read_toml_valid() -> None: + with NamedTemporaryFile(mode="w", suffix=".toml", delete=False) as f: + f.write('value = "test"') + f.flush() + + reader = ConfigReader(f.name) + fallback = TestConfig(value="fallback") + result = reader.read_toml(TestConfig, fallback=fallback) + assert result == TestConfig(value="test") + + os.unlink(f.name) From afee5a5039378e30f4f81e50e8ccf4c807e51fc0 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:13:25 +0000 Subject: [PATCH 2/2] chore: add __init__.py to tests/_utils/config Co-Authored-By: Myles Scolnick --- tests/_utils/config/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/_utils/config/__init__.py diff --git a/tests/_utils/config/__init__.py b/tests/_utils/config/__init__.py new file mode 100644 index 00000000000..e69de29bb2d