pycall 0.1.0.alpha.20170309 → 0.1.0.alpha.20170311

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
  SHA1:
3
- metadata.gz: e9498fcad907f67277117e9e637247b85228485e
4
- data.tar.gz: b0981d9a5d30e35d80480905381210323d86d852
3
+ metadata.gz: b0fa9f2771f8c95a9d13d448e0369e9b7e9480f6
4
+ data.tar.gz: 4995b342604508cb01faadde8d6c90f35a402783
5
5
  SHA512:
6
- metadata.gz: 20a307abbe8494a1bfb584d1a9c7acceea1f10ad1c7416e01adb2320a8c62f3a315ab1c25693c227ee984319c8139d0c78498df9c2fbee5f5fa8af63679ce678
7
- data.tar.gz: 17aae937f321ae1590e4c8bbf089b6024288defe20457282908d090fb6c56a3c7641dd171d5dd832115ac2515b459236364a6f6ee1310c7507b19eb69032bb1a
6
+ metadata.gz: 107f426b7baa846f92dee733e1e2fa797f8a8fe9690e6690257254d3bf9e0d996f83b733c5d31c71136880fa9d1872c22bc4e8d3290319ff19b21c8844a63ccf
7
+ data.tar.gz: 31a974c8e52b665b61b73078edb3f366f8ff736d1828762f6ca4f1ad103e42208362a2a202b9aaa7d30c8189fcd00d6a3d08a12c24830e51da480a98e35ad745
@@ -26,8 +26,54 @@ module PyCall
26
26
  @python_type_map << TypePair.new(pytype, rbtype)
27
27
  end
28
28
 
29
- def self.to_ruby(pyobj)
30
- pyobj = PyObject.new(pyobj) if pyobj.kind_of? LibPython::PyObjectStruct
29
+ # Convert a PyCall::PyObjectStruct object to a Ruby object
30
+ #
31
+ # @param [PyCall::PyObjectStruct] pyptr a PyObjectStruct object.
32
+ #
33
+ # @return a Ruby object converted from `pyptr`.
34
+ def self.to_ruby(pyptr)
35
+ return nil if pyptr.null? || PyCall.none?(pyptr)
36
+
37
+ case
38
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyType_Type)
39
+ return TypeObject.new(pyptr)
40
+
41
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyBool_Type)
42
+ return Conversions.convert_to_boolean(pyptr)
43
+
44
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyInt_Type)
45
+ return Conversions.convert_to_integer(pyptr)
46
+
47
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyLong_Type)
48
+ # TODO: should make Bignum
49
+
50
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyFloat_Type)
51
+ return Conversions.convert_to_float(pyptr)
52
+
53
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyComplex_Type)
54
+ return Conversions.convert_to_complex(pyptr)
55
+
56
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyString_Type)
57
+ return Conversions.convert_to_string(pyptr)
58
+
59
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyUnicode_Type)
60
+ py_str_ptr = LibPython.PyUnicode_AsUTF8String(pyptr)
61
+ return Conversions.convert_to_string(py_str_ptr).force_encoding(Encoding::UTF_8)
62
+
63
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyList_Type)
64
+ return PyCall::List.new(pyptr)
65
+
66
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyTuple_Type)
67
+ return Conversions.convert_to_tuple(pyptr)
68
+
69
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PyDict_Type)
70
+ return PyCall::Dict.new(pyptr)
71
+
72
+ when PyCall::Types.pyisinstance(pyptr, LibPython.PySet_Type)
73
+ return PyCall::Set.new(pyptr)
74
+ end
75
+
76
+ pyobj = PyObject.new(pyptr)
31
77
  each_type_pair do |tp|
32
78
  pytype, rbtype = tp.to_a
33
79
  next unless pyobj.kind_of?(pytype)
@@ -67,6 +113,8 @@ module PyCall
67
113
  from_ruby(obj.to_s)
68
114
  when Array
69
115
  PyCall::List.new(obj).__pyobj__
116
+ when Hash
117
+ PyCall::Dict.new(obj).__pyobj__
70
118
  else
71
119
  PyCall.None
72
120
  end
@@ -119,47 +167,6 @@ module PyCall
119
167
 
120
168
  class LibPython::PyObjectStruct
121
169
  def to_ruby
122
- return nil if self.null? || PyCall.none?(self)
123
-
124
- case
125
- when PyCall::Types.pyisinstance(self, LibPython.PyType_Type)
126
- return TypeObject.new(self)
127
-
128
- when PyCall::Types.pyisinstance(self, LibPython.PyBool_Type)
129
- return Conversions.convert_to_boolean(self)
130
-
131
- when PyCall::Types.pyisinstance(self, LibPython.PyInt_Type)
132
- return Conversions.convert_to_integer(self)
133
-
134
- when PyCall::Types.pyisinstance(self, LibPython.PyLong_Type)
135
- # TODO: should make Bignum
136
-
137
- when PyCall::Types.pyisinstance(self, LibPython.PyFloat_Type)
138
- return Conversions.convert_to_float(self)
139
-
140
- when PyCall::Types.pyisinstance(self, LibPython.PyComplex_Type)
141
- return Conversions.convert_to_complex(self)
142
-
143
- when PyCall::Types.pyisinstance(self, LibPython.PyString_Type)
144
- return Conversions.convert_to_string(self)
145
-
146
- when PyCall::Types.pyisinstance(self, LibPython.PyUnicode_Type)
147
- py_str_ptr = LibPython.PyUnicode_AsUTF8String(self)
148
- return Conversions.convert_to_string(py_str_ptr).force_encoding(Encoding::UTF_8)
149
-
150
- when PyCall::Types.pyisinstance(self, LibPython.PyList_Type)
151
- return PyCall::List.new(self)
152
-
153
- when PyCall::Types.pyisinstance(self, LibPython.PyTuple_Type)
154
- return Conversions.convert_to_tuple(self)
155
-
156
- when PyCall::Types.pyisinstance(self, LibPython.PyDict_Type)
157
- return PyCall::Dict.new(self)
158
-
159
- when PyCall::Types.pyisinstance(self, LibPython.PySet_Type)
160
- return PyCall::Set.new(self)
161
- end
162
-
163
170
  Conversions.to_ruby(self)
