← pod_r2_v1f

rich_2725

failed NO_PATCH NO_PATCH UNSUBMITTED empty_patch(budget) · 14 tool calls · 309 s · Textualize/rich

Task input

fix table rendering order of box elements

## Type of changes

- [x] Bug fix
- [ ] New feature
- [ ] Documentation / docstrings
- [x] Tests
- [ ] Other

## Checklist

- [x] I've run the latest [black](https://github.com/psf/black) with default args on new code.
- [x] I've updated CHANGELOG.md and CONTRIBUTORS.md where appropriate.
- [x] I've added tests for new code.
- [x] I accept that @willmcgugan may be pedantic in the code review.

## Description

* Previously "mid" box elements appeared in last line of table (footer), while "footer" box elements appeared mid table body. Reversed that order so mid is truly mid, footer is truly footer.
* Tested with:

    ```
    table.box.head_left = '1'
    table.box.head_vertical = '2'
    table.box.head_right = '3'

    table.box.mid_left = '4'
    table.box.mid_vertical = '5'
    table.box.mid_right = '6'

    table.box.foot_left = '7'
    table.box.foot_vertical = '8'
    table.box.foot_right = '9'
    ```

  After change, correct ordering:

    ```
    +--------------------------------------------------------------------------+
    1Date        2Title                            2  Production2    Box Office3
    |------------ --------------------------------- ------------ --------------|
    4Dec 20, 20195Star Wars: The Rise of Skywalker 5$275,000,0005  $375,126,1186
    4May 25, 20185Solo: A Star Wars Story          5$275,000,0005  $393,151,3476
    7Dec 15, 20178Star Wars Ep. VIII: The Last Jedi8$262,000,0008$1,332,539,8899
    +--------------------------------------------------------------------------+
    ```

* All non-skipped prior automated tests pass. No automated tests added. Unclear that additional test for box ordering would add proportionate value.

Tool calls (14)

