From 46135f93250764fb085aa8cd7b713b62b03a99e6 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 28 Nov 2025 22:42:31 +0100 Subject: [PATCH] test: Correctly fall back to EDITOR or VISUAL env vars --- test/test_configuration.py | 13 +++++++++++++ topen.py | 10 ++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/test/test_configuration.py b/test/test_configuration.py index ad50caf..8eb6296 100644 --- a/test/test_configuration.py +++ b/test/test_configuration.py @@ -107,3 +107,16 @@ class TestTConf: def test_default_notes_sub_dir(self): cfg = TConf.from_dict({"task_data": "~/my/tasks", "task_id": 0}) assert cfg.notes_dir == Path("~/my/tasks/notes").expanduser() + + @pytest.mark.parametrize( + "env,expected", + [ + ({"EDITOR": "vim"}, "vim"), + ({"VISUAL": "emacs", "EDITOR": ""}, "emacs"), + ({"VISUAL": "nvim", "EDITOR": "notepad"}, "notepad"), + ], + ) + def test_editor_env_resolution(isolate_env, monkeypatch, env, expected): + for k, v in env.items(): + monkeypatch.setenv(k, v) + assert TConf(0).notes_editor == expected diff --git a/topen.py b/topen.py index 90f99e6..a290e98 100755 --- a/topen.py +++ b/topen.py @@ -188,7 +188,7 @@ OPTIONS: dict[str, Opt] = { ("--editor",), "TOPEN_NOTES_EDITOR", "notes.editor", - default=os.getenv("EDITOR") or os.getenv("VISUAL") or "nano", + default="nano", metavar="CMD", help_text="Program to open note files with", ), @@ -225,7 +225,7 @@ class TConf: """The extension of note files.""" notes_annot: str = OPTIONS["notes_annot"].default """The annotation to add to taskwarrior tasks with notes.""" - notes_editor: str = OPTIONS["notes_editor"].default + notes_editor: str = "" # added in post-init """The editor to open note files with.""" notes_quiet: bool = OPTIONS["notes_quiet"].default """If set topen will give no feedback on note editing.""" @@ -236,6 +236,12 @@ class TConf: if self.notes_dir == NON_EXISTENT_PATH: self.notes_dir = self._default_notes_dir() self.notes_dir = _real_path(self.notes_dir) + if not self.notes_editor: + self.notes_editor = ( + os.getenv("EDITOR") + or os.getenv("VISUAL") + or OPTIONS["notes_editor"].default + ) def __or__(self, other: Any, /) -> Self: return self.__class__(**asdict(self) | asdict(other))