From cabc19f85ad48220ef80ea53c31c0721d8e25f48 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 1 Dec 2025 04:46:04 -0300 Subject: [PATCH 1/2] Fix table padding calculation for first column (#3871) The _get_padding_width() method was not considering the pad_edge setting, causing inconsistency between width calculation and actual rendering. When pad_edge=False, the first column was sized with full padding but rendered without left padding, resulting in misaligned tables. This fix adds pad_edge logic to _get_padding_width() to ensure consistency between measurement and rendering. Changes: - Updated _get_padding_width() to respect pad_edge setting - Added logic to exclude left padding for first column when pad_edge=False - Added logic to exclude right padding for last column when pad_edge=False - Updated test_columns.py expected output to reflect corrected behavior Fixes #3871 --- CHANGELOG.md | 4 ++++ CONTRIBUTORS.md | 1 + rich/table.py | 16 +++++++++++++--- tests/test_columns.py | 2 +- tests/test_table.py | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e53205666f..cab7396ea7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [14.2.0] - 2025-10-09 +### Fixed + +- Fixed padding calculation in `Table` for first column when `pad_edge=False` [(#3871)](https://github.com/Textualize/rich/issues/3871) + ### Changed - Python3.14 compatibility https://github.com/Textualize/rich/pull/3861 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4b04786b9c..9f451daa5b 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -94,3 +94,4 @@ The following people have contributed to the development of Rich: - [Jonathan Helmus](https://github.com/jjhelmus) - [Brandon Capener](https://github.com/bcapener) - [Alex Zheng](https://github.com/alexzheng111) +- [Guilherme Braga](https://github.com/zephyr-i) diff --git a/rich/table.py b/rich/table.py index 942175dc3a..ab44f67fc5 100644 --- a/rich/table.py +++ b/rich/table.py @@ -699,9 +699,19 @@ def get_padding(first_row: bool, last_row: bool) -> Tuple[int, int, int, int]: def _get_padding_width(self, column_index: int) -> int: """Get extra width from padding.""" _, pad_right, _, pad_left = self.padding - if self.collapse_padding: - if column_index > 0: - pad_left = max(0, pad_left - pad_right) + + first_column = column_index == 0 + last_column = column_index == len(self.columns) - 1 + + if self.collapse_padding and not first_column: + pad_left = max(0, pad_left - pad_right) + + if not self.pad_edge: + if first_column: + pad_left = 0 + if last_column: + pad_right = 0 + return pad_left + pad_right def _measure_column( diff --git a/tests/test_columns.py b/tests/test_columns.py index 1b167f4acb..ce292cad62 100644 --- a/tests/test_columns.py +++ b/tests/test_columns.py @@ -62,7 +62,7 @@ def render(): def test_render(): - expected = "────────────────────────────────────────────── empty ───────────────────────────────────────────────\n───────────────────────────────────────────── optimal ──────────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n───────────────────────────────────────── optimal, expand ──────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n────────────────────────────────────── column first, optimal ───────────────────────────────────────\nUrsus americanus American marten Scolopax minor Ant \nAmerican buffalo Martes americana Anaconda (unidentified) Anteater, australian spiny\nBison bison American racer Eunectes sp. Tachyglossus aculeatus \nAmerican crow Coluber constrictor Andean goose Anteater, giant \nCorvus brachyrhynchos American woodcock Chloephaga melanoptera Myrmecophaga tridactyla \n─────────────────────────────────── column first, right to left ────────────────────────────────────\nAnt Scolopax minor American marten Ursus americanus \nAnteater, australian spiny Anaconda (unidentified) Martes americana American buffalo \nTachyglossus aculeatus Eunectes sp. American racer Bison bison \nAnteater, giant Andean goose Coluber constrictor American crow \nMyrmecophaga tridactyla Chloephaga melanoptera American woodcock Corvus brachyrhynchos\n────────────────────────────────────── equal columns, expand ───────────────────────────────────────\nChloephaga melanoptera American racer Ursus americanus \nAnt Coluber constrictor American buffalo \nAnteater, australian spiny American woodcock Bison bison \nTachyglossus aculeatus Scolopax minor American crow \nAnteater, giant Anaconda (unidentified) Corvus brachyrhynchos \nMyrmecophaga tridactyla Eunectes sp. American marten \n Andean goose Martes americana \n─────────────────────────────────────────── fixed width ────────────────────────────────────────────\nAnteater, Eunectes sp. Coluber Corvus Ursus americanus \naustralian spiny constrictor brachyrhynchos \nTachyglossus Andean goose American American marten American buffalo \naculeatus woodcock \nAnteater, giant Chloephaga Scolopax minor Martes americana Bison bison \n melanoptera \nMyrmecophaga Ant Anaconda American racer American crow \ntridactyla (unidentified) \n\n" + expected = "────────────────────────────────────────────── empty ───────────────────────────────────────────────\n───────────────────────────────────────────── optimal ──────────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n───────────────────────────────────────── optimal, expand ──────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n────────────────────────────────────── column first, optimal ───────────────────────────────────────\nUrsus americanus American marten Scolopax minor Ant \nAmerican buffalo Martes americana Anaconda (unidentified) Anteater, australian spiny\nBison bison American racer Eunectes sp. Tachyglossus aculeatus \nAmerican crow Coluber constrictor Andean goose Anteater, giant \nCorvus brachyrhynchos American woodcock Chloephaga melanoptera Myrmecophaga tridactyla \n─────────────────────────────────── column first, right to left ────────────────────────────────────\nAnt Scolopax minor American marten Ursus americanus \nAnteater, australian spiny Anaconda (unidentified) Martes americana American buffalo \nTachyglossus aculeatus Eunectes sp. American racer Bison bison \nAnteater, giant Andean goose Coluber constrictor American crow \nMyrmecophaga tridactyla Chloephaga melanoptera American woodcock Corvus brachyrhynchos\n────────────────────────────────────── equal columns, expand ───────────────────────────────────────\nChloephaga melanoptera American racer Ursus americanus \nAnt Coluber constrictor American buffalo \nAnteater, australian spiny American woodcock Bison bison \nTachyglossus aculeatus Scolopax minor American crow \nAnteater, giant Anaconda (unidentified) Corvus brachyrhynchos \nMyrmecophaga tridactyla Eunectes sp. American marten \n Andean goose Martes americana \n─────────────────────────────────────────── fixed width ────────────────────────────────────────────\nAnteater, Eunectes sp. Coluber Corvus Ursus americanus\naustralian spiny constrictor brachyrhynchos \nTachyglossus Andean goose American American marten American buffalo\naculeatus woodcock \nAnteater, giant Chloephaga Scolopax minor Martes americana Bison bison \n melanoptera \nMyrmecophaga Ant Anaconda American racer American crow \ntridactyla (unidentified) \n\n" assert render() == expected diff --git a/tests/test_table.py b/tests/test_table.py index 8767283c56..2bf2730559 100644 --- a/tests/test_table.py +++ b/tests/test_table.py @@ -382,6 +382,38 @@ def test_columns_highlight_added_by_add_row() -> None: assert output == expected +def test_padding_width_calculation(): + """Test _get_padding_width with various configurations (Issue #3871).""" + from rich.table import Table + + # Test with pad_edge=False (bug case) + table = Table(padding=(0, 1), pad_edge=False) + table.add_column("A") + table.add_column("B") + table.add_column("C") + + assert table._get_padding_width(0) == 1, "First column: left=0, right=1" + + assert table._get_padding_width(1) == 2, "Middle column: left=1, right=1" + + assert table._get_padding_width(2) == 1, "Last column: left=1, right=0" + + +def test_padding_width_with_collapse(): + """Test _get_padding_width with collapse_padding=True (Issue #3871).""" + from rich.table import Table + + table = Table(padding=(0, 1), collapse_padding=True, pad_edge=False) + table.add_column("A") + table.add_column("B") + table.add_column("C") + + assert table._get_padding_width(0) == 1, "First: left=0, right=1" + + assert table._get_padding_width(1) == 1, "Middle: left=0 (collapsed), right=1" + + assert table._get_padding_width(2) == 0, "Last: left=0 (collapsed), right=0 (edge)" + if __name__ == "__main__": render = render_tables() print(render) From a72748928a4218842d31b82bc04992a3c9037a3c Mon Sep 17 00:00:00 2001 From: Guilherme Braga Date: Mon, 1 Dec 2025 05:03:49 -0300 Subject: [PATCH 2/2] Formatting changes after running Black. --- tests/test_table.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_table.py b/tests/test_table.py index 2bf2730559..2443649869 100644 --- a/tests/test_table.py +++ b/tests/test_table.py @@ -414,6 +414,7 @@ def test_padding_width_with_collapse(): assert table._get_padding_width(2) == 0, "Last: left=0 (collapsed), right=0 (edge)" + if __name__ == "__main__": render = render_tables() print(render)