From 48a9b494c2c695e0835206761f2b458e81acef88 Mon Sep 17 00:00:00 2001 From: Barret Schloerke Date: Tue, 21 May 2024 16:48:34 -0400 Subject: [PATCH 1/2] deprecate `.input_cell_selection()` in favor of `.cell_selection()` --- CHANGELOG.md | 6 +- examples/dataframe/app.py | 2 +- shiny/render/_data_frame.py | 39 ++++++---- .../shiny/bugs/0676-row-selection/app.py | 2 +- .../bugs/1345-render-data-frame-input/app.py | 2 +- .../shiny/components/data_frame/edit/app.py | 2 +- .../html_columns_df/df_organization/app.py | 2 +- .../df_organization/test_df_organization.py | 72 +++++++++---------- .../data_frame/row_selection/app.py | 2 +- 9 files changed, 74 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb689a8ce..b536002c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [UNRELEASED] +### Deprecations + +* `@render.data_frame`'s method `.input_cell_selection()` has been renamed to `.cell_selection()`. Please use `.cell_selection()` and consider `.input_cell_selection()` deprecated. (TODO) + ### `input` key changes -* Restored `@render.data_frame`'s (prematurely removed in v0.9.0) input value `input._selected_rows()`. Please use `.input_cell_selection()["rows"]` and consider `input._selected_rows()` deprecated. (#1345, #1377) +* Restored `@render.data_frame`'s (prematurely removed in v0.9.0) input value `input._selected_rows()`. Please use `.cell_selection()["rows"]` and consider `input._selected_rows()` deprecated. (#1345, #1377) * `@render.data_frame`'s input value `input._data_view_indices` has been renamed to `input._data_view_rows` for consistent naming. Please use `input._data_view_rows` and consider `input._data_view_indices` deprecated. (#1377) diff --git a/examples/dataframe/app.py b/examples/dataframe/app.py index dbf5c8c5f..c7c1970e9 100644 --- a/examples/dataframe/app.py +++ b/examples/dataframe/app.py @@ -99,7 +99,7 @@ def handle_edit(): @render.text def detail(): - selected_rows = (grid.input_cell_selection() or {}).get("rows", ()) + selected_rows = (grid.cell_selection() or {}).get("rows", ()) if len(selected_rows) > 0: # "split", "records", "index", "columns", "values", "table" return df().iloc[list(selected_rows)] diff --git a/shiny/render/_data_frame.py b/shiny/render/_data_frame.py index 308f2a83c..2badf8369 100644 --- a/shiny/render/_data_frame.py +++ b/shiny/render/_data_frame.py @@ -133,7 +133,7 @@ class data_frame(Renderer[DataFrameResult]): Row selection ------------- When using the row selection feature, you can access the selected rows by using the - `.input_cell_selection()` method, where `` + `.cell_selection()` method, where `` is the render function name that corresponds with the `id=` used in :func:`~shiny.ui.outout_data_frame`. Internally, this method retrieves the selected cell information from session's `input._cell_selection()` value. The value @@ -281,11 +281,11 @@ def data_view(self, *, selected: bool = False) -> pd.DataFrame: Reactive value of the data frame's possible selection modes. """ - input_cell_selection: reactive.Calc_[CellSelection | None] + cell_selection: reactive.Calc_[CellSelection | None] """ Reactive value of selected cell information. - This method is a wrapper around `input._selected_cells()`, where `` is + This method is a wrapper around `input._cell_selection()`, where `` is the `id` of the data frame output. This method returns the selected rows and will cause reactive updates as the selected rows change. @@ -364,21 +364,21 @@ def self_selection_modes() -> SelectionModes: self.selection_modes = self_selection_modes @reactive.calc - def self_input_cell_selection() -> CellSelection | None: - browser_cell_selection_input = self._get_session().input[ + def self_cell_selection() -> CellSelection | None: + browser_cell_selection = self._get_session().input[ f"{self.output_id}_cell_selection" ]() - browser_cell_selection = as_cell_selection( - browser_cell_selection_input, + cell_selection = as_cell_selection( + browser_cell_selection, selection_modes=self.selection_modes(), ) - if browser_cell_selection["type"] == "none": + if cell_selection["type"] == "none": return None - return browser_cell_selection + return cell_selection - self.input_cell_selection = self_input_cell_selection + self.cell_selection = self_cell_selection # # Array of sorted column information # # TODO-barret-render.data_frame; Expose and update column sorting @@ -414,7 +414,7 @@ def self__input_data_view_rows() -> list[int]: # @reactive.calc # def self__data_selected() -> pd.DataFrame: # # browser_cell_selection - # bcs = self.input_cell_selection() + # bcs = self.cell_selection() # if bcs is None: # req(False) # raise RuntimeError("This should never be reached for typing purposes") @@ -489,7 +489,7 @@ def _subset_data_view(selected: bool) -> pd.DataFrame: # Possibly subset the indices to selected rows if selected: - cell_selection = self.input_cell_selection() + cell_selection = self.cell_selection() if cell_selection is not None and cell_selection["type"] == "row": # Use a `set` for faster lookups selected_row_set = set(cell_selection["rows"]) @@ -893,3 +893,18 @@ async def update_cell_selection( "updateCellSelection", {"cellSelection": cell_selection}, ) + + def input_cell_selection(self) -> CellSelection | None: + """ + [Deprecated] Reactive value of selected cell information. + + Please use `~shiny.render.data_frame.cell_selection` instead. + """ + + from .._deprecated import warn_deprecated + + warn_deprecated( + "`@render.data_frame`'s `.input_cell_selection()` method is deprecated. Please use `.cell_selection()` instead." + ) + + return self.cell_selection() diff --git a/tests/playwright/shiny/bugs/0676-row-selection/app.py b/tests/playwright/shiny/bugs/0676-row-selection/app.py index 8809f3e58..59ec74cff 100644 --- a/tests/playwright/shiny/bugs/0676-row-selection/app.py +++ b/tests/playwright/shiny/bugs/0676-row-selection/app.py @@ -45,7 +45,7 @@ def detail(): @render.code def debug(): - return str((grid.input_cell_selection() or {}).get("rows", ())) + return str((grid.cell_selection() or {}).get("rows", ())) app = App(app_ui, server, debug=True) diff --git a/tests/playwright/shiny/bugs/1345-render-data-frame-input/app.py b/tests/playwright/shiny/bugs/1345-render-data-frame-input/app.py index d2568f0f3..fba2acd1b 100644 --- a/tests/playwright/shiny/bugs/1345-render-data-frame-input/app.py +++ b/tests/playwright/shiny/bugs/1345-render-data-frame-input/app.py @@ -22,7 +22,7 @@ def selected_rows(): @render.text def cell_selection(): - cell_selection = df1.input_cell_selection() + cell_selection = df1.cell_selection() if cell_selection is None: req(cell_selection) raise ValueError("Cell selection is None") diff --git a/tests/playwright/shiny/components/data_frame/edit/app.py b/tests/playwright/shiny/components/data_frame/edit/app.py index 7d6fffd45..48a930503 100644 --- a/tests/playwright/shiny/components/data_frame/edit/app.py +++ b/tests/playwright/shiny/components/data_frame/edit/app.py @@ -111,7 +111,7 @@ def _(): @reactive.effect def _(): - print("Cell Selection:", summary_data.input_cell_selection()) + print("Cell Selection:", summary_data.cell_selection()) # @reactive.effect # def _(): diff --git a/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/app.py b/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/app.py index 52eb1e628..ce9409d02 100644 --- a/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/app.py +++ b/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/app.py @@ -58,7 +58,7 @@ def data_view_selected_true(): # pyright: ignore[reportUnknownParameterType] @render.code # pyright: ignore[reportArgumentType] def cell_selection(): # pyright: ignore[reportUnknownParameterType] - return iris_df.input_cell_selection()["rows"] # pyright: ignore + return iris_df.cell_selection()["rows"] # pyright: ignore @reactive.Effect @reactive.event(input.reset_df) diff --git a/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/test_df_organization.py b/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/test_df_organization.py index 418929998..f0400a920 100644 --- a/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/test_df_organization.py +++ b/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/test_df_organization.py @@ -6,73 +6,73 @@ def test_dataframe_organization_methods(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) data_frame = OutputDataFrame(page, "iris_df") - input_view_rows = OutputCode(page, "data_view_rows") - input_view_selected_true = OutputCode(page, "data_view_selected_true") - input_view_selected_false = OutputCode(page, "data_view_selected_false") - input_cell_selection = OutputCode(page, "cell_selection") + data_view_rows = OutputCode(page, "data_view_rows") + data_view_selected_true = OutputCode(page, "data_view_selected_true") + data_view_selected_false = OutputCode(page, "data_view_selected_false") + cell_selection = OutputCode(page, "cell_selection") reset_df = InputActionButton(page, "reset_df") def reset_data_frame(): reset_df.click() - input_view_rows.expect_value("(0, 1, 2)") - input_view_selected_true.expect_value("[]") - input_view_selected_false.expect_value("[ 0 50 100]") - input_cell_selection.expect_value("()") + data_view_rows.expect_value("(0, 1, 2)") + data_view_selected_true.expect_value("[]") + data_view_selected_false.expect_value("[ 0 50 100]") + cell_selection.expect_value("()") # assert value of unsorted table reset_data_frame() # sort column by number descending data_frame.set_column_sort(col=0) - input_view_rows.expect_value("(1, 2, 0)") - input_view_selected_true.expect_value("[]") - input_view_selected_false.expect_value("[ 50 100 0]") - input_cell_selection.expect_value("()") + data_view_rows.expect_value("(1, 2, 0)") + data_view_selected_true.expect_value("[]") + data_view_selected_false.expect_value("[ 50 100 0]") + cell_selection.expect_value("()") # sort column by number ascending data_frame.set_column_sort(col=0) - input_view_rows.expect_value("(0, 2, 1)") - input_view_selected_true.expect_value("[]") - input_view_selected_false.expect_value("[ 0 100 50]") - input_cell_selection.expect_value("()") + data_view_rows.expect_value("(0, 2, 1)") + data_view_selected_true.expect_value("[]") + data_view_selected_false.expect_value("[ 0 100 50]") + cell_selection.expect_value("()") # sort column by text ascending data_frame.set_column_sort(col=4) - input_view_rows.expect_value("(0, 1, 2)") - input_view_selected_true.expect_value("[]") - input_view_selected_false.expect_value("[ 0 50 100]") - input_cell_selection.expect_value("()") + data_view_rows.expect_value("(0, 1, 2)") + data_view_selected_true.expect_value("[]") + data_view_selected_false.expect_value("[ 0 50 100]") + cell_selection.expect_value("()") # sort column by text descending data_frame.set_column_sort(col=4) - input_view_rows.expect_value("(2, 1, 0)") - input_view_selected_true.expect_value("[]") - input_view_selected_false.expect_value("[100 50 0]") - input_cell_selection.expect_value("()") + data_view_rows.expect_value("(2, 1, 0)") + data_view_selected_true.expect_value("[]") + data_view_selected_false.expect_value("[100 50 0]") + cell_selection.expect_value("()") reset_data_frame() # filter using numbers data_frame.set_column_filter(col=0, text=["6", "7"]) - input_view_rows.expect_value("(1, 2)") - input_view_selected_true.expect_value("[]") - input_view_selected_false.expect_value("[ 50 100]") - input_cell_selection.expect_value("()") + data_view_rows.expect_value("(1, 2)") + data_view_selected_true.expect_value("[]") + data_view_selected_false.expect_value("[ 50 100]") + cell_selection.expect_value("()") reset_data_frame() # select multiple rows data_frame.select_rows([0, 2]) - input_view_rows.expect_value("(0, 1, 2)") - input_view_selected_true.expect_value("[ 0 100]") - input_view_selected_false.expect_value("[ 0 50 100]") - input_cell_selection.expect_value("(0, 2)") + data_view_rows.expect_value("(0, 1, 2)") + data_view_selected_true.expect_value("[ 0 100]") + data_view_selected_false.expect_value("[ 0 50 100]") + cell_selection.expect_value("(0, 2)") reset_data_frame() # select single row data_frame.select_rows([0]) - input_view_rows.expect_value("(0, 1, 2)") - input_view_selected_true.expect_value("[0]") - input_view_selected_false.expect_value("[ 0 50 100]") - input_cell_selection.expect_value("(0,)") + data_view_rows.expect_value("(0, 1, 2)") + data_view_selected_true.expect_value("[0]") + data_view_selected_false.expect_value("[ 0 50 100]") + cell_selection.expect_value("(0,)") diff --git a/tests/playwright/shiny/components/data_frame/row_selection/app.py b/tests/playwright/shiny/components/data_frame/row_selection/app.py index 35892183e..70312afe3 100644 --- a/tests/playwright/shiny/components/data_frame/row_selection/app.py +++ b/tests/playwright/shiny/components/data_frame/row_selection/app.py @@ -59,7 +59,7 @@ async def select_1_3_5(): @render.code def selected_rows(): - cell_selection = grid.input_cell_selection() + cell_selection = grid.cell_selection() if cell_selection is None: return "None" return str(cell_selection.get("rows", ())) From ce8d2886c4b23ec60c505109e64bbcff5161b246 Mon Sep 17 00:00:00 2001 From: Barret Schloerke Date: Tue, 21 May 2024 16:52:08 -0400 Subject: [PATCH 2/2] Update CHANGELOG.md --- CHANGELOG.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b536002c2..d4a7eceae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecations -* `@render.data_frame`'s method `.input_cell_selection()` has been renamed to `.cell_selection()`. Please use `.cell_selection()` and consider `.input_cell_selection()` deprecated. (TODO) - -### `input` key changes - * Restored `@render.data_frame`'s (prematurely removed in v0.9.0) input value `input._selected_rows()`. Please use `.cell_selection()["rows"]` and consider `input._selected_rows()` deprecated. (#1345, #1377) +* `@render.data_frame`'s method `.input_cell_selection()` has been renamed to `.cell_selection()`. Please use `.cell_selection()` and consider `.input_cell_selection()` deprecated. (#1407) + * `@render.data_frame`'s input value `input._data_view_indices` has been renamed to `input._data_view_rows` for consistent naming. Please use `input._data_view_rows` and consider `input._data_view_indices` deprecated. (#1377) ### New features