From 6efb3c51e5b15fa0f9955e44497a880de6557465 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Tue, 8 Oct 2024 09:11:09 -0700 Subject: [PATCH 1/9] Add additional backends --- pyproject.toml | 4 + .../components/data_frame/data_type/app.py | 171 +++++++++++++++++- .../data_frame/data_type/test_df_data_type.py | 15 ++ 3 files changed, 189 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 243e2838e..4302c9c8c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,6 +87,10 @@ test = [ "faicons", "ridgeplot", "great_tables", + "modin", + "polars", + "dask[dataframe]", + "pyarrow", ] dev = [ "black>=24.0", diff --git a/tests/playwright/shiny/components/data_frame/data_type/app.py b/tests/playwright/shiny/components/data_frame/data_type/app.py index d3f3aaeb2..7b58436fb 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/app.py +++ b/tests/playwright/shiny/components/data_frame/data_type/app.py @@ -1,18 +1,32 @@ from __future__ import annotations +import dask.dataframe as dd +import modin.pandas as mpd # pyright: ignore[reportMissingTypeStubs] import narwhals.stable.v1 as nw import palmerpenguins # pyright: ignore[reportMissingTypeStubs] +import polars as pl +import pyarrow as pa from shiny.express import render, ui +# import databricks.koalas as ks # pyright: ignore[reportMissingTypeStubs] + + pd_df = palmerpenguins.load_penguins_raw().iloc[0:2, 0:2] nw_df = nw.from_native(pd_df, eager_only=True) +pa_df = pa.Table.from_pandas(pd_df) +mpd_df = mpd.DataFrame(pd_df) +pl_df = pl.DataFrame(pd_df) +dd_df = dd.from_pandas( + pd_df +) # pyright: ignore[reportUnknownMemberType, reportPrivateImportUsage, reportUnknownVariableType] +# ks_df = ks.from_pandas(pd_df) # pyright: ignore[reportMissingTypeStubs, reportUnknownMemberType, reportUnknownVariableType] + with ui.layout_columns(): with ui.card(): - ui.h2("Original Pandas Data") @render.data_frame @@ -73,3 +87,158 @@ def nw_data_view(): @render.code def nw_data_view_selected(): return str(type(nw_df_original.data_view(selected=True))) + + with ui.card(): + ui.h2("Original PyArrow Data") + + @render.data_frame + def pa_df_original(): + return pa_df + + "Data type:" + + @render.code + def pa_type(): + return str(type(pa_df)) + + ui.markdown("`.data()` type:") + + @render.code + def pa_data(): + return str(type(pa_df_original.data())) + + ui.markdown("`.data_view()` type:") + + @render.code + def pa_data_view(): + return str(type(pa_df_original.data_view())) + + ui.markdown("`.data_view(selected=True)` type:") + + @render.code + def pa_data_view_selected(): + return str(type(pa_df_original.data_view(selected=True))) + + with ui.card(): + ui.h2("Modin Data") + + @render.data_frame + def mpd_df_original(): + return mpd_df + + "Data type:" + + @render.code + def mpd_type(): + return str(type(mpd_df)) + + ui.markdown("`.data()` type:") + + @render.code + def mpd_data(): + return str(type(mpd_df_original.data())) + + ui.markdown("`.data_view()` type:") + + @render.code + def mpd_data_view(): + return str(type(mpd_df_original.data_view())) + + ui.markdown("`.data_view(selected=True)` type:") + + @render.code + def mpd_data_view_selected(): + return str(type(mpd_df_original.data_view(selected=True))) + + with ui.card(): + ui.h2("Polars Data") + + @render.data_frame + def pl_df_original(): + return pl_df + + "Data type:" + + @render.code + def pl_type(): + return str(type(pl_df)) + + ui.markdown("`.data()` type:") + + @render.code + def pl_data(): + return str(type(pl_df_original.data())) + + ui.markdown("`.data_view()` type:") + + @render.code + def pl_data_view(): + return str(type(pl_df_original.data_view())) + + ui.markdown("`.data_view(selected=True)` type:") + + @render.code + def pl_data_view_selected(): + return str(type(pl_df_original.data_view(selected=True))) + + with ui.card(): + ui.h2("Dask Data") + + @render.data_frame + def dd_df_original(): + return dd_df + + "Data type:" + + @render.code + def dd_type(): + return str(type(dd_df)) + + ui.markdown("`.data()` type:") + + @render.code + def dd_data(): + return str(type(dd_df_original.data())) + + ui.markdown("`.data_view()` type:") + + @render.code + def dd_data_view(): + return str(type(dd_df_original.data_view())) + + ui.markdown("`.data_view(selected=True)` type:") + + @render.code + def dd_data_view_selected(): + return str(type(dd_df_original.data_view(selected=True))) + + # with ui.card(): + # ui.h2("Koalas Data") + + # @render.data_frame + # def ks_df_original(): + # return ks_df + + # "Data type:" + + # @render.code + # def ks_type(): + # return str(type(ks_df)) + + # ui.markdown("`.data()` type:") + + # @render.code + # def ks_data(): + # return str(type(ks_df_original.data())) + + # ui.markdown("`.data_view()` type:") + + # @render.code + # def ks_data_view(): + # return str(type(ks_df_original.data_view())) + + # ui.markdown("`.data_view(selected=True)` type:") + + # @render.code + # def ks_data_view_selected(): + # return str(type(ks_df_original.data_view(selected=True))) diff --git a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py index c3eb5431d..13224eb23 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py +++ b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py @@ -25,3 +25,18 @@ def test_data_frame_data_type( controller.OutputCode(page, "nw_data_view_selected").expect_value( re.compile(r"narwhals") ) + + controller.OutputCode(page, "pd_type").expect_value(re.compile(r"pandas")) + controller.OutputCode(page, "pd_data").expect_value(re.compile(r"pandas")) + controller.OutputCode(page, "pd_data_view").expect_value(re.compile(r"pandas")) + controller.OutputCode(page, "pd_data_view_selected").expect_value( + re.compile(r"pandas") + ) + + # modin tests + controller.OutputCode(page, "mpd_type").expect_value(re.compile(r"modin")) + controller.OutputCode(page, "mpd_data").expect_value(re.compile(r"modin")) + controller.OutputCode(page, "mpd_data_view").expect_value(re.compile(r"modin")) + controller.OutputCode(page, "mpd_data_view_selected").expect_value( + re.compile(r"modin") + ) From 19fa74480daad449c39ed2174a7b0070035576e3 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Tue, 8 Oct 2024 18:00:39 -0700 Subject: [PATCH 2/9] allow dataframe to be selected --- .../components/data_frame/data_type/app.py | 129 +++++++----------- 1 file changed, 53 insertions(+), 76 deletions(-) diff --git a/tests/playwright/shiny/components/data_frame/data_type/app.py b/tests/playwright/shiny/components/data_frame/data_type/app.py index 7b58436fb..c3c26dbb1 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/app.py +++ b/tests/playwright/shiny/components/data_frame/data_type/app.py @@ -1,6 +1,5 @@ from __future__ import annotations -import dask.dataframe as dd import modin.pandas as mpd # pyright: ignore[reportMissingTypeStubs] import narwhals.stable.v1 as nw import palmerpenguins # pyright: ignore[reportMissingTypeStubs] @@ -9,19 +8,12 @@ from shiny.express import render, ui -# import databricks.koalas as ks # pyright: ignore[reportMissingTypeStubs] - - pd_df = palmerpenguins.load_penguins_raw().iloc[0:2, 0:2] nw_df = nw.from_native(pd_df, eager_only=True) -pa_df = pa.Table.from_pandas(pd_df) +pa_df = pa.table(pd_df) # pyright: ignore[reportUnknownMemberType] mpd_df = mpd.DataFrame(pd_df) pl_df = pl.DataFrame(pd_df) -dd_df = dd.from_pandas( - pd_df -) # pyright: ignore[reportUnknownMemberType, reportPrivateImportUsage, reportUnknownVariableType] -# ks_df = ks.from_pandas(pd_df) # pyright: ignore[reportMissingTypeStubs, reportUnknownMemberType, reportUnknownVariableType] with ui.layout_columns(): @@ -31,7 +23,18 @@ @render.data_frame def pd_df_original(): - return pd_df + return render.DataGrid( + data=pd_df, # pyright: ignore[reportUnknownArgumentType] + selection_mode="row", + ) + + "Selected row:" + + @render.code + def selected_pandas_row(): + return str( + pd_df_original.data_view(selected=True) + ) # pyright: ignore[reportUnknownMemberType] "Data type:" @@ -62,7 +65,16 @@ def pd_data_view_selected(): @render.data_frame def nw_df_original(): - return nw_df + return render.DataGrid( + data=nw_df, + selection_mode="row", + ) + + "Selected row:" + + @render.code + def selected_nw_row(): + return str(nw_df_original.data_view(selected=True).to_native()) "Data type:" @@ -93,7 +105,16 @@ def nw_data_view_selected(): @render.data_frame def pa_df_original(): - return pa_df + return render.DataGrid( + data=pa_df, + selection_mode="row", + ) + + "Selected row:" + + @render.code + def selected_pa_row(): + return str(pa_df_original.data_view(selected=True)) "Data type:" @@ -124,7 +145,16 @@ def pa_data_view_selected(): @render.data_frame def mpd_df_original(): - return mpd_df + return render.DataGrid( + data=mpd_df, + selection_mode="row", + ) + + "Selected row:" + + @render.code + def selected_mpd_row(): + return str(mpd_df_original.data_view(selected=True)) "Data type:" @@ -155,7 +185,16 @@ def mpd_data_view_selected(): @render.data_frame def pl_df_original(): - return pl_df + return render.DataGrid( + data=pl_df, + selection_mode="row", + ) + + "Selected row:" + + @render.code + def selected_pl_row(): + return str(pl_df_original.data_view(selected=True)) "Data type:" @@ -180,65 +219,3 @@ def pl_data_view(): @render.code def pl_data_view_selected(): return str(type(pl_df_original.data_view(selected=True))) - - with ui.card(): - ui.h2("Dask Data") - - @render.data_frame - def dd_df_original(): - return dd_df - - "Data type:" - - @render.code - def dd_type(): - return str(type(dd_df)) - - ui.markdown("`.data()` type:") - - @render.code - def dd_data(): - return str(type(dd_df_original.data())) - - ui.markdown("`.data_view()` type:") - - @render.code - def dd_data_view(): - return str(type(dd_df_original.data_view())) - - ui.markdown("`.data_view(selected=True)` type:") - - @render.code - def dd_data_view_selected(): - return str(type(dd_df_original.data_view(selected=True))) - - # with ui.card(): - # ui.h2("Koalas Data") - - # @render.data_frame - # def ks_df_original(): - # return ks_df - - # "Data type:" - - # @render.code - # def ks_type(): - # return str(type(ks_df)) - - # ui.markdown("`.data()` type:") - - # @render.code - # def ks_data(): - # return str(type(ks_df_original.data())) - - # ui.markdown("`.data_view()` type:") - - # @render.code - # def ks_data_view(): - # return str(type(ks_df_original.data_view())) - - # ui.markdown("`.data_view(selected=True)` type:") - - # @render.code - # def ks_data_view_selected(): - # return str(type(ks_df_original.data_view(selected=True))) From a77b01dac24374f72bf9da2160e06540271bd027 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Tue, 8 Oct 2024 18:10:10 -0700 Subject: [PATCH 3/9] Add tests as well --- .../data_frame/data_type/test_df_data_type.py | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py index 13224eb23..a30194c8c 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py +++ b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py @@ -12,26 +12,50 @@ def test_data_frame_data_type( ) -> None: page.goto(local_app.url) + # pandas tests controller.OutputCode(page, "pd_type").expect_value(re.compile(r"pandas")) controller.OutputCode(page, "pd_data").expect_value(re.compile(r"pandas")) controller.OutputCode(page, "pd_data_view").expect_value(re.compile(r"pandas")) controller.OutputCode(page, "pd_data_view_selected").expect_value( re.compile(r"pandas") ) + controller.OutputCode(page, "selected_pandas_row").expect_value( + re.compile(r"Empty DataFrame") + ) + controller.OutputDataFrame(page, "pd_df_original").cell_locator(0, 0).click() + controller.OutputCode(page, "selected_pandas_row").expect_value( + re.compile(r"PAL0708") + ) + # narwhals tests controller.OutputCode(page, "nw_type").expect_value(re.compile(r"narwhals")) controller.OutputCode(page, "nw_data").expect_value(re.compile(r"narwhals")) controller.OutputCode(page, "nw_data_view").expect_value(re.compile(r"narwhals")) controller.OutputCode(page, "nw_data_view_selected").expect_value( re.compile(r"narwhals") ) + controller.OutputDataFrame(page, "nw_df_original").cell_locator(0, 0).click() + controller.OutputCode(page, "selected_nw_row").expect_value(re.compile(r"PAL0708")) - controller.OutputCode(page, "pd_type").expect_value(re.compile(r"pandas")) - controller.OutputCode(page, "pd_data").expect_value(re.compile(r"pandas")) - controller.OutputCode(page, "pd_data_view").expect_value(re.compile(r"pandas")) - controller.OutputCode(page, "pd_data_view_selected").expect_value( - re.compile(r"pandas") + # pyArrow tests + controller.OutputCode(page, "pa_type").expect_value(re.compile(r"pyarrow")) + controller.OutputCode(page, "pa_data").expect_value(re.compile(r"pyarrow")) + controller.OutputCode(page, "pa_data_view").expect_value(re.compile(r"pyarrow")) + controller.OutputCode(page, "pa_data_view_selected").expect_value( + re.compile(r"pyarrow") + ) + controller.OutputDataFrame(page, "pa_df_original").cell_locator(0, 0).click() + controller.OutputCode(page, "selected_pa_row").expect_value(re.compile(r"PAL0708")) + + # polars tests + controller.OutputCode(page, "pl_type").expect_value(re.compile(r"polars")) + controller.OutputCode(page, "pl_data").expect_value(re.compile(r"polars")) + controller.OutputCode(page, "pl_data_view").expect_value(re.compile(r"polars")) + controller.OutputCode(page, "pl_data_view_selected").expect_value( + re.compile(r"polars") ) + controller.OutputDataFrame(page, "pl_df_original").cell_locator(0, 0).click() + controller.OutputCode(page, "selected_pl_row").expect_value(re.compile(r"PAL0708")) # modin tests controller.OutputCode(page, "mpd_type").expect_value(re.compile(r"modin")) @@ -40,3 +64,5 @@ def test_data_frame_data_type( controller.OutputCode(page, "mpd_data_view_selected").expect_value( re.compile(r"modin") ) + controller.OutputDataFrame(page, "mpd_df_original").cell_locator(0, 0).click() + controller.OutputCode(page, "selected_mpd_row").expect_value(re.compile(r"PAL0708")) From 283f98b9279259b0f2bd52b3917e2b208c43e5c9 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Thu, 10 Oct 2024 12:50:45 -0700 Subject: [PATCH 4/9] add pyarrow-stubs --- pyproject.toml | 1 + .../components/data_frame/data_type/app.py | 22 +++++++++---------- .../data_frame/data_type/test_df_data_type.py | 8 ++++--- .../playwright/shiny/components/table/app.py | 17 ++++++++++++++ .../shiny/components/table/test_table.py | 8 +++---- 5 files changed, 37 insertions(+), 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4302c9c8c..84b027ca7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,6 +91,7 @@ test = [ "polars", "dask[dataframe]", "pyarrow", + "pyarrow-stubs", ] dev = [ "black>=24.0", diff --git a/tests/playwright/shiny/components/data_frame/data_type/app.py b/tests/playwright/shiny/components/data_frame/data_type/app.py index c3c26dbb1..50c76b952 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/app.py +++ b/tests/playwright/shiny/components/data_frame/data_type/app.py @@ -30,11 +30,9 @@ def pd_df_original(): "Selected row:" - @render.code + @render.data_frame def selected_pandas_row(): - return str( - pd_df_original.data_view(selected=True) - ) # pyright: ignore[reportUnknownMemberType] + return pd_df_original.data_view(selected=True) "Data type:" @@ -72,9 +70,9 @@ def nw_df_original(): "Selected row:" - @render.code + @render.data_frame def selected_nw_row(): - return str(nw_df_original.data_view(selected=True).to_native()) + return nw_df_original.data_view(selected=True) "Data type:" @@ -112,9 +110,9 @@ def pa_df_original(): "Selected row:" - @render.code + @render.data_frame def selected_pa_row(): - return str(pa_df_original.data_view(selected=True)) + return pa_df_original.data_view(selected=True) "Data type:" @@ -152,9 +150,9 @@ def mpd_df_original(): "Selected row:" - @render.code + @render.data_frame def selected_mpd_row(): - return str(mpd_df_original.data_view(selected=True)) + return mpd_df_original.data_view(selected=True) "Data type:" @@ -192,9 +190,9 @@ def pl_df_original(): "Selected row:" - @render.code + @render.data_frame def selected_pl_row(): - return str(pl_df_original.data_view(selected=True)) + return pl_df_original.data_view(selected=True) "Data type:" diff --git a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py index a30194c8c..a3b1642b1 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py +++ b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py @@ -12,6 +12,7 @@ def test_data_frame_data_type( ) -> None: page.goto(local_app.url) + #TODO-karan: Use for loop for iterating over the data types # pandas tests controller.OutputCode(page, "pd_type").expect_value(re.compile(r"pandas")) controller.OutputCode(page, "pd_data").expect_value(re.compile(r"pandas")) @@ -19,9 +20,10 @@ def test_data_frame_data_type( controller.OutputCode(page, "pd_data_view_selected").expect_value( re.compile(r"pandas") ) - controller.OutputCode(page, "selected_pandas_row").expect_value( - re.compile(r"Empty DataFrame") - ) + # controller.OutputCode(page, "selected_pandas_row").expect_value( + # re.compile(r"Empty DataFrame") + # ) + controller.OutputDataFrame(page, "selected_pandas_row").expect_column_labels("") controller.OutputDataFrame(page, "pd_df_original").cell_locator(0, 0).click() controller.OutputCode(page, "selected_pandas_row").expect_value( re.compile(r"PAL0708") diff --git a/tests/playwright/shiny/components/table/app.py b/tests/playwright/shiny/components/table/app.py index 509ce39e9..c34c70d9a 100644 --- a/tests/playwright/shiny/components/table/app.py +++ b/tests/playwright/shiny/components/table/app.py @@ -2,6 +2,7 @@ import narwhals.stable.v1 as nw import palmerpenguins # pyright: ignore[reportMissingTypeStubs] +import modin.pandas as md from shiny.express import render, ui @@ -9,6 +10,8 @@ nw_df = nw.from_native(pd_df, eager_only=True) +md_df = md.DataFrame(pd_df) + with ui.card(): ui.h2("Polars Pandas Data") @@ -22,3 +25,17 @@ def nw_table(): @render.code def nw_df_type(): return str(type(nw_df)) + +with ui.card(): + + ui.h2("Modin dataframe Data") + + @render.table + def md_table(): + return md_df + + "Data type:" + + @render.code + def md_df_type(): + return str(type(md_df)) diff --git a/tests/playwright/shiny/components/table/test_table.py b/tests/playwright/shiny/components/table/test_table.py index 78a561c5b..d04bcd39d 100644 --- a/tests/playwright/shiny/components/table/test_table.py +++ b/tests/playwright/shiny/components/table/test_table.py @@ -9,8 +9,8 @@ def test_table_data_support(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - table = controller.OutputTable(page, "nw_table") - - table.expect_nrow(2) - + controller.OutputTable(page, "nw_table").expect_nrow(2) controller.OutputCode(page, "nw_df_type").expect_value(re.compile("narwhals")) + + controller.OutputTable(page, "md_table").expect_nrow(2) + controller.OutputCode(page, "md_df_type").expect_value(re.compile("modin")) From 4aadf36fb9b6fb9d7ceacf8c3e0c7c5f69b158d7 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Thu, 10 Oct 2024 13:23:19 -0700 Subject: [PATCH 5/9] iterate over backends --- .../data_frame/data_type/test_df_data_type.py | 77 +++++-------------- 1 file changed, 20 insertions(+), 57 deletions(-) diff --git a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py index a3b1642b1..17edbe264 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py +++ b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py @@ -5,66 +5,29 @@ from shiny.playwright import controller from shiny.run import ShinyAppProc +backends = [ + {"name": "pandas", "prefix": "pd", "df_original": "pd_df_original", "selected_row": "selected_pandas_row"}, + {"name": "narwhals", "prefix": "nw", "df_original": "nw_df_original", "selected_row": "selected_nw_row"}, + {"name": "pyarrow", "prefix": "pa", "df_original": "pa_df_original", "selected_row": "selected_pa_row"}, + {"name": "polars", "prefix": "pl", "df_original": "pl_df_original", "selected_row": "selected_pl_row"}, + {"name": "modin", "prefix": "mpd", "df_original": "mpd_df_original", "selected_row": "selected_mpd_row"}, +] + def test_data_frame_data_type( page: Page, local_app: ShinyAppProc, ) -> None: page.goto(local_app.url) - - #TODO-karan: Use for loop for iterating over the data types - # pandas tests - controller.OutputCode(page, "pd_type").expect_value(re.compile(r"pandas")) - controller.OutputCode(page, "pd_data").expect_value(re.compile(r"pandas")) - controller.OutputCode(page, "pd_data_view").expect_value(re.compile(r"pandas")) - controller.OutputCode(page, "pd_data_view_selected").expect_value( - re.compile(r"pandas") - ) - # controller.OutputCode(page, "selected_pandas_row").expect_value( - # re.compile(r"Empty DataFrame") - # ) - controller.OutputDataFrame(page, "selected_pandas_row").expect_column_labels("") - controller.OutputDataFrame(page, "pd_df_original").cell_locator(0, 0).click() - controller.OutputCode(page, "selected_pandas_row").expect_value( - re.compile(r"PAL0708") - ) - - # narwhals tests - controller.OutputCode(page, "nw_type").expect_value(re.compile(r"narwhals")) - controller.OutputCode(page, "nw_data").expect_value(re.compile(r"narwhals")) - controller.OutputCode(page, "nw_data_view").expect_value(re.compile(r"narwhals")) - controller.OutputCode(page, "nw_data_view_selected").expect_value( - re.compile(r"narwhals") - ) - controller.OutputDataFrame(page, "nw_df_original").cell_locator(0, 0).click() - controller.OutputCode(page, "selected_nw_row").expect_value(re.compile(r"PAL0708")) - - # pyArrow tests - controller.OutputCode(page, "pa_type").expect_value(re.compile(r"pyarrow")) - controller.OutputCode(page, "pa_data").expect_value(re.compile(r"pyarrow")) - controller.OutputCode(page, "pa_data_view").expect_value(re.compile(r"pyarrow")) - controller.OutputCode(page, "pa_data_view_selected").expect_value( - re.compile(r"pyarrow") - ) - controller.OutputDataFrame(page, "pa_df_original").cell_locator(0, 0).click() - controller.OutputCode(page, "selected_pa_row").expect_value(re.compile(r"PAL0708")) - - # polars tests - controller.OutputCode(page, "pl_type").expect_value(re.compile(r"polars")) - controller.OutputCode(page, "pl_data").expect_value(re.compile(r"polars")) - controller.OutputCode(page, "pl_data_view").expect_value(re.compile(r"polars")) - controller.OutputCode(page, "pl_data_view_selected").expect_value( - re.compile(r"polars") - ) - controller.OutputDataFrame(page, "pl_df_original").cell_locator(0, 0).click() - controller.OutputCode(page, "selected_pl_row").expect_value(re.compile(r"PAL0708")) - - # modin tests - controller.OutputCode(page, "mpd_type").expect_value(re.compile(r"modin")) - controller.OutputCode(page, "mpd_data").expect_value(re.compile(r"modin")) - controller.OutputCode(page, "mpd_data_view").expect_value(re.compile(r"modin")) - controller.OutputCode(page, "mpd_data_view_selected").expect_value( - re.compile(r"modin") - ) - controller.OutputDataFrame(page, "mpd_df_original").cell_locator(0, 0).click() - controller.OutputCode(page, "selected_mpd_row").expect_value(re.compile(r"PAL0708")) + # Iterate over the backends + for backend in backends: + # Perform output code tests + controller.OutputCode(page, f"{backend['prefix']}_type").expect_value(re.compile(backend["name"])) + controller.OutputCode(page, f"{backend['prefix']}_data").expect_value(re.compile(backend["name"])) + controller.OutputCode(page, f"{backend['prefix']}_data_view").expect_value(re.compile(backend["name"])) + controller.OutputCode(page, f"{backend['prefix']}_data_view_selected").expect_value(re.compile(backend["name"])) + + # Perform output dataframe tests + controller.OutputDataFrame(page, backend["selected_row"]).expect_column_labels(["studyName", "Sample Number"]) + controller.OutputDataFrame(page, backend["df_original"]).select_rows([1]) + controller.OutputDataFrame(page, backend["selected_row"]).expect_nrow(1) From 42b65d19879e2e1134b236656346cdc136e18307 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Thu, 10 Oct 2024 13:23:55 -0700 Subject: [PATCH 6/9] linting issues --- .../data_frame/data_type/test_df_data_type.py | 55 +++++++++++++++---- .../playwright/shiny/components/table/app.py | 3 +- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py index 17edbe264..d3c24e130 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py +++ b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py @@ -6,11 +6,36 @@ from shiny.run import ShinyAppProc backends = [ - {"name": "pandas", "prefix": "pd", "df_original": "pd_df_original", "selected_row": "selected_pandas_row"}, - {"name": "narwhals", "prefix": "nw", "df_original": "nw_df_original", "selected_row": "selected_nw_row"}, - {"name": "pyarrow", "prefix": "pa", "df_original": "pa_df_original", "selected_row": "selected_pa_row"}, - {"name": "polars", "prefix": "pl", "df_original": "pl_df_original", "selected_row": "selected_pl_row"}, - {"name": "modin", "prefix": "mpd", "df_original": "mpd_df_original", "selected_row": "selected_mpd_row"}, + { + "name": "pandas", + "prefix": "pd", + "df_original": "pd_df_original", + "selected_row": "selected_pandas_row", + }, + { + "name": "narwhals", + "prefix": "nw", + "df_original": "nw_df_original", + "selected_row": "selected_nw_row", + }, + { + "name": "pyarrow", + "prefix": "pa", + "df_original": "pa_df_original", + "selected_row": "selected_pa_row", + }, + { + "name": "polars", + "prefix": "pl", + "df_original": "pl_df_original", + "selected_row": "selected_pl_row", + }, + { + "name": "modin", + "prefix": "mpd", + "df_original": "mpd_df_original", + "selected_row": "selected_mpd_row", + }, ] @@ -22,12 +47,22 @@ def test_data_frame_data_type( # Iterate over the backends for backend in backends: # Perform output code tests - controller.OutputCode(page, f"{backend['prefix']}_type").expect_value(re.compile(backend["name"])) - controller.OutputCode(page, f"{backend['prefix']}_data").expect_value(re.compile(backend["name"])) - controller.OutputCode(page, f"{backend['prefix']}_data_view").expect_value(re.compile(backend["name"])) - controller.OutputCode(page, f"{backend['prefix']}_data_view_selected").expect_value(re.compile(backend["name"])) + controller.OutputCode(page, f"{backend['prefix']}_type").expect_value( + re.compile(backend["name"]) + ) + controller.OutputCode(page, f"{backend['prefix']}_data").expect_value( + re.compile(backend["name"]) + ) + controller.OutputCode(page, f"{backend['prefix']}_data_view").expect_value( + re.compile(backend["name"]) + ) + controller.OutputCode( + page, f"{backend['prefix']}_data_view_selected" + ).expect_value(re.compile(backend["name"])) # Perform output dataframe tests - controller.OutputDataFrame(page, backend["selected_row"]).expect_column_labels(["studyName", "Sample Number"]) + controller.OutputDataFrame(page, backend["selected_row"]).expect_column_labels( + ["studyName", "Sample Number"] + ) controller.OutputDataFrame(page, backend["df_original"]).select_rows([1]) controller.OutputDataFrame(page, backend["selected_row"]).expect_nrow(1) diff --git a/tests/playwright/shiny/components/table/app.py b/tests/playwright/shiny/components/table/app.py index c34c70d9a..99befaa6e 100644 --- a/tests/playwright/shiny/components/table/app.py +++ b/tests/playwright/shiny/components/table/app.py @@ -1,8 +1,8 @@ from __future__ import annotations +import modin.pandas as md import narwhals.stable.v1 as nw import palmerpenguins # pyright: ignore[reportMissingTypeStubs] -import modin.pandas as md from shiny.express import render, ui @@ -26,6 +26,7 @@ def nw_table(): def nw_df_type(): return str(type(nw_df)) + with ui.card(): ui.h2("Modin dataframe Data") From 6e2970b9f344a7df549d6f99e32db97682399567 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Fri, 11 Oct 2024 08:26:54 -0700 Subject: [PATCH 7/9] install all engines for modin --- pyproject.toml | 2 +- .../data_frame/data_type/test_df_data_type.py | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 84b027ca7..a9533d335 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,7 +87,7 @@ test = [ "faicons", "ridgeplot", "great_tables", - "modin", + "modin[all]", "polars", "dask[dataframe]", "pyarrow", diff --git a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py index d3c24e130..26259bd8c 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py +++ b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py @@ -5,6 +5,7 @@ from shiny.playwright import controller from shiny.run import ShinyAppProc +# TODO-karan: pyarrow tests have been commented out because the pyarrow backend is not yet supported backends = [ { "name": "pandas", @@ -18,12 +19,12 @@ "df_original": "nw_df_original", "selected_row": "selected_nw_row", }, - { - "name": "pyarrow", - "prefix": "pa", - "df_original": "pa_df_original", - "selected_row": "selected_pa_row", - }, + # { + # "name": "pyarrow", + # "prefix": "pa", + # "df_original": "pa_df_original", + # "selected_row": "selected_pa_row", + # }, { "name": "polars", "prefix": "pl", From 345403b009fc7fac01c86c07dedbb927921ac040 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Fri, 11 Oct 2024 08:32:15 -0700 Subject: [PATCH 8/9] add ignore for pyright checks for modin imports --- tests/playwright/shiny/components/table/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/playwright/shiny/components/table/app.py b/tests/playwright/shiny/components/table/app.py index 99befaa6e..1a2a2a4e9 100644 --- a/tests/playwright/shiny/components/table/app.py +++ b/tests/playwright/shiny/components/table/app.py @@ -1,6 +1,6 @@ from __future__ import annotations -import modin.pandas as md +import modin.pandas as md # pyright: ignore[reportMissingTypeStubs] import narwhals.stable.v1 as nw import palmerpenguins # pyright: ignore[reportMissingTypeStubs] From 316999d216bddb7e78956252dd1b5a944fb9bf0c Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Fri, 11 Oct 2024 09:08:40 -0700 Subject: [PATCH 9/9] uncomment pyarrow tests and bump narwhals version --- pyproject.toml | 2 +- .../data_frame/data_type/test_df_data_type.py | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 699356e2d..b5a1d7f13 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,7 @@ dependencies = [ "prompt-toolkit;platform_system!='Emscripten'", "python-multipart>=0.0.7;platform_system!='Emscripten'", "setuptools;python_version>='3.12'", - "narwhals>=1.9.1", + "narwhals>=1.9.3", "orjson>=3.10.7", ] diff --git a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py index 26259bd8c..d3c24e130 100644 --- a/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py +++ b/tests/playwright/shiny/components/data_frame/data_type/test_df_data_type.py @@ -5,7 +5,6 @@ from shiny.playwright import controller from shiny.run import ShinyAppProc -# TODO-karan: pyarrow tests have been commented out because the pyarrow backend is not yet supported backends = [ { "name": "pandas", @@ -19,12 +18,12 @@ "df_original": "nw_df_original", "selected_row": "selected_nw_row", }, - # { - # "name": "pyarrow", - # "prefix": "pa", - # "df_original": "pa_df_original", - # "selected_row": "selected_pa_row", - # }, + { + "name": "pyarrow", + "prefix": "pa", + "df_original": "pa_df_original", + "selected_row": "selected_pa_row", + }, { "name": "polars", "prefix": "pl",