From 2279cb563908ff70024eb7bd18994499c82af7d6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 10 Sep 2022 12:39:16 -0500 Subject: [PATCH 1/7] chore(WorkspaceBuilder): Improve code around new session args --- tmuxp/workspacebuilder.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 6b5cd23d051..ec19833b64d 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -205,15 +205,14 @@ def build(self, session=None, append=False): "Session name %s is already running." % self.sconf["session_name"] ) else: + new_session_kwargs = {} if "start_directory" in self.sconf: - session = self.server.new_session( - session_name=self.sconf["session_name"], - start_directory=self.sconf["start_directory"], - ) - else: - session = self.server.new_session( - session_name=self.sconf["session_name"] - ) + new_session_kwargs["start_directory"] = self.sconf[ + "start_directory" + ] + session = self.server.new_session( + session_name=self.sconf["session_name"] + ) assert self.sconf["session_name"] == session.name assert len(self.sconf["session_name"]) > 0 From 02f35484890923abe64da4527d36d74c350b127e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 10 Sep 2022 12:28:12 -0500 Subject: [PATCH 2/7] tests: Add regression for v1.13.1 pane spacing issue --- .../issue_800_default_size_many_windows.yaml | 12 +++ tests/test_workspacebuilder.py | 81 ++++++++++++++++++- 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/regressions/issue_800_default_size_many_windows.yaml diff --git a/tests/fixtures/regressions/issue_800_default_size_many_windows.yaml b/tests/fixtures/regressions/issue_800_default_size_many_windows.yaml new file mode 100644 index 00000000000..e18607b3806 --- /dev/null +++ b/tests/fixtures/regressions/issue_800_default_size_many_windows.yaml @@ -0,0 +1,12 @@ +session_name: many-windows-issue +windows: +- window_name: moo + layout: main-horizontal + panes: + - echo hello + - echo hello + - echo hello + - echo hello + - echo hello + - echo hello + - echo hello diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 048dd7e5c7b..bdd9ca4ab02 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -3,15 +3,16 @@ import pathlib import textwrap import time +import typing as t import pytest import kaptan import libtmux -from libtmux import Window from libtmux.common import has_gte_version, has_lt_version from libtmux.test import retry_until, temp_session +from libtmux.window import Window from tmuxp import config, exc from tmuxp.cli.load import load_plugins from tmuxp.workspacebuilder import WorkspaceBuilder @@ -19,6 +20,9 @@ from .constants import EXAMPLE_PATH, FIXTURE_PATH from .fixtures import utils as test_utils +if t.TYPE_CHECKING: + from libtmux.server import Server + def test_split_windows(session): yaml_config = test_utils.read_config_file("workspacebuilder/two_pane.yaml") @@ -1217,3 +1221,78 @@ def is_almost_equal(x, y): assert is_almost_equal(height(panes[0]), height(panes[1])) assert is_almost_equal(width(panes[0]), width(panes[1])) + + +class DefaultSizeNamespaceFixture(t.NamedTuple): + test_id: str + TMUXP_DEFAULT_SIZE: t.Optional[str] + raises: bool + confoverrides: t.Dict[str, t.Any] + + +DEFAULT_SIZE_FIXTURES = [ + DefaultSizeNamespaceFixture( + test_id="v1.13.1 default-size-breaks", + TMUXP_DEFAULT_SIZE=None, + raises=True, + confoverrides={}, + ), + DefaultSizeNamespaceFixture( + test_id="v1.13.1-option-workaround", + TMUXP_DEFAULT_SIZE=None, + raises=False, + confoverrides={"options": {"default-size": "800x600"}}, + ), +] + + +@pytest.mark.parametrize( + DefaultSizeNamespaceFixture._fields, + DEFAULT_SIZE_FIXTURES, + ids=[f.test_id for f in DEFAULT_SIZE_FIXTURES], +) +@pytest.mark.skipif(has_lt_version("2.9"), reason="default-size only applies there") +def test_issue_800_default_size_many_windows( + server: "Server", + monkeypatch: pytest.MonkeyPatch, + test_id: str, + TMUXP_DEFAULT_SIZE: t.Optional[str], + raises: bool, + confoverrides: t.Dict[str, t.Any], +) -> None: + """Recreate default-size issue. + + v1.13.1 added a default-size, but this can break building workspaces with + a lot of panes. + + See also: https://github.com/tmux-python/tmuxp/issues/800 + """ + yaml_config = test_utils.read_config_file( + "regressions/issue_800_default_size_many_windows.yaml" + ) + sconfig = kaptan.Kaptan(handler="yaml") + sconfig = sconfig.import_config(yaml_config).get() + sconfig = config.expand(sconfig) + sconfig = config.trickle(sconfig) + + if isinstance(confoverrides, dict): + for k, v in confoverrides.items(): + sconfig[k] = v + + if TMUXP_DEFAULT_SIZE is not None: + monkeypatch.setenv("TMUXP_DEFAULT_SIZE", TMUXP_DEFAULT_SIZE) + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + + if raises: + with pytest.raises(Exception): + builder.build() + + builder.session.kill_session() + + with pytest.raises(libtmux.exc.LibTmuxException, match="no space for new pane"): + builder.build() + return + + builder.build() + assert len(server.list_sessions()) == 1 From c5693f6d27b2647fe925aa6a324e6928a96271e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 10 Sep 2022 14:06:24 -0500 Subject: [PATCH 3/7] fix(WorkspaceBuilder): Bump default-size higher to prevent spacing issues --- tmuxp/workspacebuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index ec19833b64d..cfd950685b0 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -219,7 +219,7 @@ def build(self, session=None, append=False): if has_gte_version("2.9"): # Use tmux default session size, overwrite Server::new_session - session.set_option("default-size", "80x24") + session.set_option("default-size", "800x600") self.session = session self.server = session.server From d4e4f860e43aece5ba4d3c2d31ae9feb5fa31f32 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 10 Sep 2022 14:07:27 -0500 Subject: [PATCH 4/7] tests(WorkspaceBuilder): Update tests for increased dimensions --- tests/test_workspacebuilder.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index bdd9ca4ab02..72827557a84 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1231,11 +1231,17 @@ class DefaultSizeNamespaceFixture(t.NamedTuple): DEFAULT_SIZE_FIXTURES = [ + DefaultSizeNamespaceFixture( + test_id="default-behavior", + TMUXP_DEFAULT_SIZE=None, + raises=False, + confoverrides={}, + ), DefaultSizeNamespaceFixture( test_id="v1.13.1 default-size-breaks", TMUXP_DEFAULT_SIZE=None, raises=True, - confoverrides={}, + confoverrides={"options": {"default-size": "80x24"}}, ), DefaultSizeNamespaceFixture( test_id="v1.13.1-option-workaround", From 3f745fd442daecb21cf33d6254327b85f80e54c4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 10 Sep 2022 15:35:04 -0500 Subject: [PATCH 5/7] refactor(WorkspaceBuilder): Extract DEFAULT_SIZE for mockability --- tmuxp/workspacebuilder.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index cfd950685b0..e7465ccfe65 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -19,6 +19,10 @@ logger = logging.getLogger(__name__) +DEFAULT_WIDTH = "800" +DEFAULT_HEIGHT = "600" +DEFAULT_SIZE = f"{DEFAULT_WIDTH}x{DEFAULT_HEIGHT}" + class WorkspaceBuilder: @@ -219,7 +223,7 @@ def build(self, session=None, append=False): if has_gte_version("2.9"): # Use tmux default session size, overwrite Server::new_session - session.set_option("default-size", "800x600") + session.set_option("default-size", DEFAULT_SIZE) self.session = session self.server = session.server From d703b65d14fe575407ea1cdba3958017519ab120 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 10 Sep 2022 15:49:31 -0500 Subject: [PATCH 6/7] test(main-horizontal): Fix layout issue The comparison between height of main and other panes isn't true, we should update libtmux to support tmux's new formatters. --- tests/test_workspacebuilder.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 72827557a84..d6c6c20dfbd 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1213,7 +1213,15 @@ def height(p): def width(p): return int(p._info["pane_width"]) - assert height(main_horizontal_pane) > height(panes[0]) + main_horizontal_pane_height = height(main_horizontal_pane) + pane_heights = [height(pane) for pane in panes] + # TODO: When libtmux has new pane formatters added, use that to detect top / bottom + assert all( + main_horizontal_pane_height != pane_height for pane_height in pane_heights + ), "The top row should not be the same size as the bottom row (even though it can)" + assert all( + pane_heights[0] == pane_height for pane_height in pane_heights + ), "The bottom row should be uniform height" assert width(main_horizontal_pane) > width(panes[0]) def is_almost_equal(x, y): From afeb47e92d30548e659fea6989cc868c0592bd8c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 10 Sep 2022 16:34:06 -0500 Subject: [PATCH 7/7] docs(CHANGES): Note changes but this is a bit strange --- CHANGES | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGES b/CHANGES index 0176be6f7ca..3325409ecc9 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,34 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force - Add [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear) (#807) - Add [flake8-comprehensions](https://github.com/adamchainz/flake8-comprehensions) (#808) +## tmuxp 1.13.x (2022-09-10) + +### Bug fixes + +- Layout size has been bumped for those experiencing layout spacing issues + (#809, fixes #800) + + If you encounter issues with pane spacing, consider passing an `option` like + so: + + ```yaml + session_name: main-pane-height + start_directory: "~" + options: + default-size: 999x999 + windows: + - window_name: my window name + layout: main-horizontal + options: + main-pane-height: 30 + panes: + - shell_command: top + - shell_command: top + - shell_command: top + - shell_command: echo "hey" + - shell_command: echo "moo" + ``` + ## tmuxp 1.13.1 (2022-08-21) ### Bug fixes