diff --git a/narwhals/_arrow/dataframe.py b/narwhals/_arrow/dataframe.py index 56540e8e90..9d2c8479c5 100644 --- a/narwhals/_arrow/dataframe.py +++ b/narwhals/_arrow/dataframe.py @@ -561,6 +561,16 @@ def lazy(self, *, backend: Implementation | None = None) -> CompliantLazyFrameAn backend_version=parse_version(dask), version=self._version, ) + elif backend.is_ibis(): + import ibis # ignore-banned-import + + from narwhals._ibis.dataframe import IbisLazyFrame + + return IbisLazyFrame( + ibis.memtable(self.native, columns=self.columns), + backend_version=parse_version(ibis), + version=self._version, + ) raise AssertionError # pragma: no cover def collect( diff --git a/narwhals/_pandas_like/dataframe.py b/narwhals/_pandas_like/dataframe.py index c2bc20fd4d..a4d606de41 100644 --- a/narwhals/_pandas_like/dataframe.py +++ b/narwhals/_pandas_like/dataframe.py @@ -819,6 +819,16 @@ def lazy(self, *, backend: Implementation | None = None) -> CompliantLazyFrameAn backend_version=parse_version(dask), version=self._version, ) + elif backend.is_ibis(): + import ibis # ignore-banned-import + + from narwhals._ibis.dataframe import IbisLazyFrame + + return IbisLazyFrame( + ibis.memtable(pandas_df, columns=self.columns), + backend_version=parse_version(ibis), + version=self._version, + ) raise AssertionError # pragma: no cover @property diff --git a/narwhals/_polars/dataframe.py b/narwhals/_polars/dataframe.py index fb0f49402a..1caffea696 100644 --- a/narwhals/_polars/dataframe.py +++ b/narwhals/_polars/dataframe.py @@ -477,6 +477,16 @@ def lazy(self, *, backend: Implementation | None = None) -> CompliantLazyFrameAn backend_version=parse_version(dask), version=self._version, ) + elif backend.is_ibis(): + import ibis # ignore-banned-import + + from narwhals._ibis.dataframe import IbisLazyFrame + + return IbisLazyFrame( + ibis.memtable(self.native, columns=self.columns), + backend_version=parse_version(ibis), + version=self._version, + ) raise AssertionError # pragma: no cover @overload diff --git a/narwhals/dataframe.py b/narwhals/dataframe.py index b5acc9059c..0924681988 100644 --- a/narwhals/dataframe.py +++ b/narwhals/dataframe.py @@ -534,10 +534,10 @@ def lazy( `backend` can be specified in various ways - - As `Implementation.` with `BACKEND` being `DASK`, `DUCKDB` - or `POLARS`. - - As a string: `"dask"`, `"duckdb"` or `"polars"` - - Directly as a module `dask.dataframe`, `duckdb` or `polars`. + - As `Implementation.` with `BACKEND` being `DASK`, `DUCKDB`, + `IBIS` or `POLARS`. + - As a string: `"dask"`, `"duckdb"`, `"ibis"` or `"polars"` + - Directly as a module `dask.dataframe`, `duckdb`, `ibis` or `polars`. Returns: A new LazyFrame. @@ -580,6 +580,7 @@ def lazy( Implementation.DASK, Implementation.DUCKDB, Implementation.POLARS, + Implementation.IBIS, ) if lazy_backend is not None and lazy_backend not in supported_lazy_backends: msg = ( diff --git a/tests/frame/lazy_test.py b/tests/frame/lazy_test.py index e88703b84d..87176efc89 100644 --- a/tests/frame/lazy_test.py +++ b/tests/frame/lazy_test.py @@ -52,9 +52,11 @@ def test_lazy_to_default(constructor_eager: ConstructorEager) -> None: Implementation.POLARS, Implementation.DUCKDB, Implementation.DASK, + Implementation.IBIS, "polars", "duckdb", "dask", + "ibis", ], ) def test_lazy_backend(