parquet 0.3.1 → 0.3.3
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/ext/parquet/src/ruby_reader.rs +20 -31
- data/lib/parquet/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b44b6f3ca56a0f4318c361b309c1af213186dcf09e09acbe54561a2dcc920042
|
4
|
+
data.tar.gz: 68aa0636e1467e008ec29bbdb43737904b8f0a26f2d91a5169005f896950687f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30966ae0335b9caa4458a79e5d627b920f2368605785a978690490a7ed05beb1f7ab25eeeed7349cd3c05b49573dc68405cb8c52af5aad5240a42ce4a56b184b
|
7
|
+
data.tar.gz: 5ea6021844baac3bb31acf41f0fdc3795710f9eff21e9c3556692e70f10398249d802b6f3bb22f414d282f2ff33a2ea951fe9d3040625002752d86311eeae160
|
@@ -1,23 +1,18 @@
|
|
1
1
|
use bytes::Bytes;
|
2
2
|
use magnus::{
|
3
3
|
value::{Opaque, ReprValue},
|
4
|
-
|
4
|
+
RString, Ruby, Value,
|
5
5
|
};
|
6
6
|
use parquet::{
|
7
7
|
errors::ParquetError,
|
8
8
|
file::reader::{ChunkReader, Length},
|
9
9
|
};
|
10
|
-
use std::{
|
11
|
-
fs::File,
|
12
|
-
sync::{Mutex, OnceLock},
|
13
|
-
};
|
10
|
+
use std::{fs::File, sync::Mutex};
|
14
11
|
use std::{
|
15
12
|
io::{self, BufReader, Read, Seek, SeekFrom, Write},
|
16
13
|
sync::Arc,
|
17
14
|
};
|
18
15
|
|
19
|
-
static STRING_IO_CLASS: OnceLock<Opaque<RClass>> = OnceLock::new();
|
20
|
-
|
21
16
|
/// A reader that can handle various Ruby input types (String, StringIO, IO-like objects)
|
22
17
|
/// and provide a standard Read implementation for them.
|
23
18
|
pub enum RubyReader {
|
@@ -34,23 +29,15 @@ pub enum RubyReader {
|
|
34
29
|
}
|
35
30
|
|
36
31
|
impl RubyReader {
|
37
|
-
fn is_string_io(ruby: &Ruby, value: &Value) -> bool {
|
38
|
-
let string_io_class = STRING_IO_CLASS.get_or_init(|| {
|
39
|
-
let class = RClass::from_value(ruby.eval("StringIO").expect("Failed to find StringIO"))
|
40
|
-
.expect("Failed to get StringIO class");
|
41
|
-
Opaque::from(class)
|
42
|
-
});
|
43
|
-
value.is_kind_of(ruby.get_inner(*string_io_class))
|
44
|
-
}
|
45
|
-
|
46
32
|
fn is_io_like(value: &Value) -> bool {
|
47
33
|
value.respond_to("read", false).unwrap_or(false)
|
48
34
|
}
|
49
35
|
|
50
36
|
// For now, don't use this. Having to use seek in length is scary.
|
51
|
-
fn is_seekable_io_like(
|
52
|
-
|
53
|
-
|
37
|
+
fn is_seekable_io_like(value: &Value) -> bool {
|
38
|
+
Self::is_io_like(value)
|
39
|
+
&& value.respond_to("seek", false).unwrap_or(false)
|
40
|
+
&& value.respond_to("pos", false).unwrap_or(false)
|
54
41
|
}
|
55
42
|
}
|
56
43
|
|
@@ -59,13 +46,7 @@ impl TryFrom<Value> for RubyReader {
|
|
59
46
|
|
60
47
|
fn try_from(value: Value) -> Result<Self, Self::Error> {
|
61
48
|
let ruby = unsafe { Ruby::get_unchecked() };
|
62
|
-
if RubyReader::
|
63
|
-
let string_content = value.funcall::<_, _, RString>("string", ())?;
|
64
|
-
Ok(RubyReader::String {
|
65
|
-
inner: Opaque::from(string_content),
|
66
|
-
offset: 0,
|
67
|
-
})
|
68
|
-
} else if RubyReader::is_seekable_io_like(&value) {
|
49
|
+
if RubyReader::is_seekable_io_like(&value) {
|
69
50
|
Ok(RubyReader::RubyIoLike {
|
70
51
|
inner: Opaque::from(value),
|
71
52
|
})
|
@@ -112,10 +93,14 @@ impl Seek for RubyReader {
|
|
112
93
|
let unwrapped_inner = ruby.get_inner(*inner);
|
113
94
|
|
114
95
|
let new_offset = match pos {
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
96
|
+
SeekFrom::Start(off) => off as usize,
|
97
|
+
SeekFrom::Current(off) => {
|
98
|
+
let signed = *original_offset as i64 + off;
|
99
|
+
signed.max(0) as usize
|
100
|
+
}
|
101
|
+
SeekFrom::End(off) => {
|
102
|
+
let signed = unwrapped_inner.len() as i64 + off;
|
103
|
+
signed.max(0) as usize
|
119
104
|
}
|
120
105
|
};
|
121
106
|
|
@@ -131,8 +116,12 @@ impl Seek for RubyReader {
|
|
131
116
|
SeekFrom::End(i) => (2, i),
|
132
117
|
};
|
133
118
|
|
119
|
+
unwrapped_inner
|
120
|
+
.funcall::<_, _, u64>("seek", (ruby_offset, whence))
|
121
|
+
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?;
|
122
|
+
|
134
123
|
let new_position = unwrapped_inner
|
135
|
-
.funcall("
|
124
|
+
.funcall::<_, _, u64>("pos", ())
|
136
125
|
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?;
|
137
126
|
|
138
127
|
Ok(new_position)
|
data/lib/parquet/version.rb
CHANGED