rubypython 0.2.11 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/{History.txt → History.markdown} +34 -28
- data/Manifest.txt +26 -40
- data/PostInstall.txt +2 -1
- data/README.markdown +103 -0
- data/Rakefile +19 -3
- data/lib/rubypython.rb +118 -114
- data/lib/rubypython/blankobject.rb +21 -0
- data/lib/rubypython/conversion.rb +198 -0
- data/lib/rubypython/core_ext/string.rb +7 -0
- data/lib/rubypython/legacy.rb +15 -0
- data/lib/rubypython/macros.rb +47 -0
- data/lib/rubypython/operators.rb +111 -0
- data/lib/rubypython/pymainclass.rb +51 -0
- data/lib/rubypython/pyobject.rb +203 -0
- data/lib/rubypython/python.rb +111 -0
- data/lib/rubypython/pythonerror.rb +78 -0
- data/lib/rubypython/rubypyproxy.rb +214 -0
- data/lib/rubypython/version.rb +4 -3
- data/spec/conversion_spec.rb +66 -0
- data/spec/legacy_spec.rb +22 -0
- data/spec/pymainclass_spec.rb +26 -0
- data/spec/pyobject_spec.rb +264 -0
- data/spec/python_helpers/objects.py +41 -0
- data/spec/pythonerror_spec.rb +43 -0
- data/spec/refcnt_spec.rb +68 -0
- data/spec/rubypyclass_spec.rb +13 -0
- data/spec/rubypyproxy_spec.rb +249 -0
- data/spec/rubypython_spec.rb +62 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +51 -0
- metadata +79 -73
- metadata.gz.sig +0 -0
- data/README.txt +0 -60
- data/ext/rubypython_bridge/cbridge.c +0 -150
- data/ext/rubypython_bridge/cbridge.h +0 -15
- data/ext/rubypython_bridge/config.h +0 -14
- data/ext/rubypython_bridge/extconf.rb +0 -43
- data/ext/rubypython_bridge/ptor.c +0 -242
- data/ext/rubypython_bridge/ptor.h +0 -15
- data/ext/rubypython_bridge/rp_blankobject.c +0 -42
- data/ext/rubypython_bridge/rp_blankobject.h +0 -11
- data/ext/rubypython_bridge/rp_class.c +0 -56
- data/ext/rubypython_bridge/rp_class.h +0 -7
- data/ext/rubypython_bridge/rp_error.c +0 -34
- data/ext/rubypython_bridge/rp_error.h +0 -11
- data/ext/rubypython_bridge/rp_function.c +0 -31
- data/ext/rubypython_bridge/rp_function.h +0 -7
- data/ext/rubypython_bridge/rp_instance.c +0 -164
- data/ext/rubypython_bridge/rp_instance.h +0 -7
- data/ext/rubypython_bridge/rp_module.c +0 -160
- data/ext/rubypython_bridge/rp_module.h +0 -8
- data/ext/rubypython_bridge/rp_object.c +0 -194
- data/ext/rubypython_bridge/rp_object.h +0 -23
- data/ext/rubypython_bridge/rp_util.c +0 -63
- data/ext/rubypython_bridge/rp_util.h +0 -11
- data/ext/rubypython_bridge/rtop.c +0 -212
- data/ext/rubypython_bridge/rtop.h +0 -17
- data/ext/rubypython_bridge/rubypython_bridge.c +0 -125
- data/ext/rubypython_bridge/rubypython_bridge.h +0 -10
- data/lib/rubypython/session.rb +0 -4
- data/lib/rubypython/wrapper_extensions.rb +0 -83
- data/setup.rb +0 -1585
- data/tasks/environment.rake +0 -7
- data/tasks/extconf.rake +0 -13
- data/tasks/extconf/rubypython_bridge.rake +0 -49
- data/test/python_helpers/objects.py +0 -12
- data/test/test.wav +0 -0
- data/test/test_helper.rb +0 -2
- data/test/test_rubypython.rb +0 -215
- data/test/test_rubypython_bridge_extn.rb +0 -133
- data/test/test_session.rb +0 -6
data/tasks/environment.rake
DELETED
data/tasks/extconf.rake
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
namespace :extconf do
|
2
|
-
desc "Compiles the Ruby extension"
|
3
|
-
task :compile
|
4
|
-
end
|
5
|
-
|
6
|
-
task :compile => "extconf:compile"
|
7
|
-
|
8
|
-
task :test => :compile
|
9
|
-
|
10
|
-
BIN = "*.{bundle,jar,so,obj,pdb,lib,def,exp}"
|
11
|
-
$hoe.clean_globs |= ["ext/**/#{BIN}", "lib/**/#{BIN}", 'ext/**/Makefile']
|
12
|
-
$hoe.spec.require_paths = Dir['{lib,ext/*}']
|
13
|
-
$hoe.spec.extensions = FileList["ext/**/extconf.rb"].to_a
|
@@ -1,49 +0,0 @@
|
|
1
|
-
namespace :extconf do
|
2
|
-
extension = File.basename(__FILE__, '.rake')
|
3
|
-
|
4
|
-
ext = "ext/#{extension}"
|
5
|
-
ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
|
6
|
-
ext_files = FileList[
|
7
|
-
"#{ext}/*.c",
|
8
|
-
"#{ext}/*.h",
|
9
|
-
"#{ext}/*.rl",
|
10
|
-
"#{ext}/extconf.rb",
|
11
|
-
"#{ext}/Makefile",
|
12
|
-
# "lib"
|
13
|
-
]
|
14
|
-
|
15
|
-
|
16
|
-
task :compile => extension do
|
17
|
-
if Dir.glob("**/#{extension}.{o,so,dll}").length == 0
|
18
|
-
STDERR.puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
19
|
-
STDERR.puts "Gem actually failed to build. Your system is"
|
20
|
-
STDERR.puts "NOT configured properly to build #{GEM_NAME}."
|
21
|
-
STDERR.puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
22
|
-
exit(1)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
desc "Builds just the #{extension} extension"
|
27
|
-
task extension.to_sym => ["#{ext}/Makefile", ext_so, "lib/#{extension}.#{Config::CONFIG['DLEXT']}"]
|
28
|
-
|
29
|
-
file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
|
30
|
-
Dir.chdir(ext) do ruby "extconf.rb" end
|
31
|
-
end
|
32
|
-
|
33
|
-
file "lib/#{extension}.#{Config::CONFIG['DLEXT']}" => ext_so do
|
34
|
-
require "fileutils"
|
35
|
-
puts "Copying #{ext_so} into lib directory for testing."
|
36
|
-
FileUtils.cp(ext_so,"lib/#{extension}.#{Config::CONFIG['DLEXT']}")
|
37
|
-
end
|
38
|
-
|
39
|
-
file ext_so => ext_files do
|
40
|
-
Dir.chdir(ext) do
|
41
|
-
sh(RUBY_PLATFORM =~ /win32/ ? 'nmake' : 'make') do |ok, res|
|
42
|
-
if !ok
|
43
|
-
require "fileutils"
|
44
|
-
FileUtils.rm Dir.glob('*.{so,o,dll,bundle}')
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/test/test.wav
DELETED
Binary file
|
data/test/test_helper.rb
DELETED
data/test/test_rubypython.rb
DELETED
@@ -1,215 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
|
3
|
-
class TestRubypython < Test::Unit::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
end
|
7
|
-
|
8
|
-
|
9
|
-
def test_simple
|
10
|
-
assert(RubyPython.start,"RubyPython failed to initialize.")
|
11
|
-
assert(RubyPython.import("urllib"), "urllib library import failed.")
|
12
|
-
assert(RubyPython.stop,"RubyPython failed to halt.")
|
13
|
-
assert(!RubyPython.stop,"RubyPython did not realize it had halted.")
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_delegation
|
17
|
-
RubyPython.start
|
18
|
-
cPickle=RubyPython.import("cPickle")
|
19
|
-
|
20
|
-
assert_instance_of(RubyPythonBridge::RubyPyModule,
|
21
|
-
cPickle,
|
22
|
-
"Module object not returned by import.")
|
23
|
-
|
24
|
-
assert_equal({"a"=>"n", [1, "2"]=>4},
|
25
|
-
cPickle.loads("(dp1\nS'a'\nS'n'\ns(I1\nS'2'\ntp2\nI4\ns."),
|
26
|
-
"Python pickle load test returned incorrect objects.")
|
27
|
-
|
28
|
-
dumped_array=cPickle.dumps([1,2,3,4])
|
29
|
-
|
30
|
-
assert_equal([1,2,3,4],
|
31
|
-
cPickle.loads(dumped_array),
|
32
|
-
"Pickled information was not retrieved correctly.")
|
33
|
-
|
34
|
-
assert_raise(NoMethodError, "Rubypython failed to raise NoMethodError on call to nonexistent method") do
|
35
|
-
cPickle.splack
|
36
|
-
end
|
37
|
-
|
38
|
-
assert_instance_of(RubyPythonBridge::RubyPyClass,
|
39
|
-
cPickle.PicklingError,
|
40
|
-
"Wrapped Python class was not of type RubyPyClass.")
|
41
|
-
|
42
|
-
cPickle.free_pobj
|
43
|
-
|
44
|
-
ObjectSpace.each_object(RubyPythonBridge::RubyPyObject) do |o|
|
45
|
-
o.free_pobj
|
46
|
-
end
|
47
|
-
|
48
|
-
assert(RubyPython.stop,"Interpreter did not halt correctly.")
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_two_imports
|
52
|
-
RubyPython.start
|
53
|
-
assert_nothing_raised("Error raised on imports") do
|
54
|
-
RubyPython.import "cPickle"
|
55
|
-
RubyPython.import "urllib"
|
56
|
-
end
|
57
|
-
RubyPython.stop
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_propogate_python_error
|
61
|
-
RubyPython.start
|
62
|
-
|
63
|
-
assert_raise(PythonError,"rubypython failed to propogate python error.") do
|
64
|
-
RubyPython.import "slasdfj"
|
65
|
-
end
|
66
|
-
|
67
|
-
RubyPython.stop
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_run_method
|
71
|
-
unpickled=nil
|
72
|
-
|
73
|
-
RubyPython.run do
|
74
|
-
cPickle=import "cPickle"
|
75
|
-
cPickle.inspect
|
76
|
-
unpickled=cPickle.loads("(dp1\nS'a'\nS'n'\ns(I1\nS'2'\ntp2\nI4\ns.")
|
77
|
-
end
|
78
|
-
|
79
|
-
assert_equal({"a"=>"n", [1, "2"]=>4},
|
80
|
-
unpickled,
|
81
|
-
"Incorrect object returned from cPickle.")
|
82
|
-
|
83
|
-
assert(!RubyPython.stop, "RubyPython did not seem to halt at the correct time.")
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_instance_method_delegation
|
87
|
-
RubyPython.start
|
88
|
-
|
89
|
-
wave=RubyPython.import "wave"
|
90
|
-
w=wave.open("test/test.wav","rb")
|
91
|
-
assert_equal(9600,
|
92
|
-
w.getframerate,
|
93
|
-
"Wrapped wave library incorrectly passing framerate.")
|
94
|
-
w.close
|
95
|
-
|
96
|
-
RubyPython.stop
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_pymain_delegation
|
100
|
-
RubyPython.start
|
101
|
-
|
102
|
-
assert_equal(42.to_f,
|
103
|
-
PyMain.float(42),
|
104
|
-
"Integer conversion problems in Python.")
|
105
|
-
|
106
|
-
RubyPython.stop
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_block_syntax
|
110
|
-
returned=""
|
111
|
-
|
112
|
-
RubyPython.start
|
113
|
-
|
114
|
-
returned = PyMain.float(22) do |f|
|
115
|
-
f*2
|
116
|
-
end
|
117
|
-
|
118
|
-
assert_equal(44.0,
|
119
|
-
returned,
|
120
|
-
"Wrapped Python object failed to correctly utilize block syntax.")
|
121
|
-
|
122
|
-
RubyPython.stop
|
123
|
-
end
|
124
|
-
|
125
|
-
def test_session_function
|
126
|
-
RubyPython.session do
|
127
|
-
|
128
|
-
cPickle=RubyPython.import "cPickle"
|
129
|
-
|
130
|
-
cPickle.inspect
|
131
|
-
|
132
|
-
assert_equal({"a"=>"n", [1, "2"]=>4},
|
133
|
-
cPickle.loads("(dp1\nS'a'\nS'n'\ns(I1\nS'2'\ntp2\nI4\ns."),
|
134
|
-
"cPickle misbehaved in session block.")
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
|
139
|
-
def test_setter_ary
|
140
|
-
RubyPython.session do
|
141
|
-
|
142
|
-
sys=RubyPython.import 'sys'
|
143
|
-
|
144
|
-
sys.path=[".",".."]
|
145
|
-
|
146
|
-
assert_equal([".",".."],
|
147
|
-
sys.path,
|
148
|
-
"Ruby failed to modify Python object as expected.")
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
def test_setter_instance
|
153
|
-
RubyPython.session do
|
154
|
-
urllib2=RubyPython.import "urllib2"
|
155
|
-
req=urllib2.Request("google.com")
|
156
|
-
req.headers={:a=>"2","k"=>4}
|
157
|
-
assert_equal({"a"=>"2","k"=>4},
|
158
|
-
req.headers,
|
159
|
-
"Python dictionary not set as expected.")
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
def test_set_twice
|
164
|
-
RubyPython.session do
|
165
|
-
sys = RubyPython.import 'sys'
|
166
|
-
|
167
|
-
sys.path = ['.']
|
168
|
-
|
169
|
-
sys.path = ['..']
|
170
|
-
|
171
|
-
assert_equal(['..'],
|
172
|
-
sys.path,
|
173
|
-
"Ruby failed to modify Python object as expected.")
|
174
|
-
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
end
|
179
|
-
|
180
|
-
class TestWithCustomObject < Test::Unit::TestCase
|
181
|
-
def setup
|
182
|
-
RubyPython.start
|
183
|
-
sys = RubyPython.import 'sys'
|
184
|
-
sys.path = ['./test/python_helpers']
|
185
|
-
@objects = RubyPython.import 'objects'
|
186
|
-
end
|
187
|
-
|
188
|
-
def teardown
|
189
|
-
RubyPython.stop
|
190
|
-
end
|
191
|
-
|
192
|
-
def test_string_access
|
193
|
-
assert_equal("STRING",
|
194
|
-
@objects.RubyPythonMockObject.STRING,
|
195
|
-
"String class members not being converted correctly.")
|
196
|
-
rbString = @objects.RubyPythonMockObject.STRING
|
197
|
-
end
|
198
|
-
|
199
|
-
def test_string_ary_access
|
200
|
-
assert_equal(["STRING1", "STRING2"],
|
201
|
-
@objects.RubyPythonMockObject.STRING_LIST,
|
202
|
-
"List of strings class member not being converted correctly.")
|
203
|
-
rbStringList = @objects.RubyPythonMockObject.STRING_LIST
|
204
|
-
end
|
205
|
-
|
206
|
-
def test_string_ary_modify
|
207
|
-
rbStringList = @objects.RubyPythonMockObject.STRING_LIST
|
208
|
-
rbStringList.push"NEW_STRING"
|
209
|
-
@objects.RubyPythonMockObject.STRING_LIST = rbStringList
|
210
|
-
assert_equal("NEW_STRING",
|
211
|
-
@objects.RubyPythonMockObject.STRING_LIST[2],
|
212
|
-
"Failed to add object to list.")
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
@@ -1,133 +0,0 @@
|
|
1
|
-
require "test/unit"
|
2
|
-
|
3
|
-
$:.unshift File.dirname(__FILE__) + "/../ext/rubypython_bridge"
|
4
|
-
require "rubypython_bridge.so"
|
5
|
-
|
6
|
-
class TestRubyPythonBridgeExtn < Test::Unit::TestCase
|
7
|
-
|
8
|
-
def test_func_with_module
|
9
|
-
pickle_return = RubyPythonBridge.func("cPickle",
|
10
|
-
"loads", "(dp1\nS'a'\nS'n'\ns(I1\nS'2'\ntp2\nI4\ns.")
|
11
|
-
|
12
|
-
assert_equal({"a"=>"n", [1, "2"]=>4},pickle_return)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_start_stop
|
16
|
-
assert(RubyPythonBridge.start, "Embedded python interpreter failed to start correctly.")
|
17
|
-
|
18
|
-
assert(!RubyPythonBridge.start, "Interpreter attempted to start while running.")
|
19
|
-
|
20
|
-
assert(RubyPythonBridge.stop, "Interpreter failed to halt.")
|
21
|
-
|
22
|
-
assert(!RubyPythonBridge.stop, "Interpreter ran into trouble while halting.")
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_new_instance
|
26
|
-
RubyPythonBridge.start
|
27
|
-
|
28
|
-
urllib2 = RubyPythonBridge.import "urllib2"
|
29
|
-
|
30
|
-
assert_instance_of(RubyPythonBridge::RubyPyClass,
|
31
|
-
urllib2.Request,
|
32
|
-
"Wrapped Python class not of correct type.")
|
33
|
-
|
34
|
-
assert_instance_of(RubyPythonBridge::RubyPyInstance,
|
35
|
-
urllib2.Request("google.com"),
|
36
|
-
"Wrapped python instance not of correct type.")
|
37
|
-
|
38
|
-
RubyPythonBridge.stop
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_new_instance_with_new_method
|
42
|
-
RubyPythonBridge.start
|
43
|
-
|
44
|
-
urllib2=RubyPythonBridge.import "urllib2"
|
45
|
-
|
46
|
-
assert_instance_of(RubyPythonBridge::RubyPyClass,
|
47
|
-
urllib2.Request,
|
48
|
-
"Wrapped Python class not of correct type.")
|
49
|
-
|
50
|
-
assert_instance_of(RubyPythonBridge::RubyPyInstance,
|
51
|
-
urllib2.Request.new("google.com"),
|
52
|
-
"New call misbehaving of wrapped class.")
|
53
|
-
|
54
|
-
RubyPythonBridge.stop
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
class TestRubyPythonBridgeWithCPickle < Test::Unit::TestCase
|
60
|
-
def setup
|
61
|
-
RubyPythonBridge.start
|
62
|
-
@cPickle=RubyPythonBridge.import "cPickle"
|
63
|
-
end
|
64
|
-
|
65
|
-
def teardown
|
66
|
-
ObjectSpace.each_object(RubyPythonBridge::RubyPyObject) do |o|
|
67
|
-
o.free_pobj
|
68
|
-
end
|
69
|
-
RubyPythonBridge.stop
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_mod_respond_to
|
73
|
-
assert(@cPickle.respond_to?(:loads),
|
74
|
-
"Ruby respond to method not working on wrapped module.")
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_data_passing
|
78
|
-
assert_equal({"a"=>"n", [1, "2"]=>4},
|
79
|
-
@cPickle.loads( "(dp1\nS'a'\nS'n'\ns(I1\nS'2'\ntp2\nI4\ns."),
|
80
|
-
"Data returned from wrapped cPickle is incorrect." )
|
81
|
-
|
82
|
-
orig_array = [1,2,3,4]
|
83
|
-
dumped_array = @cPickle.dumps(orig_array)
|
84
|
-
|
85
|
-
assert_equal(orig_array,
|
86
|
-
@cPickle.loads(dumped_array),
|
87
|
-
"Array returned from cPickle is not equivalent to input array.")
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_unknown_method
|
91
|
-
assert_raise(NoMethodError, "Missing method failed to raise NoMethodError") do
|
92
|
-
@cPickle.splack
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_class_wrapping
|
97
|
-
assert_instance_of(RubyPythonBridge::RubyPyClass,
|
98
|
-
@cPickle.PicklingError,
|
99
|
-
"Wrapped class is not an instance of RubyPyClass.")
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_module_wrapping
|
103
|
-
assert_instance_of(RubyPythonBridge::RubyPyModule,
|
104
|
-
@cPickle,
|
105
|
-
"Wrapped module is not of class RubyPyModule.")
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
|
111
|
-
class TestRubyPythonBridgeWithUrllib2 < Test::Unit::TestCase
|
112
|
-
def setup
|
113
|
-
RubyPythonBridge.start
|
114
|
-
@urllib2=RubyPythonBridge.import "urllib2"
|
115
|
-
end
|
116
|
-
|
117
|
-
def teardown
|
118
|
-
ObjectSpace.each_object(RubyPythonBridge::RubyPyObject) do |o|
|
119
|
-
o.free_pobj
|
120
|
-
end
|
121
|
-
RubyPythonBridge.stop
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_class_respond_to
|
125
|
-
assert(@urllib2.Request.respond_to? :get_data)
|
126
|
-
end
|
127
|
-
|
128
|
-
def test_instance_respond_to
|
129
|
-
assert(@urllib2.Request.new("google.com").respond_to? :get_data)
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|
133
|
-
|