polars-df 0.15.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +274 -0
- data/Cargo.lock +1465 -867
- data/Cargo.toml +3 -0
- data/LICENSE.txt +2 -2
- data/README.md +87 -37
- data/ext/polars/Cargo.toml +47 -16
- data/ext/polars/src/c_api/allocator.rs +7 -0
- data/ext/polars/src/c_api/mod.rs +1 -0
- data/ext/polars/src/catalog/mod.rs +1 -0
- data/ext/polars/src/catalog/unity.rs +470 -0
- data/ext/polars/src/conversion/any_value.rs +99 -84
- data/ext/polars/src/conversion/categorical.rs +30 -0
- data/ext/polars/src/conversion/chunked_array.rs +71 -62
- data/ext/polars/src/conversion/datetime.rs +63 -0
- data/ext/polars/src/conversion/mod.rs +796 -312
- data/ext/polars/src/dataframe/construction.rs +6 -18
- data/ext/polars/src/dataframe/export.rs +30 -39
- data/ext/polars/src/dataframe/general.rs +294 -362
- data/ext/polars/src/dataframe/io.rs +33 -150
- data/ext/polars/src/dataframe/map.rs +175 -0
- data/ext/polars/src/dataframe/mod.rs +37 -5
- data/ext/polars/src/dataframe/serde.rs +23 -8
- data/ext/polars/src/error.rs +44 -7
- data/ext/polars/src/exceptions.rs +21 -8
- data/ext/polars/src/expr/array.rs +86 -22
- data/ext/polars/src/expr/binary.rs +50 -1
- data/ext/polars/src/expr/bitwise.rs +39 -0
- data/ext/polars/src/expr/categorical.rs +20 -0
- data/ext/polars/src/expr/datatype.rs +51 -0
- data/ext/polars/src/expr/datetime.rs +99 -41
- data/ext/polars/src/expr/extension.rs +12 -0
- data/ext/polars/src/expr/general.rs +252 -128
- data/ext/polars/src/expr/list.rs +56 -60
- data/ext/polars/src/expr/meta.rs +30 -35
- data/ext/polars/src/expr/mod.rs +28 -6
- data/ext/polars/src/expr/name.rs +29 -14
- data/ext/polars/src/expr/rolling.rs +111 -3
- data/ext/polars/src/expr/selector.rs +219 -0
- data/ext/polars/src/expr/serde.rs +28 -0
- data/ext/polars/src/expr/string.rs +118 -20
- data/ext/polars/src/expr/struct.rs +14 -1
- data/ext/polars/src/file.rs +194 -86
- data/ext/polars/src/functions/aggregation.rs +13 -12
- data/ext/polars/src/functions/business.rs +2 -3
- data/ext/polars/src/functions/eager.rs +3 -2
- data/ext/polars/src/functions/io.rs +90 -18
- data/ext/polars/src/functions/lazy.rs +267 -118
- data/ext/polars/src/functions/meta.rs +8 -7
- data/ext/polars/src/functions/misc.rs +1 -1
- data/ext/polars/src/functions/mod.rs +2 -1
- data/ext/polars/src/functions/range.rs +88 -31
- data/ext/polars/src/functions/strings.rs +6 -0
- data/ext/polars/src/functions/utils.rs +8 -0
- data/ext/polars/src/interop/arrow/mod.rs +52 -1
- data/ext/polars/src/interop/arrow/{to_ruby.rs → to_rb.rs} +37 -7
- data/ext/polars/src/interop/arrow/to_rust.rs +43 -0
- data/ext/polars/src/interop/numo/to_numo_df.rs +1 -1
- data/ext/polars/src/interop/numo/to_numo_series.rs +72 -50
- data/ext/polars/src/io/cloud_options.rs +107 -0
- data/ext/polars/src/io/mod.rs +4 -0
- data/ext/polars/src/io/scan_options.rs +113 -0
- data/ext/polars/src/io/sink_options.rs +46 -0
- data/ext/polars/src/io/sink_output.rs +21 -0
- data/ext/polars/src/lazyframe/exitable.rs +39 -0
- data/ext/polars/src/lazyframe/general.rs +846 -368
- data/ext/polars/src/lazyframe/mod.rs +58 -5
- data/ext/polars/src/lazyframe/optflags.rs +59 -0
- data/ext/polars/src/lazyframe/serde.rs +36 -4
- data/ext/polars/src/lazyframe/sink.rs +46 -0
- data/ext/polars/src/lazygroupby.rs +38 -9
- data/ext/polars/src/lib.rs +574 -165
- data/ext/polars/src/map/lazy.rs +44 -74
- data/ext/polars/src/map/mod.rs +18 -254
- data/ext/polars/src/map/series.rs +241 -1087
- data/ext/polars/src/on_startup.rs +192 -9
- data/ext/polars/src/prelude.rs +1 -0
- data/ext/polars/src/rb_modules.rs +10 -57
- data/ext/polars/src/ruby/exceptions.rs +26 -0
- data/ext/polars/src/ruby/gvl.rs +104 -0
- data/ext/polars/src/ruby/lazy.rs +46 -0
- data/ext/polars/src/ruby/mod.rs +11 -0
- data/ext/polars/src/ruby/numo.rs +52 -0
- data/ext/polars/src/ruby/plan_callback.rs +198 -0
- data/ext/polars/src/ruby/rb_modules.rs +16 -0
- data/ext/polars/src/ruby/ruby_convert_registry.rs +51 -0
- data/ext/polars/src/ruby/ruby_function.rs +11 -0
- data/ext/polars/src/ruby/ruby_udf.rs +164 -0
- data/ext/polars/src/ruby/thread.rs +65 -0
- data/ext/polars/src/ruby/utils.rs +39 -0
- data/ext/polars/src/series/aggregation.rs +116 -91
- data/ext/polars/src/series/arithmetic.rs +16 -22
- data/ext/polars/src/series/comparison.rs +101 -222
- data/ext/polars/src/series/construction.rs +80 -70
- data/ext/polars/src/series/export.rs +98 -56
- data/ext/polars/src/series/general.rs +323 -440
- data/ext/polars/src/series/import.rs +22 -5
- data/ext/polars/src/series/map.rs +103 -0
- data/ext/polars/src/series/mod.rs +57 -15
- data/ext/polars/src/series/scatter.rs +139 -82
- data/ext/polars/src/sql.rs +16 -9
- data/ext/polars/src/testing/frame.rs +31 -0
- data/ext/polars/src/testing/mod.rs +5 -0
- data/ext/polars/src/testing/series.rs +31 -0
- data/ext/polars/src/timeout.rs +105 -0
- data/ext/polars/src/utils.rs +105 -4
- data/lib/polars/array_expr.rb +500 -22
- data/lib/polars/array_name_space.rb +384 -10
- data/lib/polars/batched_csv_reader.rb +48 -66
- data/lib/polars/binary_expr.rb +217 -0
- data/lib/polars/binary_name_space.rb +155 -1
- data/lib/polars/cat_expr.rb +224 -0
- data/lib/polars/cat_name_space.rb +132 -32
- data/lib/polars/catalog/unity/catalog_info.rb +20 -0
- data/lib/polars/catalog/unity/column_info.rb +31 -0
- data/lib/polars/catalog/unity/namespace_info.rb +21 -0
- data/lib/polars/catalog/unity/table_info.rb +50 -0
- data/lib/polars/catalog.rb +448 -0
- data/lib/polars/collect_batches.rb +22 -0
- data/lib/polars/config.rb +3 -3
- data/lib/polars/convert.rb +201 -36
- data/lib/polars/data_frame.rb +2851 -1017
- data/lib/polars/data_frame_plot.rb +173 -0
- data/lib/polars/data_type_expr.rb +52 -0
- data/lib/polars/data_type_group.rb +6 -0
- data/lib/polars/data_types.rb +118 -18
- data/lib/polars/date_time_expr.rb +426 -84
- data/lib/polars/date_time_name_space.rb +384 -111
- data/lib/polars/dynamic_group_by.rb +102 -10
- data/lib/polars/exceptions.rb +50 -5
- data/lib/polars/expr.rb +2159 -915
- data/lib/polars/extension_expr.rb +39 -0
- data/lib/polars/extension_name_space.rb +39 -0
- data/lib/polars/functions/aggregation/horizontal.rb +11 -6
- data/lib/polars/functions/aggregation/vertical.rb +2 -3
- data/lib/polars/functions/as_datatype.rb +290 -8
- data/lib/polars/functions/business.rb +95 -0
- data/lib/polars/functions/col.rb +6 -5
- data/lib/polars/functions/datatype.rb +62 -0
- data/lib/polars/functions/eager.rb +426 -24
- data/lib/polars/functions/escape_regex.rb +21 -0
- data/lib/polars/functions/lazy.rb +813 -195
- data/lib/polars/functions/lit.rb +21 -10
- data/lib/polars/functions/range/int_range.rb +74 -2
- data/lib/polars/functions/range/linear_space.rb +195 -0
- data/lib/polars/functions/range/time_range.rb +1 -1
- data/lib/polars/functions/repeat.rb +7 -12
- data/lib/polars/functions/whenthen.rb +2 -2
- data/lib/polars/group_by.rb +188 -58
- data/lib/polars/iceberg_dataset.rb +108 -0
- data/lib/polars/in_process_query.rb +37 -0
- data/lib/polars/io/cloud.rb +18 -0
- data/lib/polars/io/csv.rb +336 -128
- data/lib/polars/io/database.rb +19 -4
- data/lib/polars/io/delta.rb +134 -0
- data/lib/polars/io/iceberg.rb +34 -0
- data/lib/polars/io/ipc.rb +63 -63
- data/lib/polars/io/json.rb +16 -0
- data/lib/polars/io/lines.rb +172 -0
- data/lib/polars/io/ndjson.rb +176 -20
- data/lib/polars/io/parquet.rb +173 -95
- data/lib/polars/io/scan_options.rb +55 -0
- data/lib/polars/io/sink_options.rb +27 -0
- data/lib/polars/io/utils.rb +17 -0
- data/lib/polars/lazy_frame.rb +3017 -622
- data/lib/polars/lazy_group_by.rb +436 -2
- data/lib/polars/list_expr.rb +551 -59
- data/lib/polars/list_name_space.rb +465 -51
- data/lib/polars/meta_expr.rb +146 -24
- data/lib/polars/name_expr.rb +87 -2
- data/lib/polars/query_opt_flags.rb +264 -0
- data/lib/polars/rolling_group_by.rb +90 -5
- data/lib/polars/scan_cast_options.rb +86 -0
- data/lib/polars/schema.rb +128 -0
- data/lib/polars/selector.rb +245 -0
- data/lib/polars/selectors.rb +1048 -201
- data/lib/polars/series.rb +2522 -774
- data/lib/polars/series_plot.rb +72 -0
- data/lib/polars/slice.rb +1 -1
- data/lib/polars/sql_context.rb +13 -6
- data/lib/polars/string_cache.rb +19 -72
- data/lib/polars/string_expr.rb +561 -107
- data/lib/polars/string_name_space.rb +781 -109
- data/lib/polars/struct_expr.rb +139 -18
- data/lib/polars/struct_name_space.rb +19 -1
- data/lib/polars/testing.rb +24 -273
- data/lib/polars/utils/constants.rb +2 -0
- data/lib/polars/utils/construction/data_frame.rb +410 -0
- data/lib/polars/utils/construction/series.rb +350 -0
- data/lib/polars/utils/construction/utils.rb +9 -0
- data/lib/polars/utils/convert.rb +18 -8
- data/lib/polars/utils/deprecation.rb +11 -0
- data/lib/polars/utils/parse.rb +62 -9
- data/lib/polars/utils/reduce_balanced.rb +43 -0
- data/lib/polars/utils/serde.rb +22 -0
- data/lib/polars/utils/unstable.rb +19 -0
- data/lib/polars/utils/various.rb +86 -1
- data/lib/polars/utils.rb +63 -48
- data/lib/polars/version.rb +1 -1
- data/lib/polars.rb +85 -2
- metadata +80 -28
- data/ext/polars/src/allocator.rs +0 -13
- data/ext/polars/src/batched_csv.rs +0 -138
- data/ext/polars/src/functions/string_cache.rs +0 -25
- data/ext/polars/src/map/dataframe.rs +0 -338
- data/lib/polars/plot.rb +0 -109
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
//! A global process-aborting timeout system, mainly intended for testing.
|
|
2
|
+
|
|
3
|
+
use std::cmp::Reverse;
|
|
4
|
+
use std::collections::BinaryHeap;
|
|
5
|
+
use std::sync::LazyLock;
|
|
6
|
+
use std::sync::mpsc::{Receiver, RecvTimeoutError, Sender, channel};
|
|
7
|
+
use std::time::Duration;
|
|
8
|
+
|
|
9
|
+
use polars::prelude::{InitHashMaps, PlHashSet};
|
|
10
|
+
use polars_utils::priority::Priority;
|
|
11
|
+
use polars_utils::relaxed_cell::RelaxedCell;
|
|
12
|
+
|
|
13
|
+
static TIMEOUT_REQUEST_HANDLER: LazyLock<Sender<TimeoutRequest>> = LazyLock::new(|| {
|
|
14
|
+
let (send, recv) = channel();
|
|
15
|
+
std::thread::Builder::new()
|
|
16
|
+
.name("polars-timeout".to_string())
|
|
17
|
+
.spawn(move || timeout_thread(recv))
|
|
18
|
+
.unwrap();
|
|
19
|
+
send
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
enum TimeoutRequest {
|
|
23
|
+
Start(Duration, u64),
|
|
24
|
+
Cancel(u64),
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
pub fn get_timeout() -> Option<Duration> {
|
|
28
|
+
static TIMEOUT_DISABLED: RelaxedCell<bool> = RelaxedCell::new_bool(false);
|
|
29
|
+
|
|
30
|
+
// Fast path so we don't have to keep checking environment variables. Make
|
|
31
|
+
// sure that if you want to use POLARS_TIMEOUT_MS it is set before the first
|
|
32
|
+
// polars call.
|
|
33
|
+
if TIMEOUT_DISABLED.load() {
|
|
34
|
+
return None;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let Ok(timeout) = std::env::var("POLARS_TIMEOUT_MS") else {
|
|
38
|
+
TIMEOUT_DISABLED.store(true);
|
|
39
|
+
return None;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
match timeout.parse() {
|
|
43
|
+
Ok(ms) => Some(Duration::from_millis(ms)),
|
|
44
|
+
Err(e) => {
|
|
45
|
+
eprintln!("failed to parse POLARS_TIMEOUT_MS: {e:?}");
|
|
46
|
+
None
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
fn timeout_thread(recv: Receiver<TimeoutRequest>) {
|
|
52
|
+
let mut active_timeouts: PlHashSet<u64> = PlHashSet::new();
|
|
53
|
+
let mut shortest_timeout: BinaryHeap<Priority<Reverse<Duration>, u64>> = BinaryHeap::new();
|
|
54
|
+
loop {
|
|
55
|
+
// Remove cancelled requests.
|
|
56
|
+
while let Some(Priority(_, id)) = shortest_timeout.peek() {
|
|
57
|
+
if active_timeouts.contains(id) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
shortest_timeout.pop();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let request = if let Some(Priority(timeout, _)) = shortest_timeout.peek() {
|
|
64
|
+
match recv.recv_timeout(timeout.0) {
|
|
65
|
+
Err(RecvTimeoutError::Timeout) => {
|
|
66
|
+
eprintln!("exiting the process, POLARS_TIMEOUT_MS exceeded");
|
|
67
|
+
std::thread::sleep(Duration::from_secs_f64(1.0));
|
|
68
|
+
std::process::exit(1);
|
|
69
|
+
}
|
|
70
|
+
r => r.unwrap(),
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
recv.recv().unwrap()
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
match request {
|
|
77
|
+
TimeoutRequest::Start(duration, id) => {
|
|
78
|
+
shortest_timeout.push(Priority(Reverse(duration), id));
|
|
79
|
+
active_timeouts.insert(id);
|
|
80
|
+
}
|
|
81
|
+
TimeoutRequest::Cancel(id) => {
|
|
82
|
+
active_timeouts.remove(&id);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
pub fn schedule_polars_timeout() -> Option<u64> {
|
|
89
|
+
static TIMEOUT_ID: RelaxedCell<u64> = RelaxedCell::new_u64(0);
|
|
90
|
+
|
|
91
|
+
let timeout = get_timeout()?;
|
|
92
|
+
let id = TIMEOUT_ID.fetch_add(1);
|
|
93
|
+
TIMEOUT_REQUEST_HANDLER
|
|
94
|
+
.send(TimeoutRequest::Start(timeout, id))
|
|
95
|
+
.unwrap();
|
|
96
|
+
Some(id)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
pub fn cancel_polars_timeout(opt_id: Option<u64>) {
|
|
100
|
+
if let Some(id) = opt_id {
|
|
101
|
+
TIMEOUT_REQUEST_HANDLER
|
|
102
|
+
.send(TimeoutRequest::Cancel(id))
|
|
103
|
+
.unwrap();
|
|
104
|
+
}
|
|
105
|
+
}
|
data/ext/polars/src/utils.rs
CHANGED
|
@@ -1,24 +1,125 @@
|
|
|
1
|
+
use std::panic::AssertUnwindSafe;
|
|
2
|
+
|
|
3
|
+
use magnus::Ruby;
|
|
4
|
+
use polars::frame::DataFrame;
|
|
5
|
+
use polars::series::IntoSeries;
|
|
6
|
+
use polars_error::PolarsResult;
|
|
7
|
+
use polars_error::signals::{KeyboardInterrupt, catch_keyboard_interrupt};
|
|
8
|
+
|
|
9
|
+
use crate::ruby::exceptions::RbKeyboardInterrupt;
|
|
10
|
+
use crate::ruby::gvl::GvlExt;
|
|
11
|
+
use crate::timeout::{cancel_polars_timeout, schedule_polars_timeout};
|
|
12
|
+
use crate::{RbDataFrame, RbErr, RbPolarsErr, RbResult, RbSeries};
|
|
13
|
+
|
|
1
14
|
#[macro_export]
|
|
2
|
-
macro_rules!
|
|
15
|
+
macro_rules! apply_all_polars_dtypes {
|
|
3
16
|
($self:expr, $method:ident, $($args:expr),*) => {
|
|
4
17
|
match $self.dtype() {
|
|
5
18
|
DataType::Boolean => $self.bool().unwrap().$method($($args),*),
|
|
6
|
-
DataType::String => $self.str().unwrap().$method($($args),*),
|
|
7
19
|
DataType::UInt8 => $self.u8().unwrap().$method($($args),*),
|
|
8
20
|
DataType::UInt16 => $self.u16().unwrap().$method($($args),*),
|
|
9
21
|
DataType::UInt32 => $self.u32().unwrap().$method($($args),*),
|
|
10
22
|
DataType::UInt64 => $self.u64().unwrap().$method($($args),*),
|
|
23
|
+
DataType::UInt128 => $self.u128().unwrap().$method($($args),*),
|
|
11
24
|
DataType::Int8 => $self.i8().unwrap().$method($($args),*),
|
|
12
25
|
DataType::Int16 => $self.i16().unwrap().$method($($args),*),
|
|
13
26
|
DataType::Int32 => $self.i32().unwrap().$method($($args),*),
|
|
14
27
|
DataType::Int64 => $self.i64().unwrap().$method($($args),*),
|
|
28
|
+
DataType::Int128 => $self.i128().unwrap().$method($($args),*),
|
|
29
|
+
DataType::Float16 => $self.cast(&DataType::Float32).unwrap().f32().unwrap().$method($($args),*),
|
|
15
30
|
DataType::Float32 => $self.f32().unwrap().$method($($args),*),
|
|
16
31
|
DataType::Float64 => $self.f64().unwrap().$method($($args),*),
|
|
32
|
+
DataType::String => $self.str().unwrap().$method($($args),*),
|
|
33
|
+
DataType::Binary => $self.binary().unwrap().$method($($args),*),
|
|
34
|
+
DataType::Decimal(_, _) => $self.decimal().unwrap().$method($($args),*),
|
|
35
|
+
|
|
17
36
|
DataType::Date => $self.date().unwrap().$method($($args),*),
|
|
18
37
|
DataType::Datetime(_, _) => $self.datetime().unwrap().$method($($args),*),
|
|
19
|
-
|
|
38
|
+
DataType::Duration(_) => $self.duration().unwrap().$method($($args),*),
|
|
39
|
+
DataType::Time => $self.time().unwrap().$method($($args),*),
|
|
40
|
+
|
|
41
|
+
DataType::List(_) => $self.list().unwrap().$method($($args),*),
|
|
20
42
|
DataType::Struct(_) => $self.struct_().unwrap().$method($($args),*),
|
|
21
|
-
|
|
43
|
+
DataType::Array(_, _) => $self.array().unwrap().$method($($args),*),
|
|
44
|
+
|
|
45
|
+
dt @ (DataType::Categorical(_, _) | DataType::Enum(_, _)) => match dt.cat_physical().unwrap() {
|
|
46
|
+
CategoricalPhysical::U8 => $self.cat8().unwrap().$method($($args),*),
|
|
47
|
+
CategoricalPhysical::U16 => $self.cat16().unwrap().$method($($args),*),
|
|
48
|
+
CategoricalPhysical::U32 => $self.cat32().unwrap().$method($($args),*),
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
DataType::Object(_) => {
|
|
52
|
+
$self
|
|
53
|
+
.as_any()
|
|
54
|
+
.downcast_ref::<ObjectChunked<ObjectValue>>()
|
|
55
|
+
.unwrap()
|
|
56
|
+
.$method($($args),*)
|
|
57
|
+
},
|
|
58
|
+
DataType::Extension(_, _) => $self.ext().unwrap().$method($($args),*),
|
|
59
|
+
|
|
60
|
+
DataType::Null => $self.null().unwrap().$method($($args),*),
|
|
61
|
+
|
|
62
|
+
dt @ (DataType::BinaryOffset | DataType::Unknown(_)) => panic!("dtype {:?} not supported", dt)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// Boilerplate for `|e| RbPolarsErr::from(e).into()`
|
|
68
|
+
pub(crate) fn to_rb_err<E: Into<RbPolarsErr>>(e: E) -> RbErr {
|
|
69
|
+
e.into().into()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
pub trait EnterPolarsExt {
|
|
73
|
+
fn enter_polars<T, E, F>(self, f: F) -> RbResult<T>
|
|
74
|
+
where
|
|
75
|
+
F: Send + FnOnce() -> Result<T, E>,
|
|
76
|
+
T: Send,
|
|
77
|
+
E: Send + Into<RbPolarsErr>;
|
|
78
|
+
|
|
79
|
+
#[inline(always)]
|
|
80
|
+
fn enter_polars_ok<T, F>(self, f: F) -> RbResult<T>
|
|
81
|
+
where
|
|
82
|
+
Self: Sized,
|
|
83
|
+
F: Send + FnOnce() -> T,
|
|
84
|
+
T: Send,
|
|
85
|
+
{
|
|
86
|
+
self.enter_polars(move || PolarsResult::Ok(f()))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#[inline(always)]
|
|
90
|
+
fn enter_polars_df<F>(self, f: F) -> RbResult<RbDataFrame>
|
|
91
|
+
where
|
|
92
|
+
Self: Sized,
|
|
93
|
+
F: Send + FnOnce() -> PolarsResult<DataFrame>,
|
|
94
|
+
{
|
|
95
|
+
self.enter_polars(f).map(RbDataFrame::new)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#[inline(always)]
|
|
99
|
+
fn enter_polars_series<T, F>(self, f: F) -> RbResult<RbSeries>
|
|
100
|
+
where
|
|
101
|
+
Self: Sized,
|
|
102
|
+
T: Send + IntoSeries,
|
|
103
|
+
F: Send + FnOnce() -> PolarsResult<T>,
|
|
104
|
+
{
|
|
105
|
+
self.enter_polars(f).map(|s| RbSeries::new(s.into_series()))
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
impl EnterPolarsExt for &Ruby {
|
|
110
|
+
fn enter_polars<T, E, F>(self, f: F) -> RbResult<T>
|
|
111
|
+
where
|
|
112
|
+
F: Send + FnOnce() -> Result<T, E>,
|
|
113
|
+
T: Send,
|
|
114
|
+
E: Send + Into<RbPolarsErr>,
|
|
115
|
+
{
|
|
116
|
+
let timeout = schedule_polars_timeout();
|
|
117
|
+
let ret = self.detach(|| catch_keyboard_interrupt(AssertUnwindSafe(f)));
|
|
118
|
+
cancel_polars_timeout(timeout);
|
|
119
|
+
match ret {
|
|
120
|
+
Ok(Ok(ret)) => Ok(ret),
|
|
121
|
+
Ok(Err(err)) => Err(RbErr::from(err.into())),
|
|
122
|
+
Err(KeyboardInterrupt) => Err(RbKeyboardInterrupt::new_err("")),
|
|
22
123
|
}
|
|
23
124
|
}
|
|
24
125
|
}
|