#ToolArgumentsResult
1run_command
{
 "command": "grep -rn \"table.box\" . | head -20"
}
{"status": "ok", "stdout": "./examples/table_movie.py:172: table.box = box_style\n./rich/box.py:475: table.box = getattr(box, box_name)\n", "stderr": "", "exit_
full
{"status": "ok", "stdout": "./examples/table_movie.py:172:            table.box = box_style\n./rich/box.py:475:        table.box = getattr(box, box_name)\n", "stderr": "", "exit_code": 0}
2run_command
{
 "command": "grep -rn \"mid_left\" . | head -20"
}
{"status": "ok", "stdout": "./rich/box.py:50: self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4)\n./rich/box.py:146: left = self.mid_left\n./rich
full
{"status": "ok", "stdout": "./rich/box.py:50:        self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4)\n./rich/box.py:146:            left = self.mid_left\n./rich/table.py:784:                    _Segment(_box.mid_left, border_style),\n./rich/panel.py:226:        line_start = Segment(box.mid_left, border_style)\n", "stderr": "", "exit_code": 0}
3run_command
{
 "command": "grep -n \"mid_left\" rich/table.py"
}
{"status": "ok", "stdout": "784: _Segment(_box.mid_left, border_style),\n", "stderr": "", "exit_code": 0}
full
{"status": "ok", "stdout": "784:                    _Segment(_box.mid_left, border_style),\n", "stderr": "", "exit_code": 0}
4run_command
{
 "command": "sed -n '700,850p' rich/table.py"
}
{"status": "ok", "stdout": "\n def _measure_column(\n self,\n console: \"Console\",\n options: \"ConsoleOptions\",\n column: Column,\n ) -> Measurement:\n \"\"\
full
{"status": "ok", "stdout": "\n    def _measure_column(\n        self,\n        console: \"Console\",\n        options: \"ConsoleOptions\",\n        column: Column,\n    ) -> Measurement:\n        \"\"\"Get the minimum and maximum width of the column.\"\"\"\n\n        max_width = options.max_width\n        if max_width < 1:\n            return Measurement(0, 0)\n\n        padding_width = self._get_padding_width(column._index)\n\n        if column.width is not None:\n            # Fixed width column\n            return Measurement(\n                column.width + padding_width, column.width + padding_width\n            ).with_maximum(max_width)\n        # Flexible column, we need to measure contents\n        min_widths: List[int] = []\n        max_widths: List[int] = []\n        append_min = min_widths.append\n        append_max = max_widths.append\n        get_render_width = Measurement.get\n        for cell in self._get_cells(console, column._index, column):\n            _min, _max = get_render_width(console, options, cell.renderable)\n            append_min(_min)\n            append_max(_max)\n\n        measurement = Measurement(\n            max(min_widths) if min_widths else 1,\n            max(max_widths) if max_widths else max_width,\n        ).with_maximum(max_width)\n        measurement = measurement.clamp(\n            None if column.min_width is None else column.min_width + padding_width,\n            None if column.max_width is None else column.max_width + padding_width,\n        )\n        return measurement\n\n    def _render(\n        self, console: \"Console\", options: \"ConsoleOptions\", widths: List[int]\n    ) -> \"RenderResult\":\n        table_style = console.get_style(self.style or \"\")\n\n        border_style = table_style + console.get_style(self.border_style or \"\")\n        _column_cells = (\n            self._get_cells(console, column_index, column)\n            for column_index, column in enumerate(self.columns)\n        )\n        row_c
5-6 ×2run_command
{
 "command": "sed -n '760,810p' rich/table.py"
}
{"status": "ok", "stdout": "\n new_line = Segment.line()\n\n columns = self.columns\n show_header = self.show_header\n show_footer = self.show_footer\n show_edg
full
{"status": "ok", "stdout": "\n        new_line = Segment.line()\n\n        columns = self.columns\n        show_header = self.show_header\n        show_footer = self.show_footer\n        show_edge = self.show_edge\n        show_lines = self.show_lines\n        leading = self.leading\n\n        _Segment = Segment\n        if _box:\n            box_segments = [\n                (\n                    _Segment(_box.head_left, border_style),\n                    _Segment(_box.head_right, border_style),\n                    _Segment(_box.head_vertical, border_style),\n                ),\n                (\n                    _Segment(_box.foot_left, border_style),\n                    _Segment(_box.foot_right, border_style),\n                    _Segment(_box.foot_vertical, border_style),\n                ),\n                (\n                    _Segment(_box.mid_left, border_style),\n                    _Segment(_box.mid_right, border_style),\n                    _Segment(_box.mid_vertical, border_style),\n                ),\n            ]\n            if show_edge:\n                yield _Segment(_box.get_top(widths), border_style)\n                yield new_line\n        else:\n            box_segments = []\n\n        get_row_style = self.get_row_style\n        get_style = console.get_style\n\n        for index, (first, last, row_cell) in enumerate(loop_first_last(row_cells)):\n            header_row = first and show_header\n            footer_row = last and show_footer\n            row = (\n                self.rows[index - show_header]\n                if (not header_row and not footer_row)\n                else None\n            )\n            max_height = 1\n            cells: List[List[List[Segment]]] = []\n            if header_row or footer_row:\n                row_style = Style.null()\n            else:\n", "stderr": "", "exit_code": 0}
7run_command
{
 "command": "python3 - <<'PY'\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.box import Box\n\nconsole = Console(force_terminal=True)\ntable = Table(show_header=True, show_footer=True)\n\n# Custom box characters to verify ordering\nclass CustomBox(Box):\n    head_left = '1'\n    head_vertical = '2'\n    head_right = '3'\n    mid_left = '4'\n    mid_vertical = '5'\n    mid_right = '6'\n    foot_left = '7'\n    foot_vertical = '8'\n    foot_right = '9'\n    top = 'T'\n    bottom = 'B'\n\ntable.box = CustomBox()\ntable.add_column(\"Date\")\ntable.add_column(\"Title\")\ntable.add_column(\"Production\")\ntable.add_column(\"Box Office\")\n\ntable.add_row(\"Dec 20, 2019\", \"Star Wars: The Rise of Skywalker\", \"$275,000,000\", \"$375,126,118\")\ntable.add_row(\"May 25, 2018\", \"Solo: A Star Wars Story\", \"$275,000,000\", \"$393,151,347\")\ntable.add_row(\"Dec 15, 2017\", \"Star Wars Ep. VIII: The Last Jedi\", \"$262,000,000\", \"$1,332,539,889\")\n\n# We need to add a footer row to see the footer box elements\n# Table.add_section() or just adding rows. \n# Actually, the problem description says \"footer\" box elements appeared mid table body.\n# In rich.table, the footer is rendered if show_footer=True and there are footer rows.\n# Let's see how to add a footer.\ntable.add_section()\ntable.add_row(\"Footer 1\", \"Footer 2\", \"Footer 3\", \"Footer 4\")\n\nconsole.print(table)\nPY\n"
}
{"status": "error", "error_type": "CommandError", "error_message": "Traceback (most recent call last):\n File \"<stdin>\", line 22, in <module>\nTypeError: Box.
full
{"status": "error", "error_type": "CommandError", "error_message": "Traceback (most recent call last):\n  File \"<stdin>\", line 22, in <module>\nTypeError: Box.__init__() missing 1 required positional argument: 'box'\n", "details": {"stdout": "", "stderr": "Traceback (most recent call last):\n  File \"<stdin>\", line 22, in <module>\nTypeError: Box.__init__() missing 1 required positional argument: 'box'\n", "exit_code": 1}}
8run_command
{
 "command": "python3 - <<'PY'\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.box import Box\n\nconsole = Console(force_terminal=True)\ntable = Table(show_header=True, show_footer=True)\n\n# Custom box characters to verify ordering\nclass CustomBox(Box):\n    def __init__(self):\n        # Box.__init__ expects a tuple of strings or something. \n        # Let's look at Box definition.\n        pass\n\n# Actually, let's just use the attributes on the instance if possible, \n# or just create a Box instance and modify it.\nbox = Box()\nbox.head_left = '1'\nbox.head_vertical = '2'\nbox.head_right = '3'\nbox.mid_left = '4'\nbox.mid_vertical = '5'\nbox.mid_right = '6'\nbox.foot_left = '7'\nbox.foot_vertical = '8'\nbox.foot_right = '9'\n\ntable.box = box\ntable.add_column(\"Date\")\ntable.add_column(\"Title\")\ntable.add_column(\"Production\")\ntable.add_column(\"Box Office\")\n\ntable.add_row(\"Dec 20, 2019\", \"Star Wars: The Rise of Skywalker\", \"$275,000,000\", \"$375,126,118\")\ntable.add_row(\"May 25, 2018\", \"Solo: A Star Wars Story\", \"$275,000,000\", \"$393,151,347\")\ntable.add_row(\"Dec 15, 2017\", \"Star Wars Ep. VIII: The Last Jedi\", \"$262,000,000\", \"$1,332,539,889\")\n\n# To have a footer, we need to add a footer row.\n# In rich.table, footer rows are added via add_row after add_section() if it's the last section? \n# No, Table has a separate way to handle footers if show_footer=True.\n# Actually, Table.add_row adds to the current section.\n# Let's check how Table handles footers.\n# Looking at rich/table.py, it seems it uses loop_first_last(row_cells).\n# row_cells is zip(*_column_cells).\n# _column_cells is (self._get_cells(console, column_index, column) for column_index, column in enumerate(self.columns))\n# _get_cells yields cells.\n# Let's see _get_cells in rich/table.py.\nPY\n"
}
{"status": "error", "error_type": "CommandError", "error_message": "Traceback (most recent call last):\n File \"<stdin>\", line 17, in <module>\nTypeError: Box.
full
{"status": "error", "error_type": "CommandError", "error_message": "Traceback (most recent call last):\n  File \"<stdin>\", line 17, in <module>\nTypeError: Box.__init__() missing 1 required positional argument: 'box'\n", "details": {"stdout": "", "stderr": "Traceback (most recent call last):\n  File \"<stdin>\", line 17, in <module>\nTypeError: Box.__init__() missing 1 required positional argument: 'box'\n", "exit_code": 1}}
9run_command
{
 "command": "grep -n \"class Box\" rich/box.py"
}
{"status": "ok", "stdout": "16:class Box:\n", "stderr": "", "exit_code": 0}
full
{"status": "ok", "stdout": "16:class Box:\n", "stderr": "", "exit_code": 0}
10run_command
{
 "command": "sed -n '16,50p' rich/box.py"
}
{"status": "ok", "stdout": "class Box:\n \"\"\"Defines characters to render boxes.\n\n \u250c\u2500\u252c\u2510 top\n \u2502 \u2502\u2502 head\n \u251c\u2500\u2
full
{"status": "ok", "stdout": "class Box:\n    \"\"\"Defines characters to render boxes.\n\n    \u250c\u2500\u252c\u2510 top\n    \u2502 \u2502\u2502 head\n    \u251c\u2500\u253c\u2524 head_row\n    \u2502 \u2502\u2502 mid\n    \u251c\u2500\u253c\u2524 row\n    \u251c\u2500\u253c\u2524 foot_row\n    \u2502 \u2502\u2502 foot\n    \u2514\u2500\u2534\u2518 bottom\n\n    Args:\n        box (str): Characters making up box.\n        ascii (bool, optional): True if this box uses ascii characters only. Default is False.\n    \"\"\"\n\n    def __init__(self, box: str, *, ascii: bool = False) -> None:\n        self._box = box\n        self.ascii = ascii\n        line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines()\n        # top\n        self.top_left, self.top, self.top_divider, self.top_right = iter(line1)\n        # head\n        self.head_left, _, self.head_vertical, self.head_right = iter(line2)\n        # head_row\n        (\n            self.head_row_left,\n            self.head_row_horizontal,\n            self.head_row_cross,\n            self.head_row_right,\n        ) = iter(line3)\n\n        # mid\n        self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4)\n", "stderr": "", "exit_code": 0}
11run_command
{
 "command": "python3 - <<'PY'\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.box import Box\n\nconsole = Console(force_terminal=True)\ntable = Table(show_header=True, show_footer=True)\n\n# Create a Box instance with a custom string.\n# The Box.__init__ expects a string with 8 lines.\ncustom_box_str = (\n    \"T T T T\\n\" # top\n    \"1 2 2 3\\n\" # head\n    \"H H H H\\n\" # head_row\n    \"4 5 5 6\\n\" # mid\n    \"R R R R\\n\" # row\n    \"F F F F\\n\" # foot_row\n    \"7 8 8 9\\n\" # foot\n    \"B B B B\"   # bottom\n)\nbox = Box(custom_box_str)\n\ntable.box = box\ntable.add_column(\"Date\")\ntable.add_column(\"Title\")\ntable.add_column(\"Production\")\ntable.add_column(\"Box Office\")\n\ntable.add_row(\"Dec 20, 2019\", \"Star Wars: The Rise of Skywalker\", \"$275,000,000\", \"$375,126,118\")\ntable.add_row(\"May 25, 2018\", \"Solo: A Star Wars Story\", \"$275,000,000\", \"$393,151,347\")\ntable.add_row(\"Dec 15, 2017\", \"Star Wars Ep. VIII: The Last Jedi\", \"$262,000,000\", \"$1,332,539,889\")\n\n# To test footer, we need to add a footer. \n# Looking at Table._get_cells, it seems it just yields all cells.\n# The footer is determined by loop_first_last(row_cells).\n# If we have 3 rows, first is row 0, last is row 2.\n# If show_header=True, row 0 is header.\n# If show_footer=True, row 2 is footer.\n# So we need at least 3 rows to have header, body, and footer.\n# Wait, if we have 3 rows:\n# index 0: first=True, last=False -> header_row=True\n# index 1: first=False, last=False -> body row\n# index 2: first=False, last=True -> footer_row=True\n\nconsole.print(table)\nPY\n"
}
{"status": "error", "error_type": "CommandError", "error_message": "Traceback (most recent call last):\n File \"<stdin>\", line 20, in <module>\n File \"/privat
full
{"status": "error", "error_type": "CommandError", "error_message": "Traceback (most recent call last):\n  File \"<stdin>\", line 20, in <module>\n  File \"/private/workspace/rich/box.py\", line 38, in __init__\n    self.top_left, self.top, self.top_divider, self.top_right = iter(line1)\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nValueError: too many values to unpack (expected 4)\n", "details": {"stdout": "", "stderr": "Traceback (most recent call last):\n  File \"<stdin>\", line 20, in <module>\n  File \"/private/workspace/rich/box.py\", line 38, in __init__\n    self.top_left, self.top, self.top_divider, self.top_right = iter(line1)\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nValueError: too many values to unpack (expected 4)\n", "exit_code": 1}}
12run_command
{
 "command": "python3 - <<'PY'\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.box import Box\n\nconsole = Console(force_terminal=True)\ntable = Table(show_header=True, show_footer=True)\n\n# Each line must have exactly 4 characters (or be unpacked into 4).\n# The Box.__init__ does: self.top_left, self.top, self.top_divider, self.top_right = iter(line1)\n# So line1 must have 4 characters.\ncustom_box_str = (\n    \"TTTT\\n\" # top\n    \"1223\\n\" # head\n    \"HHHH\\n\" # head_row\n    \"4556\\n\" # mid\n    \"RRRR\\n\" # row\n    \"FFFF\\n\" # foot_row\n    \"7889\\n\" # foot\n    \"BBBB\"   # bottom\n)\nbox = Box(custom_box_str)\n\ntable.box = box\ntable.add_column(\"Date\")\ntable.add_column(\"Title\")\ntable.add_column(\"Production\")\ntable.add_column(\"Box Office\")\n\ntable.add_row(\"Dec 20, 2019\", \"Star Wars: The Rise of Skywalker\", \"$275,000,000\", \"$375,126,118\")\ntable.add_row(\"May 25, 2018\", \"Solo: A Star Wars Story\", \"$275,000,000\", \"$393,151,347\")\ntable.add_row(\"Dec 15, 2017\", \"Star Wars Ep. VIII: The Last Jedi\", \"$262,000,000\", \"$1,332,539,889\")\n\nconsole.print(table)\nPY\n"
}
{"status": "ok", "stdout": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n1 Date 2 Title 2 Production 2 Box Office 3\nHHHHHH
full
{"status": "ok", "stdout": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n1 Date         2 Title                         2 Production   2 Box Office     3\nHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\n7 Dec 20, 2019 8 Star Wars: The Rise of        8 $275,000,000 8 $375,126,118   9\n7              8 Skywalker                     8              8                9\n7 May 25, 2018 8 Solo: A Star Wars Story       8 $275,000,000 8 $393,151,347   9\n7 Dec 15, 2017 8 Star Wars Ep. VIII: The Last  8 $262,000,000 8 $1,332,539,889 9\n7              8 Jedi                          8              8                9\nFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n4              5                               5              5                6\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n", "stderr": "", "exit_code": 0}
13run_command
{
 "command": "python3 - <<'PY'\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.box import Box\n\nconsole = Console(force_terminal=True)\ntable = Table(show_header=True, show_footer=True)\n\ncustom_box_str = (\n    \"TTTT\\n\" # top\n    \"1223\\n\" # head\n    \"HHHH\\n\" # head_row\n    \"4556\\n\" # mid\n    \"RRRR\\n\" # row\n    \"FFFF\\n\" # foot_row\n    \"7889\\n\" # foot\n    \"BBBB\"   # bottom\n)\nbox = Box(custom_box_str)\n\ntable.box = box\ntable.add_column(\"Date\")\ntable.add_column(\"Title\")\ntable.add_column(\"Production\")\ntable.add_column(\"Box Office\")\n\ntable.add_row(\"Dec 20, 2019\", \"Star Wars: The Rise of Skywalker\", \"$275,000,000\", \"$375,126,118\")\ntable.add_row(\"May 25, 2018\", \"Solo: A Star Wars Story\", \"$275,000,000\", \"$393,151,347\")\ntable.add_row(\"Dec 15, 2017\", \"Star Wars Ep. VIII: The Last Jedi\", \"$262,000,000\", \"$1,332,539,889\")\n\nconsole.print(table)\nPY\n"
}
{"status": "ok", "stdout": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n1 Date 2 Title 2 Production 2 Box Office 3\nHHHHHH
full
{"status": "ok", "stdout": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n1 Date         2 Title                         2 Production   2 Box Office     3\nHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\n7 Dec 20, 2019 8 Star Wars: The Rise of        8 $275,000,000 8 $375,126,118   9\n7              8 Skywalker                     8              8                9\n7 May 25, 2018 8 Solo: A Star Wars Story       8 $275,000,000 8 $393,151,347   9\n7 Dec 15, 2017 8 Star Wars Ep. VIII: The Last  8 $262,000,000 8 $1,332,539,889 9\n7              8 Jedi                          8              8                9\nFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n4              5                               5              5                6\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n", "stderr": "", "exit_code": 0}
14run_command
{
 "command": "python3 - <<'PY'\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.box import Box\n\nconsole = Console(force_terminal=True)\ntable = Table(show_header=True, show_footer=True)\n\ncustom_box_str = (\n    \"TTTT\\n\" # top\n    \"1223\\n\" # head\n    \"HHHH\\n\" # head_row\n    \"4556\\n\" # mid\n    \"RRRR\\n\" # row\n    \"FFFF\\n\" # foot_row\n    \"7889\\n\" # foot\n    \"BBBB\"   # bottom\n)\nbox = Box(custom_box_str)\n\ntable.box = box\ntable.add_column(\"Date\")\ntable.add_column(\"Title\")\ntable.add_column(\"Production\")\ntable.add_column(\"Box Office\")\n\n# We need a body row and a footer row.\n# In rich.table, if show_footer=True, the last row is treated as footer.\n# If we have 3 rows:\n# Row 0: Header\n# Row 1: Body\n# Row 2: Footer\ntable.add_row(\"Dec 20, 2019\", \"Star Wars: The Rise of Skywalker\", \"$275,000,000\", \"$375,126,118\")\ntable.add_row(\"May 25, 2018\", \"Solo: A Star Wars Story\", \"$275,000,000\", \"$393,151,347\")\ntable.add_row(\"Dec 15, 2017\", \"Star Wars Ep. VIII: The Last Jedi\", \"$262,000,000\", \"$1,332,539,889\")\n\nconsole.print(table)\nPY\n"
}
{"status": "ok", "stdout": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n1 Date 2 Title 2 Production 2 Box Office 3\nHHHHHH
full
{"status": "ok", "stdout": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n1 Date         2 Title                         2 Production   2 Box Office     3\nHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\n7 Dec 20, 2019 8 Star Wars: The Rise of        8 $275,000,000 8 $375,126,118   9\n7              8 Skywalker                     8              8                9\n7 May 25, 2018 8 Solo: A Star Wars Story       8 $275,000,000 8 $393,151,347   9\n7 Dec 15, 2017 8 Star Wars Ep. VIII: The Last  8 $262,000,000 8 $1,332,539,889 9\n7              8 Jedi                          8              8                9\nFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n4              5                               5              5                6\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n", "stderr": "", "exit_code": 0}