164
171
  end
165
172
  end
@@ -7,9 +7,9 @@ module PyCall
7
7
  ptraceback = ptrs + 2 * ptrs.type_size
8
8
  LibPython.PyErr_Fetch(ptype, pvalue, ptraceback)
9
9
  LibPython.PyErr_NormalizeException(ptype, pvalue, ptraceback)
10
- type = Conversions.to_ruby(LibPython::PyObjectStruct.new(ptype.read(:pointer)))
11
- value = Conversions.to_ruby(LibPython::PyObjectStruct.new(pvalue.read(:pointer)))
12
- traceback = Conversions.to_ruby(LibPython::PyObjectStruct.new(ptraceback.read(:pointer)))
10
+ type = Conversions.to_ruby(ptype.read(:pointer))
11
+ value = Conversions.to_ruby(pvalue.read(:pointer))
12
+ traceback = Conversions.to_ruby(ptraceback.read(:pointer))
13
13
  new(type, value, traceback)
14
14
  end
15
15
 
@@ -22,9 +22,9 @@ module PyCall
22
22
 
23
23
  attr_reader :type, :value, :traceback
24
24
 
25
- def message
25
+ def to_s
26
26
  "#{type}: #{value}".tap do |msg|
27
- unless traceback.null?
27
+ unless traceback&.null?
28
28
  if (o = PyCall.format_traceback(traceback))
29
29
  msg.concat("\n", *o)
30
30
  end
@@ -49,6 +49,7 @@ module PyCall
49
49
  end
50
50
 
51
51
  def initialize(pyobj)
52
+ pyobj = LibPython::PyObjectStruct.new(pyobj) if pyobj.kind_of? FFI::Pointer
52
53
  pyobj = pyobj.__pyobj__ unless pyobj.kind_of? LibPython::PyObjectStruct
53
54
  @__pyobj__ = pyobj
54
55
  end
@@ -86,8 +87,7 @@ module PyCall
86
87
  opcode = RICH_COMPARISON_OPCODES[op]
87
88
  raise ArgumentError, "Unknown comparison op: #{op}" unless opcode
88
89
 
89
- other = other.__pyobj__ unless other.kind_of? LibPython::PyObjectStruct
90
- other = Conversions.from_ruby(other) unless other.kind_of?(LibPython::PyObjectStruct)
90
+ other = Conversions.from_ruby(other)
91
91
  return other.null? if __pyobj__.null?
92
92
  return false if other.null?
93
93
 
data/lib/pycall/types.rb CHANGED
@@ -1,8 +1,12 @@
1
1
  module PyCall
2
2
  module Types
3
3
  def self.pyisinstance(pyobj, pytype)
4
+ pyobj = LibPython::PyObjectStruct.new(pyobj) if pyobj.kind_of? FFI::Pointer
4
5
  pyobj = pyobj.__pyobj__ unless pyobj.kind_of? LibPython::PyObjectStruct
6
+
7
+ pytype = LibPython::PyObjectStruct.new(pytype) if pytype.kind_of? FFI::Pointer
5
8
  pytype = ptype.__pyobj__ unless pytype.kind_of? LibPython::PyObjectStruct
9
+
6
10
  LibPython.PyObject_IsInstance(pyobj, pytype) == 1
7
11
  end
8
12
 
data/lib/pycall/utils.rb CHANGED
@@ -46,8 +46,15 @@ module PyCall
46
46
  end
47
47
 
48
48
  def none?(pyobj)
49
- pyobj = pyobj.__pyobj__ unless pyobj.kind_of? LibPython::PyObjectStruct
50
- pyobj.to_ptr == self.None.to_ptr
49
+ case pyobj
50
+ when FFI::Pointer
51
+ ptr = pyobj
52
+ when LibPython::PyObjectStruct
53
+ ptr = pyobj.to_ptr
54
+ else
55
+ pyobj = pyobj.__pyobj__.to_ptr
56
+ end
57
+ ptr == self.None.to_ptr
51
58
  end
52
59
 
53
60
  def slice(*args)
@@ -1,3 +1,3 @@
1
1
  module PyCall
2
- VERSION = "0.1.0.alpha.20170309"
2
+ VERSION = "0.1.0.alpha.20170311"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pycall
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha.20170309
4
+ version: 0.1.0.alpha.20170311
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenta Murata
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-09 00:00:00.000000000 Z
11
+ date: 2017-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi