red-arrow-pycall 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/doc/text/news.md +20 -0
- data/ext/arrow-pycall/arrow-pycall.cpp +242 -48
- data/ext/arrow-pycall/extconf.rb +9 -1
- data/lib/arrow-pycall.rb +42 -21
- data/lib/arrow-pycall/version.rb +2 -2
- data/pycall-version +1 -0
- data/red-arrow-pycall.gemspec +8 -3
- data/test/test-to-python.rb +18 -18
- data/test/test-to-ruby.rb +99 -0
- metadata +8 -6
- data/lib/arrow-pycall/convertable.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f44174f03927e0a2c9c00306703c6d371787c1ff
|
4
|
+
data.tar.gz: 112085a608bd1fdc3ac523d73f4bb67eefae9f78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 535bb8bb7b4bee42750dee53e4417b74f6503bbb8f22d205f8bcb01e1c4dfb5547f5fce0d61cf08a30c2341b781eedcc68b381cbdc83ec625e28a3af9e6e4683
|
7
|
+
data.tar.gz: 2ef2a6bfff37eeccdafb446eb70e666c73bb01e85a3d7ccd7bb60e36bdd23a0a86953a8df0c2c0f54c2a4b403f1cb4965bd86bb9f47062e0d740bf4d82cf27e8
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 0.0.4 - 2018-03-07
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* Added PyCall 1.1.0 support.
|
8
|
+
|
9
|
+
## 0.0.3 - 2017-07-13
|
10
|
+
|
11
|
+
### Improvements
|
12
|
+
|
13
|
+
* Supported `sizeof(void *) > sizeof(long)` platform such as Windows
|
14
|
+
x64.
|
15
|
+
[GitHub#1][Patch by Kenta Murata]
|
16
|
+
|
17
|
+
* Added `#to_ruby`.
|
18
|
+
|
19
|
+
### Thanks
|
20
|
+
|
21
|
+
* Kenta Murata
|
22
|
+
|
3
23
|
## 0.0.2 - 2017-07-08
|
4
24
|
|
5
25
|
### Fixes
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright 2017 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
* Copyright 2017-2018 Kouhei Sutou <kou@clear-code.com>
|
3
3
|
*
|
4
4
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
* you may not use this file except in compliance with the License.
|
@@ -20,87 +20,215 @@
|
|
20
20
|
|
21
21
|
#include <arrow/python/pyarrow.h>
|
22
22
|
|
23
|
-
|
23
|
+
#include <pycall.h>
|
24
|
+
|
25
|
+
namespace {
|
26
|
+
inline VALUE to_ruby(PyObject *py_object) {
|
27
|
+
return pycall_pyobject_to_ruby(py_object);
|
28
|
+
}
|
29
|
+
|
30
|
+
inline PyObject *to_python(VALUE rb_object) {
|
31
|
+
return pycall_pyobject_wrapper_get_pyobj_ptr(rb_object);
|
32
|
+
}
|
33
|
+
}
|
24
34
|
|
25
35
|
static VALUE
|
26
|
-
|
36
|
+
rb_arrow_buffer_to_python(VALUE self)
|
27
37
|
{
|
28
38
|
auto buffer = GARROW_BUFFER(RVAL2GOBJ(self));
|
29
39
|
auto arrow_buffer = garrow_buffer_get_raw(buffer);
|
30
40
|
auto py_buffer = arrow::py::wrap_buffer(arrow_buffer);
|
31
|
-
return
|
41
|
+
return to_ruby(py_buffer);
|
42
|
+
}
|
43
|
+
|
44
|
+
static VALUE
|
45
|
+
rb_pycall_arrow_buffer_to_ruby(VALUE self)
|
46
|
+
{
|
47
|
+
auto py_buffer = to_python(self);
|
48
|
+
std::shared_ptr<arrow::Buffer> arrow_buffer;
|
49
|
+
auto status = arrow::py::unwrap_buffer(py_buffer, &arrow_buffer);
|
50
|
+
GError *error = NULL;
|
51
|
+
if (!garrow_error_check(&error, status, "[pyarrow][buffer][to-ruby]"))
|
52
|
+
RG_RAISE_ERROR(error);
|
53
|
+
auto garrow_buffer = garrow_buffer_new_raw(&arrow_buffer);
|
54
|
+
return GOBJ2RVAL(garrow_buffer);
|
32
55
|
}
|
33
56
|
|
34
57
|
static VALUE
|
35
|
-
|
58
|
+
rb_arrow_data_type_to_python(VALUE self)
|
36
59
|
{
|
37
60
|
auto data_type = GARROW_DATA_TYPE(RVAL2GOBJ(self));
|
38
61
|
auto arrow_data_type = garrow_data_type_get_raw(data_type);
|
39
62
|
auto py_data_type = arrow::py::wrap_data_type(arrow_data_type);
|
40
|
-
return
|
63
|
+
return to_ruby(py_data_type);
|
41
64
|
}
|
42
65
|
|
43
66
|
static VALUE
|
44
|
-
|
67
|
+
rb_pycall_arrow_data_type_to_ruby(VALUE self)
|
68
|
+
{
|
69
|
+
auto py_data_type = to_python(self);
|
70
|
+
std::shared_ptr<arrow::DataType> arrow_data_type;
|
71
|
+
auto status = arrow::py::unwrap_data_type(py_data_type, &arrow_data_type);
|
72
|
+
GError *error = NULL;
|
73
|
+
if (!garrow_error_check(&error, status, "[pyarrow][data-type][to-ruby]"))
|
74
|
+
RG_RAISE_ERROR(error);
|
75
|
+
auto garrow_data_type = garrow_data_type_new_raw(&arrow_data_type);
|
76
|
+
return GOBJ2RVAL(garrow_data_type);
|
77
|
+
}
|
78
|
+
|
79
|
+
static VALUE
|
80
|
+
rb_arrow_field_to_python(VALUE self)
|
45
81
|
{
|
46
82
|
auto field = GARROW_FIELD(RVAL2GOBJ(self));
|
47
83
|
auto arrow_field = garrow_field_get_raw(field);
|
48
84
|
auto py_field = arrow::py::wrap_field(arrow_field);
|
49
|
-
return
|
85
|
+
return to_ruby(py_field);
|
86
|
+
}
|
87
|
+
|
88
|
+
static VALUE
|
89
|
+
rb_pycall_arrow_field_to_ruby(VALUE self)
|
90
|
+
{
|
91
|
+
auto py_field = to_python(self);
|
92
|
+
std::shared_ptr<arrow::Field> arrow_field;
|
93
|
+
auto status = arrow::py::unwrap_field(py_field, &arrow_field);
|
94
|
+
GError *error = NULL;
|
95
|
+
if (!garrow_error_check(&error, status, "[pyarrow][field][to-ruby]"))
|
96
|
+
RG_RAISE_ERROR(error);
|
97
|
+
auto garrow_field = garrow_field_new_raw(&arrow_field);
|
98
|
+
return GOBJ2RVAL(garrow_field);
|
50
99
|
}
|
51
100
|
|
52
101
|
static VALUE
|
53
|
-
|
102
|
+
rb_arrow_schema_to_python(VALUE self)
|
54
103
|
{
|
55
104
|
auto schema = GARROW_SCHEMA(RVAL2GOBJ(self));
|
56
105
|
auto arrow_schema = garrow_schema_get_raw(schema);
|
57
106
|
auto py_schema = arrow::py::wrap_schema(arrow_schema);
|
58
|
-
return
|
107
|
+
return to_ruby(py_schema);
|
59
108
|
}
|
60
109
|
|
61
110
|
static VALUE
|
62
|
-
|
111
|
+
rb_pycall_arrow_schema_to_ruby(VALUE self)
|
112
|
+
{
|
113
|
+
auto py_schema = to_python(self);
|
114
|
+
std::shared_ptr<arrow::Schema> arrow_schema;
|
115
|
+
auto status = arrow::py::unwrap_schema(py_schema, &arrow_schema);
|
116
|
+
GError *error = NULL;
|
117
|
+
if (!garrow_error_check(&error, status, "[pyarrow][schema][to-ruby]"))
|
118
|
+
RG_RAISE_ERROR(error);
|
119
|
+
auto garrow_schema = garrow_schema_new_raw(&arrow_schema);
|
120
|
+
return GOBJ2RVAL(garrow_schema);
|
121
|
+
}
|
122
|
+
|
123
|
+
static VALUE
|
124
|
+
rb_arrow_array_to_python(VALUE self)
|
63
125
|
{
|
64
126
|
auto array = GARROW_ARRAY(RVAL2GOBJ(self));
|
65
127
|
auto arrow_array = garrow_array_get_raw(array);
|
66
128
|
auto py_array = arrow::py::wrap_array(arrow_array);
|
67
|
-
return
|
129
|
+
return to_ruby(py_array);
|
68
130
|
}
|
69
131
|
|
70
132
|
static VALUE
|
71
|
-
|
133
|
+
rb_pycall_arrow_array_to_ruby(VALUE self)
|
134
|
+
{
|
135
|
+
auto py_array = to_python(self);
|
136
|
+
std::shared_ptr<arrow::Array> arrow_array;
|
137
|
+
auto status = arrow::py::unwrap_array(py_array, &arrow_array);
|
138
|
+
GError *error = NULL;
|
139
|
+
if (!garrow_error_check(&error, status, "[pyarrow][array][to-ruby]"))
|
140
|
+
RG_RAISE_ERROR(error);
|
141
|
+
auto garrow_array = garrow_array_new_raw(&arrow_array);
|
142
|
+
return GOBJ2RVAL(garrow_array);
|
143
|
+
}
|
144
|
+
|
145
|
+
static VALUE
|
146
|
+
rb_arrow_tensor_to_python(VALUE self)
|
72
147
|
{
|
73
148
|
auto tensor = GARROW_TENSOR(RVAL2GOBJ(self));
|
74
149
|
auto arrow_tensor = garrow_tensor_get_raw(tensor);
|
75
150
|
auto py_tensor = arrow::py::wrap_tensor(arrow_tensor);
|
76
|
-
return
|
151
|
+
return to_ruby(py_tensor);
|
77
152
|
}
|
78
153
|
|
79
154
|
static VALUE
|
80
|
-
|
155
|
+
rb_pycall_arrow_tensor_to_ruby(VALUE self)
|
156
|
+
{
|
157
|
+
auto py_tensor = to_python(self);
|
158
|
+
std::shared_ptr<arrow::Tensor> arrow_tensor;
|
159
|
+
auto status = arrow::py::unwrap_tensor(py_tensor, &arrow_tensor);
|
160
|
+
GError *error = NULL;
|
161
|
+
if (!garrow_error_check(&error, status, "[pyarrow][tensor][to-ruby]"))
|
162
|
+
RG_RAISE_ERROR(error);
|
163
|
+
auto garrow_tensor = garrow_tensor_new_raw(&arrow_tensor);
|
164
|
+
return GOBJ2RVAL(garrow_tensor);
|
165
|
+
}
|
166
|
+
|
167
|
+
static VALUE
|
168
|
+
rb_arrow_column_to_python(VALUE self)
|
81
169
|
{
|
82
170
|
auto column = GARROW_COLUMN(RVAL2GOBJ(self));
|
83
171
|
auto arrow_column = garrow_column_get_raw(column);
|
84
172
|
auto py_column = arrow::py::wrap_column(arrow_column);
|
85
|
-
return
|
173
|
+
return to_ruby(py_column);
|
174
|
+
}
|
175
|
+
|
176
|
+
static VALUE
|
177
|
+
rb_pycall_arrow_column_to_ruby(VALUE self)
|
178
|
+
{
|
179
|
+
auto py_column = to_python(self);
|
180
|
+
std::shared_ptr<arrow::Column> arrow_column;
|
181
|
+
auto status = arrow::py::unwrap_column(py_column, &arrow_column);
|
182
|
+
GError *error = NULL;
|
183
|
+
if (!garrow_error_check(&error, status, "[pyarrow][column][to-ruby]"))
|
184
|
+
RG_RAISE_ERROR(error);
|
185
|
+
auto garrow_column = garrow_column_new_raw(&arrow_column);
|
186
|
+
return GOBJ2RVAL(garrow_column);
|
86
187
|
}
|
87
188
|
|
88
189
|
static VALUE
|
89
|
-
|
190
|
+
rb_arrow_table_to_python(VALUE self)
|
90
191
|
{
|
91
192
|
auto table = GARROW_TABLE(RVAL2GOBJ(self));
|
92
193
|
auto arrow_table = garrow_table_get_raw(table);
|
93
194
|
auto py_table = arrow::py::wrap_table(arrow_table);
|
94
|
-
return
|
195
|
+
return to_ruby(py_table);
|
196
|
+
}
|
197
|
+
|
198
|
+
static VALUE
|
199
|
+
rb_pycall_arrow_table_to_ruby(VALUE self)
|
200
|
+
{
|
201
|
+
auto py_table = to_python(self);
|
202
|
+
std::shared_ptr<arrow::Table> arrow_table;
|
203
|
+
auto status = arrow::py::unwrap_table(py_table, &arrow_table);
|
204
|
+
GError *error = NULL;
|
205
|
+
if (!garrow_error_check(&error, status, "[pyarrow][table][to-ruby]"))
|
206
|
+
RG_RAISE_ERROR(error);
|
207
|
+
auto garrow_table = garrow_table_new_raw(&arrow_table);
|
208
|
+
return GOBJ2RVAL(garrow_table);
|
95
209
|
}
|
96
210
|
|
97
211
|
static VALUE
|
98
|
-
|
212
|
+
rb_arrow_record_batch_to_python(VALUE self)
|
99
213
|
{
|
100
214
|
auto record_batch = GARROW_RECORD_BATCH(RVAL2GOBJ(self));
|
101
215
|
auto arrow_record_batch = garrow_record_batch_get_raw(record_batch);
|
102
216
|
auto py_record_batch = arrow::py::wrap_record_batch(arrow_record_batch);
|
103
|
-
return
|
217
|
+
return to_ruby(py_record_batch);
|
218
|
+
}
|
219
|
+
|
220
|
+
static VALUE
|
221
|
+
rb_pycall_arrow_record_batch_to_ruby(VALUE self)
|
222
|
+
{
|
223
|
+
auto py_record_batch = to_python(self);
|
224
|
+
std::shared_ptr<arrow::RecordBatch> arrow_record_batch;
|
225
|
+
auto status =
|
226
|
+
arrow::py::unwrap_record_batch(py_record_batch, &arrow_record_batch);
|
227
|
+
GError *error = NULL;
|
228
|
+
if (!garrow_error_check(&error, status, "[pyarrow][record-batch][to-ruby]"))
|
229
|
+
RG_RAISE_ERROR(error);
|
230
|
+
auto garrow_record_batch = garrow_record_batch_new_raw(&arrow_record_batch);
|
231
|
+
return GOBJ2RVAL(garrow_record_batch);
|
104
232
|
}
|
105
233
|
|
106
234
|
extern "C" void
|
@@ -108,77 +236,143 @@ Init_arrow_pycall(void)
|
|
108
236
|
{
|
109
237
|
arrow::py::import_pyarrow();
|
110
238
|
|
111
|
-
|
239
|
+
auto rbArrow = rb_const_get(rb_cObject, rb_intern("Arrow"));
|
240
|
+
auto rbPyArrow = rb_const_get(rb_cObject, rb_intern("PyArrow"));
|
112
241
|
|
113
242
|
{
|
114
|
-
|
243
|
+
auto rbArrowBuffer = rb_const_get(rbArrow, rb_intern("Buffer"));
|
115
244
|
rb_define_method(rbArrowBuffer,
|
116
|
-
"
|
117
|
-
(VALUE(*)(ANYARGS))
|
245
|
+
"to_python",
|
246
|
+
(VALUE(*)(ANYARGS))rb_arrow_buffer_to_python,
|
247
|
+
0);
|
248
|
+
}
|
249
|
+
{
|
250
|
+
auto rbPyArrowBuffer = rb_const_get(rbPyArrow, rb_intern("Buffer"));
|
251
|
+
rb_define_method(rbPyArrowBuffer,
|
252
|
+
"to_ruby",
|
253
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_buffer_to_ruby,
|
118
254
|
0);
|
119
255
|
}
|
120
256
|
|
121
257
|
{
|
122
|
-
|
258
|
+
auto rbArrowDataType = rb_const_get(rbArrow, rb_intern("DataType"));
|
123
259
|
rb_define_method(rbArrowDataType,
|
124
|
-
"
|
125
|
-
(VALUE(*)(ANYARGS))
|
260
|
+
"to_python",
|
261
|
+
(VALUE(*)(ANYARGS))rb_arrow_data_type_to_python,
|
262
|
+
0);
|
263
|
+
}
|
264
|
+
{
|
265
|
+
auto rbPyArrowDataType = rb_const_get(rbPyArrow, rb_intern("DataType"));
|
266
|
+
rb_define_method(rbPyArrowDataType,
|
267
|
+
"to_ruby",
|
268
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_data_type_to_ruby,
|
126
269
|
0);
|
127
270
|
}
|
128
271
|
|
129
272
|
{
|
130
|
-
|
273
|
+
auto rbArrowField = rb_const_get(rbArrow, rb_intern("Field"));
|
131
274
|
rb_define_method(rbArrowField,
|
132
|
-
"
|
133
|
-
(VALUE(*)(ANYARGS))
|
275
|
+
"to_python",
|
276
|
+
(VALUE(*)(ANYARGS))rb_arrow_field_to_python,
|
277
|
+
0);
|
278
|
+
}
|
279
|
+
{
|
280
|
+
auto rbPyArrowField = rb_const_get(rbPyArrow, rb_intern("Field"));
|
281
|
+
rb_define_method(rbPyArrowField,
|
282
|
+
"to_ruby",
|
283
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_field_to_ruby,
|
134
284
|
0);
|
135
285
|
}
|
136
286
|
|
137
287
|
{
|
138
|
-
|
288
|
+
auto rbArrowSchema = rb_const_get(rbArrow, rb_intern("Schema"));
|
139
289
|
rb_define_method(rbArrowSchema,
|
140
|
-
"
|
141
|
-
(VALUE(*)(ANYARGS))
|
290
|
+
"to_python",
|
291
|
+
(VALUE(*)(ANYARGS))rb_arrow_schema_to_python,
|
292
|
+
0);
|
293
|
+
}
|
294
|
+
{
|
295
|
+
auto rbPyArrowSchema = rb_const_get(rbPyArrow, rb_intern("Schema"));
|
296
|
+
rb_define_method(rbPyArrowSchema,
|
297
|
+
"to_ruby",
|
298
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_schema_to_ruby,
|
142
299
|
0);
|
143
300
|
}
|
144
301
|
|
145
302
|
{
|
146
|
-
|
303
|
+
auto rbArrowArray = rb_const_get(rbArrow, rb_intern("Array"));
|
147
304
|
rb_define_method(rbArrowArray,
|
148
|
-
"
|
149
|
-
(VALUE(*)(ANYARGS))
|
305
|
+
"to_python",
|
306
|
+
(VALUE(*)(ANYARGS))rb_arrow_array_to_python,
|
307
|
+
0);
|
308
|
+
}
|
309
|
+
{
|
310
|
+
auto rbPyArrowArrayConvertable =
|
311
|
+
rb_define_module_under(rbPyArrow, "ArrayConvertable");
|
312
|
+
rb_define_method(rbPyArrowArrayConvertable,
|
313
|
+
"to_ruby",
|
314
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_array_to_ruby,
|
150
315
|
0);
|
151
316
|
}
|
152
317
|
|
153
318
|
{
|
154
|
-
|
319
|
+
auto rbArrowTensor = rb_const_get(rbArrow, rb_intern("Tensor"));
|
155
320
|
rb_define_method(rbArrowTensor,
|
156
|
-
"
|
157
|
-
(VALUE(*)(ANYARGS))
|
321
|
+
"to_python",
|
322
|
+
(VALUE(*)(ANYARGS))rb_arrow_tensor_to_python,
|
323
|
+
0);
|
324
|
+
}
|
325
|
+
{
|
326
|
+
auto rbPyArrowTensor = rb_const_get(rbPyArrow, rb_intern("Tensor"));
|
327
|
+
rb_define_method(rbPyArrowTensor,
|
328
|
+
"to_ruby",
|
329
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_tensor_to_ruby,
|
158
330
|
0);
|
159
331
|
}
|
160
332
|
|
161
333
|
{
|
162
|
-
|
334
|
+
auto rbArrowColumn = rb_const_get(rbArrow, rb_intern("Column"));
|
163
335
|
rb_define_method(rbArrowColumn,
|
164
|
-
"
|
165
|
-
(VALUE(*)(ANYARGS))
|
336
|
+
"to_python",
|
337
|
+
(VALUE(*)(ANYARGS))rb_arrow_column_to_python,
|
338
|
+
0);
|
339
|
+
}
|
340
|
+
{
|
341
|
+
auto rbPyArrowColumn = rb_const_get(rbPyArrow, rb_intern("Column"));
|
342
|
+
rb_define_method(rbPyArrowColumn,
|
343
|
+
"to_ruby",
|
344
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_column_to_ruby,
|
166
345
|
0);
|
167
346
|
}
|
168
347
|
|
169
348
|
{
|
170
|
-
|
349
|
+
auto rbArrowTable = rb_const_get(rbArrow, rb_intern("Table"));
|
171
350
|
rb_define_method(rbArrowTable,
|
172
|
-
"
|
173
|
-
(VALUE(*)(ANYARGS))
|
351
|
+
"to_python",
|
352
|
+
(VALUE(*)(ANYARGS))rb_arrow_table_to_python,
|
353
|
+
0);
|
354
|
+
}
|
355
|
+
{
|
356
|
+
auto rbPyArrowTable = rb_const_get(rbPyArrow, rb_intern("Table"));
|
357
|
+
rb_define_method(rbPyArrowTable,
|
358
|
+
"to_ruby",
|
359
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_table_to_ruby,
|
174
360
|
0);
|
175
361
|
}
|
176
362
|
|
177
363
|
{
|
178
|
-
|
364
|
+
auto rbArrowRecordBatch = rb_const_get(rbArrow, rb_intern("RecordBatch"));
|
179
365
|
rb_define_method(rbArrowRecordBatch,
|
180
|
-
"
|
181
|
-
(VALUE(*)(ANYARGS))
|
366
|
+
"to_python",
|
367
|
+
(VALUE(*)(ANYARGS))rb_arrow_record_batch_to_python,
|
368
|
+
0);
|
369
|
+
}
|
370
|
+
{
|
371
|
+
auto rbPyArrowRecordBatch =
|
372
|
+
rb_const_get(rbPyArrow, rb_intern("RecordBatch"));
|
373
|
+
rb_define_method(rbPyArrowRecordBatch,
|
374
|
+
"to_ruby",
|
375
|
+
(VALUE(*)(ANYARGS))rb_pycall_arrow_record_batch_to_ruby,
|
182
376
|
0);
|
183
377
|
}
|
184
378
|
}
|
data/ext/arrow-pycall/extconf.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2017 Kouhei Sutou <kou@clear-code.com>
|
1
|
+
# Copyright 2017-2018 Kouhei Sutou <kou@clear-code.com>
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -30,4 +30,12 @@ end
|
|
30
30
|
add_depend_package_path(name, source_dir, build_dir)
|
31
31
|
end
|
32
32
|
|
33
|
+
checking_for(checking_message("pycall"), "%s") do
|
34
|
+
pycall_version_path = File.join(__dir__, "..", "..", "pycall-version")
|
35
|
+
pycall_version = File.read(pycall_version_path).strip
|
36
|
+
pycall_spec = Gem::Specification.find_by_name("pycall", pycall_version)
|
37
|
+
$INCFLAGS += " -I#{pycall_spec.gem_dir}/ext/pycall"
|
38
|
+
pycall_spec.version
|
39
|
+
end
|
40
|
+
|
33
41
|
create_makefile("arrow_pycall")
|
data/lib/arrow-pycall.rb
CHANGED
@@ -17,49 +17,70 @@ require "pycall"
|
|
17
17
|
|
18
18
|
require "arrow-pycall/version"
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
require "arrow-pycall/convertable"
|
20
|
+
module PyArrow
|
21
|
+
class << self
|
22
|
+
def __pyptr__
|
23
|
+
@pyarrow ||= PyCall.import_module("pyarrow")
|
24
|
+
end
|
25
|
+
end
|
28
26
|
|
29
|
-
|
27
|
+
Buffer = __pyptr__.Buffer
|
30
28
|
class Buffer
|
31
|
-
|
29
|
+
register_python_type_mapping
|
32
30
|
end
|
33
31
|
|
32
|
+
DataType = __pyptr__.lib.DataType
|
34
33
|
class DataType
|
35
|
-
|
34
|
+
register_python_type_mapping
|
36
35
|
end
|
37
36
|
|
37
|
+
Field = __pyptr__.Field
|
38
38
|
class Field
|
39
|
-
|
39
|
+
register_python_type_mapping
|
40
40
|
end
|
41
41
|
|
42
|
+
Schema = __pyptr__.Schema
|
42
43
|
class Schema
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
class Array
|
47
|
-
include ArrowPyCall::Convertable
|
44
|
+
register_python_type_mapping
|
48
45
|
end
|
49
46
|
|
47
|
+
Tensor = __pyptr__.Tensor
|
50
48
|
class Tensor
|
51
|
-
|
49
|
+
register_python_type_mapping
|
52
50
|
end
|
53
51
|
|
52
|
+
Column = __pyptr__.Column
|
54
53
|
class Column
|
55
|
-
|
54
|
+
register_python_type_mapping
|
56
55
|
end
|
57
56
|
|
57
|
+
Table = __pyptr__.Table
|
58
58
|
class Table
|
59
|
-
|
59
|
+
register_python_type_mapping
|
60
60
|
end
|
61
61
|
|
62
|
+
RecordBatch = __pyptr__.RecordBatch
|
62
63
|
class RecordBatch
|
63
|
-
|
64
|
+
register_python_type_mapping
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
begin
|
69
|
+
major, minor, _ = RUBY_VERSION.split(/\./)
|
70
|
+
require "#{major}.#{minor}/arrow_pycall.so"
|
71
|
+
rescue LoadError
|
72
|
+
require "arrow_pycall.so"
|
73
|
+
end
|
74
|
+
|
75
|
+
module PyArrow
|
76
|
+
Arrow.constants.each do |name|
|
77
|
+
case name.to_s
|
78
|
+
when "ChunkedArray"
|
79
|
+
when /Array\z/
|
80
|
+
py_arrow_array = __pyptr__.lib.__dict__[name.to_s]
|
81
|
+
next if py_arrow_array.nil?
|
82
|
+
py_arrow_array.__send__(:register_python_type_mapping)
|
83
|
+
py_arrow_array.__send__(:include, ArrayConvertable)
|
84
|
+
end
|
64
85
|
end
|
65
86
|
end
|
data/lib/arrow-pycall/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2017 Kouhei Sutou <kou@clear-code.com>
|
1
|
+
# Copyright 2017-2018 Kouhei Sutou <kou@clear-code.com>
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -13,5 +13,5 @@
|
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
15
|
module ArrowPyCall
|
16
|
-
VERSION = "0.0.
|
16
|
+
VERSION = "0.0.4"
|
17
17
|
end
|
data/pycall-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
>= 1.1.0.rc1
|
data/red-arrow-pycall.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
#
|
3
|
-
# Copyright 2017 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
# Copyright 2017-2018 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
6
|
# you may not use this file except in compliance with the License.
|
@@ -18,9 +18,13 @@ clean_white_space = lambda do |entry|
|
|
18
18
|
entry.gsub(/(\A\n+|\n+\z)/, '') + "\n"
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
base_dir = __dir__
|
22
|
+
lib_dir = File.join(base_dir, "lib")
|
23
|
+
$LOAD_PATH.unshift(lib_dir)
|
22
24
|
require "arrow-pycall/version"
|
23
25
|
|
26
|
+
pycall_version = File.read(File.join(base_dir, "pycall-version")).strip
|
27
|
+
|
24
28
|
Gem::Specification.new do |spec|
|
25
29
|
spec.name = "red-arrow-pycall"
|
26
30
|
spec.version = ArrowPyCall::VERSION
|
@@ -37,6 +41,7 @@ Gem::Specification.new do |spec|
|
|
37
41
|
spec.license = "Apache-2.0"
|
38
42
|
spec.files = ["README.md", "Rakefile", "Gemfile", "#{spec.name}.gemspec"]
|
39
43
|
spec.files += [".yardopts"]
|
44
|
+
spec.files += ["pycall-version"]
|
40
45
|
spec.files += Dir.glob("lib/**/*.rb")
|
41
46
|
spec.files += Dir.glob("ext/**/*.{c,cpp}")
|
42
47
|
spec.files += Dir.glob("doc/text/*")
|
@@ -44,7 +49,7 @@ Gem::Specification.new do |spec|
|
|
44
49
|
spec.test_files += Dir.glob("test/**/*")
|
45
50
|
|
46
51
|
spec.add_runtime_dependency("red-arrow")
|
47
|
-
spec.add_runtime_dependency("pycall")
|
52
|
+
spec.add_runtime_dependency("pycall", pycall_version)
|
48
53
|
|
49
54
|
spec.add_development_dependency("bundler")
|
50
55
|
spec.add_development_dependency("rake")
|
data/test/test-to-python.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2017 Kouhei Sutou <kou@clear-code.com>
|
1
|
+
# Copyright 2017-2018 Kouhei Sutou <kou@clear-code.com>
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -16,33 +16,33 @@ class ToPythonTest < Test::Unit::TestCase
|
|
16
16
|
test("Buffer") do
|
17
17
|
data = "hello"
|
18
18
|
buffer = Arrow::Buffer.new(data)
|
19
|
-
assert_equal(data, buffer.to_python.to_pybytes
|
19
|
+
assert_equal(data, buffer.to_python.to_pybytes)
|
20
20
|
end
|
21
21
|
|
22
22
|
test("DataType") do
|
23
23
|
data_type = Arrow::BooleanDataType.new
|
24
24
|
assert_equal(data_type.to_s,
|
25
|
-
data_type.to_python.__str__
|
25
|
+
data_type.to_python.__str__)
|
26
26
|
end
|
27
27
|
|
28
28
|
test("Field") do
|
29
29
|
field = Arrow::Field.new("enabled", Arrow::BooleanDataType.new)
|
30
30
|
assert_equal("pyarrow.Field<#{field}>",
|
31
|
-
field.to_python.__str__
|
31
|
+
field.to_python.__str__)
|
32
32
|
end
|
33
33
|
|
34
34
|
test("Schema") do
|
35
35
|
field = Arrow::Field.new("enabled", Arrow::BooleanDataType.new)
|
36
36
|
schema = Arrow::Schema.new([field])
|
37
37
|
assert_equal(schema.to_s,
|
38
|
-
schema.to_python.__str__
|
38
|
+
schema.to_python.__str__)
|
39
39
|
end
|
40
40
|
|
41
41
|
test("Array") do
|
42
42
|
elements = [1, -2, 4]
|
43
43
|
array = Arrow::Int8Array.new(elements)
|
44
44
|
assert_equal(elements,
|
45
|
-
array.to_python.to_pylist
|
45
|
+
array.to_python.to_pylist)
|
46
46
|
end
|
47
47
|
|
48
48
|
test("Tensor") do
|
@@ -65,7 +65,7 @@ class ToPythonTest < Test::Unit::TestCase
|
|
65
65
|
shape,
|
66
66
|
strides,
|
67
67
|
names)
|
68
|
-
assert_equal(<<-TENSOR.chomp, tensor.to_python.to_numpy.
|
68
|
+
assert_equal(<<-TENSOR.chomp, tensor.to_python.to_numpy.to_s)
|
69
69
|
[[[ 1 2]
|
70
70
|
[ 3 4]]
|
71
71
|
|
@@ -82,7 +82,7 @@ class ToPythonTest < Test::Unit::TestCase
|
|
82
82
|
array = Arrow::BooleanArray.new([true, false, true])
|
83
83
|
column = Arrow::Column.new(field, array)
|
84
84
|
assert_equal([true, false, true],
|
85
|
-
column.to_python.to_pylist
|
85
|
+
column.to_python.to_pylist)
|
86
86
|
end
|
87
87
|
|
88
88
|
test("Table") do
|
@@ -91,11 +91,11 @@ class ToPythonTest < Test::Unit::TestCase
|
|
91
91
|
array = Arrow::BooleanArray.new([true, false, true])
|
92
92
|
column = Arrow::Column.new(field, array)
|
93
93
|
table = Arrow::Table.new(schema, [column])
|
94
|
-
assert_equal(<<-TABLE.chomp, table.to_python.to_pandas.
|
95
|
-
|
96
|
-
0
|
97
|
-
1
|
98
|
-
2
|
94
|
+
assert_equal(<<-TABLE.chomp, table.to_python.to_pandas.to_s)
|
95
|
+
enabled
|
96
|
+
0 True
|
97
|
+
1 False
|
98
|
+
2 True
|
99
99
|
TABLE
|
100
100
|
end
|
101
101
|
|
@@ -104,11 +104,11 @@ class ToPythonTest < Test::Unit::TestCase
|
|
104
104
|
schema = Arrow::Schema.new([field])
|
105
105
|
array = Arrow::BooleanArray.new([true, false, true])
|
106
106
|
record_batch = Arrow::RecordBatch.new(schema, 3, [array])
|
107
|
-
assert_equal(<<-RECORD_BATCH.chomp, record_batch.to_python.to_pandas.
|
108
|
-
|
109
|
-
0
|
110
|
-
1
|
111
|
-
2
|
107
|
+
assert_equal(<<-RECORD_BATCH.chomp, record_batch.to_python.to_pandas.to_s)
|
108
|
+
enabled
|
109
|
+
0 True
|
110
|
+
1 False
|
111
|
+
2 True
|
112
112
|
RECORD_BATCH
|
113
113
|
end
|
114
114
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# Copyright 2017 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
class ToRubyTest < Test::Unit::TestCase
|
16
|
+
test("Buffer") do
|
17
|
+
data = "hello"
|
18
|
+
buffer = Arrow::Buffer.new(data)
|
19
|
+
py_buffer = buffer.to_python
|
20
|
+
assert_equal(data, py_buffer.to_ruby.data.to_s)
|
21
|
+
end
|
22
|
+
|
23
|
+
test("DataType") do
|
24
|
+
data_type = Arrow::BooleanDataType.new
|
25
|
+
py_data_type = data_type.to_python
|
26
|
+
assert_equal(data_type.to_s, py_data_type.to_ruby.to_s)
|
27
|
+
end
|
28
|
+
|
29
|
+
test("Field") do
|
30
|
+
field = Arrow::Field.new("enabled", Arrow::BooleanDataType.new)
|
31
|
+
assert_equal(field.to_s,
|
32
|
+
field.to_python.to_ruby.to_s)
|
33
|
+
end
|
34
|
+
|
35
|
+
test("Schema") do
|
36
|
+
field = Arrow::Field.new("enabled", Arrow::BooleanDataType.new)
|
37
|
+
schema = Arrow::Schema.new([field])
|
38
|
+
assert_equal(schema.to_s,
|
39
|
+
schema.to_python.to_ruby.to_s)
|
40
|
+
end
|
41
|
+
|
42
|
+
test("Array") do
|
43
|
+
elements = [1, -2, 4]
|
44
|
+
array = Arrow::Int8Array.new(elements)
|
45
|
+
assert_equal(elements,
|
46
|
+
array.to_python.to_ruby.to_a)
|
47
|
+
end
|
48
|
+
|
49
|
+
test("Tensor") do
|
50
|
+
raw_data = [
|
51
|
+
1, 2,
|
52
|
+
3, 4,
|
53
|
+
|
54
|
+
5, 6,
|
55
|
+
7, 8,
|
56
|
+
|
57
|
+
9, 10,
|
58
|
+
11, 12,
|
59
|
+
]
|
60
|
+
data = Arrow::Buffer.new(raw_data.pack("c*"))
|
61
|
+
shape = [3, 2, 2]
|
62
|
+
strides = []
|
63
|
+
names = ["a", "b", "c"]
|
64
|
+
tensor = Arrow::Tensor.new(Arrow::Int8DataType.new,
|
65
|
+
data,
|
66
|
+
shape,
|
67
|
+
strides,
|
68
|
+
names)
|
69
|
+
assert_equal(tensor.buffer.data.to_s,
|
70
|
+
tensor.to_python.to_ruby.buffer.data.to_s)
|
71
|
+
end
|
72
|
+
|
73
|
+
test("Column") do
|
74
|
+
field = Arrow::Field.new("enabled", Arrow::BooleanDataType.new)
|
75
|
+
array = Arrow::BooleanArray.new([true, false, true])
|
76
|
+
column = Arrow::Column.new(field, array)
|
77
|
+
assert_equal([true, false, true],
|
78
|
+
column.to_python.to_ruby.to_a)
|
79
|
+
end
|
80
|
+
|
81
|
+
test("Table") do
|
82
|
+
field = Arrow::Field.new("enabled", Arrow::BooleanDataType.new)
|
83
|
+
schema = Arrow::Schema.new([field])
|
84
|
+
array = Arrow::BooleanArray.new([true, false, true])
|
85
|
+
column = Arrow::Column.new(field, array)
|
86
|
+
table = Arrow::Table.new(schema, [column])
|
87
|
+
assert_equal(table.each_column.collect(&:to_a),
|
88
|
+
table.to_python.to_ruby.each_column.collect(&:to_a))
|
89
|
+
end
|
90
|
+
|
91
|
+
test("RecordBatch") do
|
92
|
+
field = Arrow::Field.new("enabled", Arrow::BooleanDataType.new)
|
93
|
+
schema = Arrow::Schema.new([field])
|
94
|
+
array = Arrow::BooleanArray.new([true, false, true])
|
95
|
+
record_batch = Arrow::RecordBatch.new(schema, 3, [array])
|
96
|
+
assert_equal(record_batch.to_s,
|
97
|
+
record_batch.to_python.to_ruby.to_s)
|
98
|
+
end
|
99
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: red-arrow-pycall
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: red-arrow
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.1.0.rc1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.1.0.rc1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,12 +143,13 @@ files:
|
|
143
143
|
- ext/arrow-pycall/arrow-pycall.cpp
|
144
144
|
- ext/arrow-pycall/extconf.rb
|
145
145
|
- lib/arrow-pycall.rb
|
146
|
-
- lib/arrow-pycall/convertable.rb
|
147
146
|
- lib/arrow-pycall/version.rb
|
147
|
+
- pycall-version
|
148
148
|
- red-arrow-pycall.gemspec
|
149
149
|
- test/helper.rb
|
150
150
|
- test/run-test.rb
|
151
151
|
- test/test-to-python.rb
|
152
|
+
- test/test-to-ruby.rb
|
152
153
|
homepage: https://github.com/red-data-tools/red-arrow-pycall
|
153
154
|
licenses:
|
154
155
|
- Apache-2.0
|
@@ -169,12 +170,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
170
|
version: '0'
|
170
171
|
requirements: []
|
171
172
|
rubyforge_project:
|
172
|
-
rubygems_version: 2.5.2
|
173
|
+
rubygems_version: 2.5.2.2
|
173
174
|
signing_key:
|
174
175
|
specification_version: 4
|
175
176
|
summary: Red Arrow PyCall is a library that provides converters between Ruby objects
|
176
177
|
for Apache Arrow and Python objects for Apache Arrow.
|
177
178
|
test_files:
|
179
|
+
- test/test-to-ruby.rb
|
178
180
|
- test/helper.rb
|
179
181
|
- test/run-test.rb
|
180
182
|
- test/test-to-python.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# Copyright 2017 Kouhei Sutou <kou@clear-code.com>
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
module ArrowPyCall
|
16
|
-
module Convertable
|
17
|
-
def to_pycall_object
|
18
|
-
pointer = FFI::Pointer.new(to_python_object_pointer)
|
19
|
-
pyobject_struct = PyCall::LibPython::PyObjectStruct.new(pointer)
|
20
|
-
pyobject_struct.to_ruby
|
21
|
-
end
|
22
|
-
alias_method :to_python, :to_pycall_object
|
23
|
-
end
|
24
|
-
end
|