pycall 0.1.0.alpha.20170302 → 0.1.0.alpha.20170307
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/lib/pycall/conversion.rb +12 -3
- data/lib/pycall/dict.rb +11 -4
- data/lib/pycall/eval.rb +17 -12
- data/lib/pycall/libpython.rb +5 -0
- data/lib/pycall/pyobject.rb +2 -2
- data/lib/pycall/pyobject_wrapper.rb +31 -0
- data/lib/pycall/utils.rb +24 -0
- data/lib/pycall/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bff90008a927b2cb383fe47fa5b7c9e4447c01ec
|
4
|
+
data.tar.gz: 4de66d04dad27fc929fe5071bc9ce8bcf06019cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fbb882c47f5a771f58b83e56e92deae332b5ca5348bc205594c0bbc5f4c3141d13bb121459b320790d1bdda2e98134323bd70498a94cf7650bb71d377be8128
|
7
|
+
data.tar.gz: de2fd8a4eceaa84b3ce58918f4fd15cd19b5f3f8256ab1e44abdb32c3e48eeed8527ee853f08b828aadb78635fb0c3b2552a75a1da297b3f45c52a3399fd0226
|
data/lib/pycall/conversion.rb
CHANGED
@@ -8,8 +8,17 @@ module PyCall
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
def self.each_type_pair
|
12
|
+
i, n = 1, @python_type_map.length
|
13
|
+
while i <= n
|
14
|
+
yield @python_type_map[n - i]
|
15
|
+
i += 1
|
16
|
+
end
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
11
20
|
def self.python_type_mapping(pytype, rbtype)
|
12
|
-
|
21
|
+
each_type_pair do |type_pair|
|
13
22
|
next unless pytype == type_pair.pytype
|
14
23
|
type_pair.rbtype = rbtype
|
15
24
|
return
|
@@ -21,7 +30,7 @@ module PyCall
|
|
21
30
|
unless pyobj.kind_of? PyObject
|
22
31
|
raise
|
23
32
|
end
|
24
|
-
|
33
|
+
each_type_pair do |tp|
|
25
34
|
pytype, rbtype = tp.to_a
|
26
35
|
next unless pyobj.kind_of?(pytype)
|
27
36
|
case
|
@@ -61,7 +70,7 @@ module PyCall
|
|
61
70
|
when Array
|
62
71
|
PyCall::List.new(obj).__pyobj__
|
63
72
|
else
|
64
|
-
|
73
|
+
PyCall.None
|
65
74
|
end
|
66
75
|
end
|
67
76
|
|
data/lib/pycall/dict.rb
CHANGED
@@ -25,10 +25,17 @@ module PyCall
|
|
25
25
|
|
26
26
|
def [](key)
|
27
27
|
key = key.to_s if key.is_a? Symbol
|
28
|
-
if key.is_a? String
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
value = if key.is_a? String
|
29
|
+
LibPython.PyDict_GetItemString(__pyobj__, key).to_ruby
|
30
|
+
else
|
31
|
+
LibPython.PyDict_GetItem(__pyobj__, key).to_ruby
|
32
|
+
end
|
33
|
+
ensure
|
34
|
+
case value
|
35
|
+
when PyObject
|
36
|
+
PyCall.incref(value)
|
37
|
+
when PyObjectWrapper
|
38
|
+
PyCall.incref(value.__pyobj__)
|
32
39
|
end
|
33
40
|
end
|
34
41
|
|
data/lib/pycall/eval.rb
CHANGED
@@ -3,8 +3,8 @@ module PyCall
|
|
3
3
|
Py_eval_input = 258
|
4
4
|
|
5
5
|
def self.eval(str, filename: "pycall")
|
6
|
-
globals_ptr =
|
7
|
-
locals_ptr =
|
6
|
+
globals_ptr = main_dict
|
7
|
+
locals_ptr = main_dict
|
8
8
|
defer_sigint do
|
9
9
|
py_code_ptr = LibPython.Py_CompileString(str, filename, Py_eval_input)
|
10
10
|
raise PyError.fetch if py_code_ptr.null?
|
@@ -15,12 +15,10 @@ module PyCall
|
|
15
15
|
class << self
|
16
16
|
private
|
17
17
|
|
18
|
-
def
|
19
|
-
@
|
20
|
-
|
21
|
-
|
22
|
-
def maindict_ptr
|
23
|
-
@maindict_ptr ||= LibPython.PyModule_GetDict(main_module)
|
18
|
+
def main_dict
|
19
|
+
@main_dict ||= PyCall.import_module("__main__") do |main_module|
|
20
|
+
PyCall.incref(LibPython.PyModule_GetDict(main_module))
|
21
|
+
end
|
24
22
|
end
|
25
23
|
|
26
24
|
def defer_sigint
|
@@ -34,11 +32,18 @@ module PyCall
|
|
34
32
|
name = name.to_s if name.kind_of? Symbol
|
35
33
|
raise TypeError, "name must be a String" unless name.kind_of? String
|
36
34
|
value = LibPython.PyImport_ImportModule(name)
|
37
|
-
|
38
|
-
|
35
|
+
raise PyError.fetch if value.null?
|
36
|
+
value = value.to_ruby
|
37
|
+
return value unless block_given?
|
38
|
+
begin
|
39
|
+
yield value
|
40
|
+
ensure
|
41
|
+
PyCall.decref(value)
|
42
|
+
end
|
39
43
|
end
|
40
44
|
|
41
|
-
def self.eval(str)
|
42
|
-
Eval.eval(str)
|
45
|
+
def self.eval(str, conversion: true)
|
46
|
+
result = Eval.eval(str)
|
47
|
+
conversion ? result.to_ruby : result
|
43
48
|
end
|
44
49
|
end
|
data/lib/pycall/libpython.rb
CHANGED
@@ -137,6 +137,11 @@ module PyCall
|
|
137
137
|
attach_function :Py_InitializeEx, [:int], :void
|
138
138
|
attach_function :Py_IsInitialized, [], :int
|
139
139
|
|
140
|
+
# Reference count
|
141
|
+
|
142
|
+
attach_function :Py_IncRef, [PyObject.by_ref], :void
|
143
|
+
attach_function :Py_DecRef, [PyObject.by_ref], :void
|
144
|
+
|
140
145
|
# Object
|
141
146
|
|
142
147
|
attach_function :PyObject_RichCompare, [PyObject.by_ref, PyObject.by_ref, :int], PyObject.by_ref
|
data/lib/pycall/pyobject.rb
CHANGED
@@ -34,7 +34,7 @@ module PyCall
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def py_none?
|
37
|
-
to_ptr ==
|
37
|
+
to_ptr == PyCall.None.to_ptr
|
38
38
|
end
|
39
39
|
|
40
40
|
def kind_of?(klass)
|
@@ -107,7 +107,7 @@ module PyCall
|
|
107
107
|
|
108
108
|
def **(other)
|
109
109
|
other = Conversions.from_ruby(other)
|
110
|
-
value = LibPython.PyNumber_Power(self, other,
|
110
|
+
value = LibPython.PyNumber_Power(self, other, PyCall.None)
|
111
111
|
return value.to_ruby unless value.null?
|
112
112
|
raise PyError.fetch
|
113
113
|
end
|
@@ -1,5 +1,36 @@
|
|
1
1
|
module PyCall
|
2
2
|
module PyObjectWrapper
|
3
|
+
module ClassMethods
|
4
|
+
private
|
5
|
+
|
6
|
+
def wrap_class(pyobj)
|
7
|
+
define_singleton_method(:__pyobj__) { pyobj }
|
8
|
+
|
9
|
+
PyCall.dir(__pyobj__).each do |name|
|
10
|
+
obj = PyCall.getattr(__pyobj__, name)
|
11
|
+
next unless obj.kind_of?(PyCall::PyObject) || obj.kind_of?(PyCall::PyObjectWrapper)
|
12
|
+
next unless PyCall.callable?(obj)
|
13
|
+
|
14
|
+
define_method(name) do |*args, **kwargs|
|
15
|
+
PyCall.getattr(__pyobj__, name).(*args, **kwargs)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class << self
|
20
|
+
def method_missing(name, *args, **kwargs)
|
21
|
+
return super unless PyCall.hasattr?(__pyobj__, name)
|
22
|
+
PyCall.getattr(__pyobj__, name)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
PyCall::Conversions.python_type_mapping(__pyobj__, self)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.included(mod)
|
31
|
+
mod.extend ClassMethods
|
32
|
+
end
|
33
|
+
|
3
34
|
def initialize(pyobj, pytype=nil)
|
4
35
|
check_type pyobj, pytype
|
5
36
|
pytype ||= LibPython.PyObject_Type(pyobj)
|
data/lib/pycall/utils.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
module PyCall
|
2
2
|
module Utils
|
3
|
+
def append_sys_path(path_str)
|
4
|
+
pyobj = LibPython.PyUnicode_DecodeUTF8(path_str, path_str.bytesize, nil)
|
5
|
+
sys.path.append.(pyobj)
|
6
|
+
end
|
7
|
+
|
3
8
|
def callable?(pyobj)
|
4
9
|
case pyobj
|
5
10
|
when PyObject
|
@@ -19,6 +24,17 @@ module PyCall
|
|
19
24
|
raise PyError.fetch
|
20
25
|
end
|
21
26
|
|
27
|
+
def incref(pyobj)
|
28
|
+
LibPython.Py_IncRef(pyobj)
|
29
|
+
pyobj
|
30
|
+
end
|
31
|
+
|
32
|
+
def decref(pyobj)
|
33
|
+
LibPython.Py_DecRef(pyobj)
|
34
|
+
pyobj.send :pointer=, FFI::Pointer::NULL
|
35
|
+
pyobj
|
36
|
+
end
|
37
|
+
|
22
38
|
def int(pyobj)
|
23
39
|
@int ||= PyCall.eval('int')
|
24
40
|
@int.(pyobj)
|
@@ -29,6 +45,10 @@ module PyCall
|
|
29
45
|
@len.(pyobj)
|
30
46
|
end
|
31
47
|
|
48
|
+
def None
|
49
|
+
LibPython.Py_None
|
50
|
+
end
|
51
|
+
|
32
52
|
def slice(*args)
|
33
53
|
Slice.new(*args)
|
34
54
|
end
|
@@ -38,6 +58,10 @@ module PyCall
|
|
38
58
|
@str.(pyobj)
|
39
59
|
end
|
40
60
|
|
61
|
+
def sys
|
62
|
+
@sys ||= PyCall.import_module('sys')
|
63
|
+
end
|
64
|
+
|
41
65
|
def tuple(*args)
|
42
66
|
PyCall::Tuple[*args]
|
43
67
|
end
|
data/lib/pycall/version.rb
CHANGED
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.
|
4
|
+
version: 0.1.0.alpha.20170307
|
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-
|
11
|
+
date: 2017-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|