]> danix's work - publisher.git/commitdiff
feat: config load/save with tomlkit
authorDanilo M. <redacted>
Fri, 1 May 2026 10:42:29 +0000 (12:42 +0200)
committerDanilo M. <redacted>
Fri, 1 May 2026 10:42:29 +0000 (12:42 +0200)
Co-Authored-By: Claude Sonnet 4.6 <redacted>
core/config.py [new file with mode: 0644]
tests/test_config.py [new file with mode: 0644]

diff --git a/core/config.py b/core/config.py
new file mode 100644 (file)
index 0000000..1f400b4
--- /dev/null
@@ -0,0 +1,40 @@
+from __future__ import annotations
+from dataclasses import dataclass
+from pathlib import Path
+import tomlkit
+
+DEFAULT_CONFIG_PATH = Path.home() / ".config" / "my-publisher" / "config.toml"
+
+@dataclass
+class Config:
+    blog_repo: str = ""
+    transart_script: str = "/home/danix/bin/transart.py"
+    typora_bin: str = "typora"
+
+    def is_complete(self) -> bool:
+        return bool(self.blog_repo)
+
+    def save(self, path: Path | None = None) -> None:
+        import core.config as _mod
+        if path is None:
+            path = _mod.DEFAULT_CONFIG_PATH
+        path.parent.mkdir(parents=True, exist_ok=True)
+        doc = tomlkit.document()
+        doc.add("blog_repo", self.blog_repo)
+        doc.add("transart_script", self.transart_script)
+        doc.add("typora_bin", self.typora_bin)
+        path.write_text(tomlkit.dumps(doc))
+
+    @classmethod
+    def load(cls, path: Path | None = None) -> "Config":
+        import core.config as _mod
+        if path is None:
+            path = _mod.DEFAULT_CONFIG_PATH
+        if not path.exists():
+            return cls()
+        data = tomlkit.loads(path.read_text())
+        return cls(
+            blog_repo=str(data.get("blog_repo", "")),
+            transart_script=str(data.get("transart_script", "/home/danix/bin/transart.py")),
+            typora_bin=str(data.get("typora_bin", "typora")),
+        )
diff --git a/tests/test_config.py b/tests/test_config.py
new file mode 100644 (file)
index 0000000..6b3417f
--- /dev/null
@@ -0,0 +1,29 @@
+import pytest
+from pathlib import Path
+import tempfile, os
+from core.config import Config, DEFAULT_CONFIG_PATH
+
+def test_config_loads_defaults_when_missing(tmp_path, monkeypatch):
+    monkeypatch.setattr("core.config.DEFAULT_CONFIG_PATH", tmp_path / "config.toml")
+    cfg = Config.load()
+    assert cfg.blog_repo == ""
+    assert cfg.transart_script == "/home/danix/bin/transart.py"
+    assert cfg.typora_bin == "typora"
+
+def test_config_round_trips(tmp_path, monkeypatch):
+    path = tmp_path / "config.toml"
+    monkeypatch.setattr("core.config.DEFAULT_CONFIG_PATH", path)
+    cfg = Config(blog_repo="/some/path", transart_script="/bin/x", typora_bin="typora")
+    cfg.save()
+    loaded = Config.load()
+    assert loaded.blog_repo == "/some/path"
+
+def test_config_is_complete_false_when_blog_repo_empty(tmp_path, monkeypatch):
+    monkeypatch.setattr("core.config.DEFAULT_CONFIG_PATH", tmp_path / "config.toml")
+    cfg = Config.load()
+    assert cfg.is_complete() is False
+
+def test_config_is_complete_true_when_all_set(tmp_path, monkeypatch):
+    monkeypatch.setattr("core.config.DEFAULT_CONFIG_PATH", tmp_path / "config.toml")
+    cfg = Config(blog_repo="/some/repo", transart_script="/bin/x", typora_bin="typora")
+    assert cfg.is_complete() is True