From dd2c59d2551833a42da1673481c5b8aeeed9c1fa Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 5 Aug 2026 07:16:05 +0530 Subject: [PATCH] autoformat --- kitty/fast_data_types.pyi | 1 - kitty/options/utils.py | 2 +- kitty_tests/mouse.py | 7 +-- kitty_tests/slang.py | 12 +++-- kitty_tests/tab_bar.py | 97 ++++++++++++++++++++++----------------- pyproject.toml | 1 + 6 files changed, 68 insertions(+), 52 deletions(-) diff --git a/kitty/fast_data_types.pyi b/kitty/fast_data_types.pyi index 6524afb01..94f47f90b 100644 --- a/kitty/fast_data_types.pyi +++ b/kitty/fast_data_types.pyi @@ -984,7 +984,6 @@ def parse_input_from_terminal( class Line: def sprite_at(self, cell: int) -> int: ... - def cursor_from(self, x: int, y: int = 0) -> Cursor: ... def test_shape(line: Line, path: Optional[str] = None, index: int = 0) -> List[Tuple[int, int, int, Tuple[int, ...]]]: diff --git a/kitty/options/utils.py b/kitty/options/utils.py index c9b4d537a..57084a3c5 100644 --- a/kitty/options/utils.py +++ b/kitty/options/utils.py @@ -842,7 +842,7 @@ def active_tab_title_template(x: str) -> str | None: def tab_title_wrap(x: str) -> int: - '''no/0 -> 0 (disabled), yes -> -1 (wrap at the tab bar width), N -> wrap at N cells''' + """no/0 -> 0 (disabled), yes -> -1 (wrap at the tab bar width), N -> wrap at N cells""" x = x.lower() if x in ('n', 'no', 'false', 'none'): return 0 diff --git a/kitty_tests/mouse.py b/kitty_tests/mouse.py index c8cd04675..c9c7b6e94 100644 --- a/kitty_tests/mouse.py +++ b/kitty_tests/mouse.py @@ -423,7 +423,8 @@ class TestMouse(BaseTest): # direction gets spent cancelling it instead of scrolling. # The fragment sequences below were captured from a Logitech MX Master 3. from kitty.fast_data_types import test_scale_scroll - self.set_options() # scale_scroll reads wheel_scroll_multiplier + + self.set_options() # scale_scroll reads wheel_scroll_multiplier cell = 40 def run(*v120): @@ -432,7 +433,7 @@ class TestMouse(BaseTest): # on the configured multiplier. return test_scale_scroll([float(v) for v in v120], cell) - down = (-48, -32, -24, -24) # 128 units + down = (-48, -32, -24, -24) # 128 units up = (48, 32, 24, 24) # Five detents down, then one up. Every detent must scroll, including @@ -444,7 +445,7 @@ class TestMouse(BaseTest): # Repeated reversals keep working. res = run(*(down * 2), *(up * 2), *(down * 2)) - self.ae([-2, 2, -2], [sum(res[i:i + 8]) for i in range(0, 24, 8)]) + self.ae([-2, 2, -2], [sum(res[i : i + 8]) for i in range(0, 24, 8)]) # Scrolling in one direction is unaffected: the carry is retained, so a # run of undersized detents still scrolls about one line each. diff --git a/kitty_tests/slang.py b/kitty_tests/slang.py index 4202b1d5c..8412002c6 100644 --- a/kitty_tests/slang.py +++ b/kitty_tests/slang.py @@ -253,7 +253,8 @@ void vsMain() {} self.assertRaises(ValueError, parse_var_directive, ['var', 'uint']) def test_parse_pipeline_definition_vars(self): - p = parse_pipeline_definition(''' + p = parse_pipeline_definition( + """ var uint algo = 1 var float intensity = 0.5 startgroup @@ -263,7 +264,8 @@ void vsMain() {} var uint algo = 2 shaders sample endgroup - '''.splitlines()) + """.splitlines() + ) self.assertEqual(p['vars'], {'algo': ('uint', '1'), 'intensity': ('float', '0.5')}) self.assertEqual(p['groups'][0]['vars'], {}) self.assertEqual(p['groups'][1]['vars'], {'algo': ('uint', '2')}) @@ -278,11 +280,13 @@ void vsMain() {} with tempfile.TemporaryDirectory() as cache_dir: # Clear the lru_cache so the temp cache_dir is actually used clear_caches() - p = parse_pipeline_definition(''' + p = parse_pipeline_definition( + """ startgroup shaders sample sample endgroup - '''.splitlines()) + """.splitlines() + ) try: vert_src, frag_src, metadata = build_custom_shader_pipeline_glsl(p, cache_dir=cache_dir) invocation_tracker = set() diff --git a/kitty_tests/tab_bar.py b/kitty_tests/tab_bar.py index 9b1b33c54..30da8812d 100644 --- a/kitty_tests/tab_bar.py +++ b/kitty_tests/tab_bar.py @@ -99,12 +99,14 @@ class TestTabBar(BaseTest): self.ae(tb.tab_id_at(5, 150), 2) def vertical_tab_bar(self, num_tabs: int = 2, height: int = 160, **opts: object) -> TabBar: - self.set_options({ - 'tab_bar_edge': LEFT_EDGE, - 'tab_bar_style': 'separator', - 'tab_title_template': '{title}', - **opts, - }) + self.set_options( + { + 'tab_bar_edge': LEFT_EDGE, + 'tab_bar_style': 'separator', + 'tab_title_template': '{title}', + **opts, + } + ) central = region(120, 0, 400, height) tab_bar = region(0, 0, 120, height) with ( @@ -143,12 +145,14 @@ class TestTabBar(BaseTest): def test_vertical_tab_bar_mixed_title_heights(self) -> None: # a tab whose title has no newline stays one line tall even when the # limit is higher, so tabs pack according to what they actually use - self.set_options({ - 'tab_bar_edge': LEFT_EDGE, - 'tab_bar_style': 'separator', - 'tab_title_template': '{title}', - 'tab_title_max_lines': 3, - }) + self.set_options( + { + 'tab_bar_edge': LEFT_EDGE, + 'tab_bar_style': 'separator', + 'tab_title_template': '{title}', + 'tab_title_max_lines': 3, + } + ) central = region(120, 0, 400, 160) tab_bar = region(0, 0, 120, 160) with ( @@ -159,11 +163,13 @@ class TestTabBar(BaseTest): ): tb = TabBar(1) tb.layout() - tb.update(( - TabBarData(title='one\ntwo', tab_id=1, is_active=True), - TabBarData(title='solo', tab_id=2), - TabBarData(title='a\nb\nc', tab_id=3), - )) + tb.update( + ( + TabBarData(title='one\ntwo', tab_id=1, is_active=True), + TabBarData(title='solo', tab_id=2), + TabBarData(title='a\nb\nc', tab_id=3), + ) + ) self.ae(self.screen_lines(tb)[:8], ['one', 'two', '', 'solo', '', 'a', 'b', 'c']) self.ae(tuple(te.y for te in tb.tab_extents), (CellRange(0, 1), CellRange(3, 3), CellRange(5, 7))) self.ae(tb.tab_id_at(5, 10), 1) @@ -202,6 +208,7 @@ class TestTabBar(BaseTest): tb = self.vertical_tab_bar(num_tabs=4, height=140) self.ae(self.screen_lines(tb), ['t0', '', 't1', '', 't2', '', 't3']) self.ae(len(tb.tab_extents), 4) + def test_vertical_tab_bar_fills_tab_width(self) -> None: # every line a tab occupies must be padded to the full width of the bar # in that tab's colors, otherwise uneven line lengths leave a ragged edge @@ -293,12 +300,14 @@ class TestTabBar(BaseTest): long_title = 'feature/some-really-long-branch' def tb_with(**opts: object) -> list[str]: - self.set_options({ - 'tab_bar_edge': LEFT_EDGE, - 'tab_bar_style': 'separator', - 'tab_title_template': '{title}', - **opts, - }) + self.set_options( + { + 'tab_bar_edge': LEFT_EDGE, + 'tab_bar_style': 'separator', + 'tab_title_template': '{title}', + **opts, + } + ) central, tab_bar = region(140, 0, 740, 240), region(0, 0, 140, 240) with ( patch('kitty.tab_bar.cell_size_for_window', return_value=(10, 20)), @@ -330,22 +339,22 @@ class TestTabBar(BaseTest): def test_vertical_tab_bar_wrapping_with_newlines(self) -> None: # an explicit newline still breaks the line, and each resulting line is # wrapped independently - tb = self.vertical_tab_bar( - num_tabs=1, height=200, tab_title_max_lines=4, tab_title_wrap=-1, - tab_title_template='a-really-long-first\\nshort') + tb = self.vertical_tab_bar(num_tabs=1, height=200, tab_title_max_lines=4, tab_title_wrap=-1, tab_title_template='a-really-long-first\\nshort') self.ae([line for line in self.screen_lines(tb) if line], ['a-really-lo', 'ng-first', 'short']) def test_vertical_tab_bar_wrapping_overflow(self) -> None: # wrapped tabs are packed by the lines they use, and once they stop # fitting the remainder is replaced by the overflow ellipsis long_title = 'feature/really-long-branch-name' - self.set_options({ - 'tab_bar_edge': LEFT_EDGE, - 'tab_bar_style': 'separator', - 'tab_title_template': '{title}', - 'tab_title_max_lines': 2, - 'tab_title_wrap': -1, - }) + self.set_options( + { + 'tab_bar_edge': LEFT_EDGE, + 'tab_bar_style': 'separator', + 'tab_title_template': '{title}', + 'tab_title_max_lines': 2, + 'tab_title_wrap': -1, + } + ) central, tab_bar = region(140, 0, 740, 100), region(0, 0, 140, 100) with ( patch('kitty.tab_bar.cell_size_for_window', return_value=(10, 20)), @@ -362,14 +371,16 @@ class TestTabBar(BaseTest): def test_vertical_tab_bar_fade_style(self) -> None: # Use fixed colors so every fade cell blends to the same midpoint # colour, making fade cells easy to identify by background. - self.set_options({ - 'tab_bar_edge': LEFT_EDGE, - 'tab_bar_style': 'fade', - 'tab_title_template': '{title}', - 'active_tab_background': Color(200, 0, 0), - 'tab_bar_background': Color(0, 0, 100), - 'tab_fade': (0.5, 0.5, 0.5, 0.5), - }) + self.set_options( + { + 'tab_bar_edge': LEFT_EDGE, + 'tab_bar_style': 'fade', + 'tab_title_template': '{title}', + 'active_tab_background': Color(200, 0, 0), + 'tab_bar_background': Color(0, 0, 100), + 'tab_fade': (0.5, 0.5, 0.5, 0.5), + } + ) central = region(120, 0, 400, 160) tab_bar_r = region(0, 0, 120, 160) with ( @@ -390,14 +401,14 @@ class TestTabBar(BaseTest): def bg(col: int) -> int: return int(s.line(0).cursor_from(col).bg) - tab_bg = bg(4) # title cell: active_tab_background + tab_bg = bg(4) # title cell: active_tab_background fade_bg = bg(0) # leading fade cell: midpoint blend # Sanity: fade colour is distinct from plain tab colour. self.assertNotEqual(tab_bg, fade_bg) # Issue 1: trailing fades flush with the right edge (cols 8–11), not right after the text. - self.ae(bg(6), tab_bg) # col 6, right after 't0', must be plain tab bg + self.ae(bg(6), tab_bg) # col 6, right after 't0', must be plain tab bg self.ae(bg(8), fade_bg) # col 8, fade_start = 12 - 4, must be a fade cell # Issue 2: no background-coloured separator after the trailing fades. diff --git a/pyproject.toml b/pyproject.toml index d59a6e759..5d1a53925 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,3 +46,4 @@ detect-same-package = true [tool.ruff.format] quote-style = 'single' +exclude = ['kitty/options/types.py', 'kitty/options/parse.py']