Repository: Textualize/rich
Pull request #2544 (2022-09-23 14:22:15)

sections docs and test
Added `Table.add_section` to add a new section.

Fixes https://github.com/Textualize/rich/issues/2478
Fixes https://github.com/Textualize/rich/issues/2477
Fixes https://github.com/Textualize/rich/issues/2476


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 314c1b1c..c21439d9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Allow a `max_depth` argument to be passed to the `install()` hook https://github.com/Textualize/rich/issues/2486
 - Document using `None` as name in `__rich_repr__` for tuple positional args https://github.com/Textualize/rich/pull/2379
 - Add `font_aspect_ratio` parameter in SVG export https://github.com/Textualize/rich/pull/2539/files
+- Added `Table.add_section` method. https://github.com/Textualize/rich/pull/2544
 
 ### Fixed
 
diff --git a/docs/source/tables.rst b/docs/source/tables.rst
index 9cebe60c..c4a1b791 100644
--- a/docs/source/tables.rst
+++ b/docs/source/tables.rst
@@ -96,7 +96,7 @@ Lines
 
 By default, Tables will show a line under the header only. If you want to show lines between all rows add ``show_lines=True`` to the constructor.
 
-You can also force a line on the next row by setting ``end_section=True`` on the call to ``add_row()``.
+You can also force a line on the next row by setting ``end_section=True`` on the call to :meth:`~rich.table.Table.add_row`, or by calling the :meth:`~rich.table.Table.add_section` to add a line between the current and subsequent rows.
 
 
 Empty Tables
diff --git a/rich/table.py b/rich/table.py
index 9d067ba5..578d3d63 100644
--- a/rich/table.py
+++ b/rich/table.py
@@ -462,6 +462,12 @@ class Table(JupyterMixin):
                 )
         self.rows.append(Row(style=style, end_section=end_section))
 
+    def add_section(self) -> None:
+        """Add a new section (draw a line after current row)."""
+
+        if self.rows:
+            self.rows[-1].end_section = True
+
     def __rich_console__(
         self, console: "Console", options: "ConsoleOptions"
     ) -> "RenderResult":


Test patch:
diff --git a/tests/test_table.py b/tests/test_table.py
index e376e167..4faf9d53 100644
--- a/tests/test_table.py
+++ b/tests/test_table.py
@@ -209,6 +209,32 @@ def test_table_show_header_false_substitution(box, result):
     assert output == result
 
 
+def test_section():
+    table = Table("foo")
+    table.add_section()  # Null-op
+    table.add_row("row1")
+    table.add_row("row2", end_section=True)
+    table.add_row("row3")
+    table.add_row("row4")
+    table.add_section()
+    table.add_row("row5")
+    table.add_section()  # Null-op
+
+    console = Console(
+        width=80,
+        force_terminal=True,
+        color_system="truecolor",
+        legacy_windows=False,
+        record=True,
+    )
+    console.print(table)
+    output = console.export_text()
+    print(repr(output))
+    expected = "┏━━━━━━┓\n┃ foo  ┃\n┡━━━━━━┩\n│ row1 │\n│ row2 │\n├──────┤\n│ row3 │\n│ row4 │\n├──────┤\n│ row5 │\n└──────┘\n"
+
+    assert output == expected
+
+
 if __name__ == "__main__":
     render = render_tables()
     print(render)