From b172f49a8d026af9848e6f05de49b2ff0ce316d8 Mon Sep 17 00:00:00 2001 From: Mikhail Moysenko Date: Mon, 23 Oct 2023 01:22:34 +0300 Subject: [PATCH] fix kill_window --- src/libtmux/session.py | 18 +++++++++++------- tests/test_session.py | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/libtmux/session.py b/src/libtmux/session.py index cd6c86cc9..b28cbb28f 100644 --- a/src/libtmux/session.py +++ b/src/libtmux/session.py @@ -523,7 +523,7 @@ def new_window( server=self.server, window_id=window_formatters["window_id"] ) - def kill_window(self, target_window: t.Optional[str] = None) -> None: + def kill_window(self, target_window: t.Optional[t.Union[str, int]] = None) -> None: """Close a tmux window, and all panes inside it, ``$ tmux kill-window`` Kill the current window or the window at ``target-window``. removing it @@ -531,17 +531,21 @@ def kill_window(self, target_window: t.Optional[str] = None) -> None: Parameters ---------- - target_window : str, optional - window to kill + target_window : str, int, optional + window to kill. Stands for a window id in the format "@{id}", + if str, a window index if int, and an attached window if none. """ - if target_window: + kill_cmd = ["kill-window"] + + if target_window is not None: if isinstance(target_window, int): - target = "-t%s:%d" % (self.window_name, target_window) + target = "-t%s:%d" % (self.session_name, target_window) else: target = "-t%s" % target_window - - proc = self.cmd("kill-window", target) + kill_cmd.append(target) + + proc = self.cmd(*kill_cmd) if proc.stderr: raise exc.LibTmuxException(proc.stderr) diff --git a/tests/test_session.py b/tests/test_session.py index 8c1c85eac..386f0d816 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -6,6 +6,7 @@ import pytest from libtmux import exc +from libtmux._internal.query_list import ObjectDoesNotExist from libtmux.common import has_gte_version, has_lt_version from libtmux.pane import Pane from libtmux.server import Server @@ -321,3 +322,23 @@ def test_new_window_with_environment_logs_warning_for_old_tmux( assert any( "Cannot set up environment" in record.msg for record in caplog.records ), "Warning missing" + + +@pytest.mark.parametrize( + "target_window_mapper", + [ + lambda w: int(w.index), + lambda w: w.id, + lambda w: None, + ] +) +def test_kill_window_by_id( + session: Session, + target_window_mapper: t.Callable[[Window], t.Optional[t.Union[int, str]]], +) -> None: + # kill by window index + session.new_window() + w = session.attached_window + session.kill_window(target_window_mapper(w)) + with pytest.raises(ObjectDoesNotExist): + w.refresh()