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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f8fa4ebaf63f622e06e21085899249ea50edbceed3afa0c378df69bd0bdc8c58
4
- data.tar.gz: 9f02946885241758cb26eff3564a6f386c4fafaa77811627e3af2f5768ea002a
3
+ metadata.gz: b44b6f3ca56a0f4318c361b309c1af213186dcf09e09acbe54561a2dcc920042
4
+ data.tar.gz: 68aa0636e1467e008ec29bbdb43737904b8f0a26f2d91a5169005f896950687f
5
5
  SHA512:
6
- metadata.gz: 67edb7775baaec1f214edd359d1aff1768bceb1b24e3d616b23c2a28f60ae3a7c7d9c68b0a767d99558aa3841b725030452cb9726e0567c7e413f15c3da6562d
7
- data.tar.gz: a704b96748fb53a272964fddcbe8db5ee4615fc4e96cec51e3897ab2e651b84c5429ebc2a50a48568da71e642b728c8f24b0aa46eab62f896f98a8919ec9141b
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
- RClass, RString, Ruby, Value,
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(_value: &Value) -> bool {
52
- // Self::is_io_like(value) && value.respond_to("seek", false).unwrap_or(false)
53
- false
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::is_string_io(&ruby, &value) {
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
- io::SeekFrom::Start(offset) => offset as usize,
116
- io::SeekFrom::Current(offset) => (*original_offset as i64 + offset) as usize,
117
- io::SeekFrom::End(offset) => {
118
- unwrapped_inner.len().saturating_sub(offset as usize)
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("seek", (ruby_offset, whence))
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)
@@ -1,3 +1,3 @@
1
1
  module Parquet
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parquet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Jaremko