diff --git a/src/rust/Cargo.lock b/src/rust/Cargo.lock index 0366fc8ee..9197b06ff 100644 --- a/src/rust/Cargo.lock +++ b/src/rust/Cargo.lock @@ -579,7 +579,8 @@ checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" [[package]] name = "extendr-api" version = "0.7.0" -source = "git+https://github.com/extendr/extendr?rev=0d0a525b59a1c07c16e0be3e16cabc513f471ced#0d0a525b59a1c07c16e0be3e16cabc513f471ced" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0701db497d091675e50bb10ba870999742cd1e9a9d94cf3fb52f3ea9a7629c0" dependencies = [ "extendr-macros", "libR-sys", @@ -591,7 +592,8 @@ dependencies = [ [[package]] name = "extendr-macros" version = "0.7.0" -source = "git+https://github.com/extendr/extendr?rev=0d0a525b59a1c07c16e0be3e16cabc513f471ced#0d0a525b59a1c07c16e0be3e16cabc513f471ced" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d6b806beee182ab3e1105c822df137913b894847a13ec29dfbff9abfb6d1d2" dependencies = [ "proc-macro2", "quote", diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index 5282fe1c7..4ee521b1a 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -36,7 +36,7 @@ opt-level = 3 # was 1 to support 1.66, but since 1.70 is needed anyway it does n opt-level = 3 [dependencies] -extendr-api = { git = "https://github.com/extendr/extendr", rev = "0d0a525b59a1c07c16e0be3e16cabc513f471ced", default-features = false, features = [ +extendr-api = { version = "0.7.0", default-features = false, features = [ "result_list", "serde", ] } diff --git a/src/rust/src/rbackground.rs b/src/rust/src/rbackground.rs index 06c792892..56c7efd8b 100644 --- a/src/rust/src/rbackground.rs +++ b/src/rust/src/rbackground.rs @@ -4,10 +4,7 @@ use crate::rpolarserr::rerr; use crate::rpolarserr::{ extendr_to_rpolars_err, polars_to_rpolars_err, rdbg, RPolarsErr, RResult, Rctx, WithRctx, }; -use extendr_api::{ - call, extendr, extendr_module, list, pairlist, symbol::class_symbol, Attributes, Conversions, - Length, List, Operators, Rinternals, Robj, NULL, R, -}; +use extendr_api::prelude::*; use flume::{bounded, Sender}; use ipc_channel::ipc; use once_cell::sync::Lazy; @@ -15,6 +12,7 @@ use polars::prelude as pl; use std::collections::VecDeque; use std::sync::{Arc, Mutex}; use std::thread; + #[derive(Debug)] pub struct RPolarsRThreadHandle { handle: Option>, diff --git a/src/rust/src/rlib.rs b/src/rust/src/rlib.rs index 10df4c0e7..39bb837d1 100644 --- a/src/rust/src/rlib.rs +++ b/src/rust/src/rlib.rs @@ -179,7 +179,7 @@ use crate::rpolarserr::*; #[extendr] pub fn dtype_str_repr(dtype: Robj) -> RResult { - let dtype = robj_to!(RPolarsDataType, dtype)?.0; + let dtype = robj_to!(PLPolarsDataType, dtype)?; Ok(dtype.to_string()) } diff --git a/src/rust/src/rpolarserr.rs b/src/rust/src/rpolarserr.rs index c6e970959..9da4a9427 100644 --- a/src/rust/src/rpolarserr.rs +++ b/src/rust/src/rpolarserr.rs @@ -1,9 +1,6 @@ use std::collections::VecDeque; -use extendr_api::{ - call, extendr, extendr_module, symbol::class_symbol, Attributes, Nullable, Operators, Pairlist, - Robj, Types, R, -}; +use extendr_api::prelude::*; #[derive(Clone, Debug, thiserror::Error, serde::Deserialize, serde::Serialize)] pub enum Rctx { diff --git a/src/rust/src/utils/mod.rs b/src/rust/src/utils/mod.rs index 72b4c1703..f265b4a99 100644 --- a/src/rust/src/utils/mod.rs +++ b/src/rust/src/utils/mod.rs @@ -16,6 +16,7 @@ use extendr_api::CanBeNA; use extendr_api::ExternalPtr; use extendr_api::Result as ExtendrResult; use extendr_api::R; +use crate::eval_string_with_params; use std::any::type_name as tn; use polars::prelude as pl; @@ -742,8 +743,11 @@ pub fn robj_to_rarrow_field(robj: extendr_api::Robj) -> RResult { pub fn robj_to_datatype(robj: extendr_api::Robj) -> RResult { let rv = rdbg(&robj); - let res: ExtendrResult> = robj.try_into(); - let ext_dt = res.bad_val(rv).mistyped(tn::())?; + if rv != "ExternalPtr.set_class([\"RPolarsDataType\"]" { + return Err(RPolarsErr::new().bad_val(rv).mistyped(tn::().to_string()).into()); + } + let res: ExtendrResult<&ExternalPtr> = (&robj).try_into(); + let ext_dt = res?; Ok(RPolarsDataType(ext_dt.0.clone())) } diff --git a/tests/testthat/test-dataframe.R b/tests/testthat/test-dataframe.R index afb67a8ed..f851ac087 100644 --- a/tests/testthat/test-dataframe.R +++ b/tests/testthat/test-dataframe.R @@ -157,10 +157,7 @@ test_that("DataFrame, custom schema", { ) # incorrect datatype expect_grepl_error(pl$DataFrame(x = 1, schema = list(schema = foo))) - expect_grepl_error( - pl$DataFrame(x = 1, schema = list(x = "foo")), - "expected RPolarsDataType" - ) + expect_grepl_error(pl$DataFrame(x = 1, schema = list(x = "foo"))) # wrong variable name in schema expect_grepl_error( @@ -606,11 +603,9 @@ test_that("unnest works correctly", { # wrong input expect_grepl_error( df$unnest("b", pl$col("a_and_c")), - "Input must be a character vector." ) expect_grepl_error( df$unnest(1), - "Input must be a character vector." ) # wrong datatype diff --git a/tests/testthat/test-datatype.R b/tests/testthat/test-datatype.R index 365100be2..06e2f46c7 100644 --- a/tests/testthat/test-datatype.R +++ b/tests/testthat/test-datatype.R @@ -49,11 +49,12 @@ test_that("POSIXct data conversion", { )$to_r() ) + test_tz <- "America/New_York" withr::with_envvar( - new = c(TZ = "America/New_York"), + new = c(TZ = test_tz), { expect_identical( - pl$lit("2022-01-01")$str$strptime(pl$Datetime(), "%F")$to_r(), + pl$lit("2022-01-01")$str$strptime(pl$Datetime(time_zone = test_tz), "%F")$to_r(), as.POSIXct("2022-01-01") ) # TODO: infer timezone from string, change the arugment name from `tz` @@ -70,12 +71,10 @@ test_that("POSIXct data conversion", { as.POSIXct(non_existent_time_chr) ) expect_grepl_error( - pl$lit(non_existent_time_chr)$str$strptime(pl$Datetime(), "%F %T")$to_r(), - "non-existent" + pl$lit(non_existent_time_chr)$str$strptime(pl$Datetime(time_zone = test_tz), "%F %T")$to_r(), ) expect_grepl_error( - pl$lit(ambiguous_time_chr)$str$strptime(pl$Datetime(), "%F %T")$to_r(), - "ambiguous" + pl$lit(ambiguous_time_chr)$str$strptime(pl$Datetime(time_zone = test_tz), "%F %T")$to_r(), ) } ) diff --git a/tests/testthat/test-lazy.R b/tests/testthat/test-lazy.R index 4b9478baf..8e582b1fa 100644 --- a/tests/testthat/test-lazy.R +++ b/tests/testthat/test-lazy.R @@ -77,7 +77,6 @@ test_that("LazyFrame, custom schema", { expect_grepl_error(pl$LazyFrame(x = 1, schema = list(schema = foo))) expect_grepl_error( pl$LazyFrame(x = 1, schema = list(x = "foo")), - "expected RPolarsDataType" ) }) diff --git a/tests/testthat/test-lazy_functions.R b/tests/testthat/test-lazy_functions.R index cacd90345..e319687ed 100644 --- a/tests/testthat/test-lazy_functions.R +++ b/tests/testthat/test-lazy_functions.R @@ -146,8 +146,8 @@ test_that("pl$n_unique", { expr_act = pl$n_unique("bob") expect_true(expr_act$meta$eq(pl$col("bob")$n_unique())) - expect_grepl_error(pl$n_unique(pl$all())) - expect_grepl_error(pl$n_unique(1)) + expect_error(pl$n_unique(pl$all())) + expect_error(pl$n_unique(1)) }) test_that("pl$approx_n_unique", { @@ -160,17 +160,17 @@ test_that("pl$approx_n_unique", { expr_act = pl$approx_n_unique("bob") expect_true(expr_act$meta$eq(pl$col("bob")$approx_n_unique())) - expect_grepl_error(pl$approx_n_unique(pl$all())) - expect_grepl_error(pl$approx_n_unique(1:99)) + expect_error(pl$approx_n_unique(pl$all())) + expect_error(pl$approx_n_unique(1:99)) }) - test_that("pl$head", { df = pl$DataFrame( a = c(1, 8, 3), b = c(4, 5, 2), c = c("foo", "bar", "foo") ) + expect_identical( df$select(pl$head("a"))$to_data_frame()$a, head(df$to_data_frame())$a