rubypython 0.2.11 → 0.3.0
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.
- 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
@@ -1,14 +0,0 @@
|
|
1
|
-
#ifndef _PYTHON_H_
|
2
|
-
#define _PYTHON_H_
|
3
|
-
#include "Python.h"
|
4
|
-
#endif /* _PYTHON_H_ */
|
5
|
-
|
6
|
-
#ifndef _STDLIB_H_
|
7
|
-
#define _STDLIB_H_
|
8
|
-
#include "stdlib.h"
|
9
|
-
#endif /* _STDLIB_H_ */
|
10
|
-
|
11
|
-
#ifndef _RUBY_H_
|
12
|
-
#define _RUBY_H_
|
13
|
-
#include "ruby.h"
|
14
|
-
#endif /* _RUBY_H_ */
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'mkmf'
|
2
|
-
require 'open3'
|
3
|
-
|
4
|
-
begin
|
5
|
-
if (Open3.popen3("python --version") { |i,o,e| e.read}.chomp.split[1].to_f < 2.4)
|
6
|
-
puts "Rubypython seem to think you don't have python 2.4 or higher."
|
7
|
-
puts "Try install anyway? (y/n)"
|
8
|
-
c=gets.chomp
|
9
|
-
while !["y","n"].member? c do
|
10
|
-
puts "Please type y or n"
|
11
|
-
end
|
12
|
-
if(c=="n")
|
13
|
-
exit -1
|
14
|
-
end
|
15
|
-
end
|
16
|
-
rescue
|
17
|
-
puts "Could not check python version. Do you have Python 2.4 or higher? (y/n)"
|
18
|
-
if(gets.chomp == "n")
|
19
|
-
puts "Please install Python 2.4 or higher"
|
20
|
-
exit
|
21
|
-
end
|
22
|
-
puts "Okay."
|
23
|
-
end
|
24
|
-
dir_config("rubypython_bridge")
|
25
|
-
if(!system("which python-config"))
|
26
|
-
print "Can't configure with python_config"
|
27
|
-
exit -1
|
28
|
-
end
|
29
|
-
|
30
|
-
#unless find_library("python2.6",nil)||find_library("python2.5",nil)||find_library("python2.4",nil)
|
31
|
-
# puts "Could not find python libraries"
|
32
|
-
# exit -1
|
33
|
-
#end
|
34
|
-
$LDFLAGS << " " + `python-config --ldflags`
|
35
|
-
$CPPFLAGS << " " + `python-config --includes`.chomp
|
36
|
-
|
37
|
-
if RUBY_VERSION=~/1\.9/ then
|
38
|
-
puts "Building for Ruby 1.9"
|
39
|
-
$CPPFLAGS += " -DRUBY_19"
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
create_makefile("rubypython_bridge")
|
@@ -1,242 +0,0 @@
|
|
1
|
-
#include "ptor.h"
|
2
|
-
|
3
|
-
#include "rp_error.h"
|
4
|
-
#include "rp_function.h"
|
5
|
-
#include "rp_instance.h"
|
6
|
-
#include "rp_class.h"
|
7
|
-
|
8
|
-
|
9
|
-
/* Note:
|
10
|
-
The conversion functions for the builtin types are just that,
|
11
|
-
conversion functions. They create a new Ruby object equivalent to
|
12
|
-
the given Python object, they do not wrap the Python object.
|
13
|
-
|
14
|
-
*/
|
15
|
-
|
16
|
-
VALUE ptorString(PyObject* pString)
|
17
|
-
{
|
18
|
-
// Make sure pString is actually a string
|
19
|
-
if(!PyString_Check(pString)) return Qnil;
|
20
|
-
|
21
|
-
// Allocate a new string for Ruby and return it.
|
22
|
-
// Note that this is a new object, not a wrapper around a
|
23
|
-
// python object
|
24
|
-
char* cStr;
|
25
|
-
char* cStrCopy;
|
26
|
-
|
27
|
-
cStr = PyString_AsString(pString);
|
28
|
-
|
29
|
-
cStrCopy = malloc(PyString_Size(pString) * sizeof(char));
|
30
|
-
|
31
|
-
strcpy(cStrCopy, cStr);
|
32
|
-
|
33
|
-
|
34
|
-
return rb_str_new2(cStrCopy);
|
35
|
-
}
|
36
|
-
|
37
|
-
VALUE ptorList(PyObject* pList)
|
38
|
-
{
|
39
|
-
// Verify that pList is a python list
|
40
|
-
if(!PyList_Check(pList)) return Qnil;
|
41
|
-
|
42
|
-
VALUE rArray;
|
43
|
-
VALUE rElement;
|
44
|
-
PyObject* element;
|
45
|
-
|
46
|
-
int i = 0;
|
47
|
-
|
48
|
-
// Allocate a new Ruby array
|
49
|
-
rArray = rb_ary_new();
|
50
|
-
|
51
|
-
// Iteratively add converted elements to the new Ruby list
|
52
|
-
int list_size = PyList_Size(pList);
|
53
|
-
for(i = 0; i < list_size; i++)
|
54
|
-
{
|
55
|
-
element = PyList_GetItem(pList, i);
|
56
|
-
Py_INCREF(element);
|
57
|
-
rElement = ptorObject(element);
|
58
|
-
rb_ary_push(rArray, rElement);
|
59
|
-
}
|
60
|
-
return rArray;
|
61
|
-
}
|
62
|
-
|
63
|
-
VALUE ptorInt(PyObject* pNum)
|
64
|
-
{
|
65
|
-
if(!PyInt_Check(pNum)) return Qnil;
|
66
|
-
|
67
|
-
VALUE rNum;
|
68
|
-
|
69
|
-
rNum = INT2NUM(PyInt_AsLong(pNum));
|
70
|
-
return rNum;
|
71
|
-
|
72
|
-
}
|
73
|
-
|
74
|
-
VALUE ptorLong(PyObject* pNum)
|
75
|
-
{
|
76
|
-
if(!PyLong_Check(pNum)) return Qnil;
|
77
|
-
|
78
|
-
VALUE rNum;
|
79
|
-
long cNum;
|
80
|
-
|
81
|
-
cNum = PyLong_AsLong(pNum);
|
82
|
-
|
83
|
-
if(PyErr_ExceptionMatches(PyExc_OverflowError))
|
84
|
-
{
|
85
|
-
rpPythonError();
|
86
|
-
return Qnil;
|
87
|
-
}
|
88
|
-
|
89
|
-
rNum = INT2NUM(cNum);
|
90
|
-
|
91
|
-
return rNum;
|
92
|
-
|
93
|
-
}
|
94
|
-
|
95
|
-
VALUE ptorFloat(PyObject* pNum)
|
96
|
-
{
|
97
|
-
if(!PyFloat_Check(pNum)) return Qnil;
|
98
|
-
|
99
|
-
VALUE rNum;
|
100
|
-
|
101
|
-
rNum = rb_float_new(PyFloat_AsDouble(pNum));
|
102
|
-
|
103
|
-
return rNum;
|
104
|
-
}
|
105
|
-
|
106
|
-
VALUE ptorTuple(PyObject* pTuple)
|
107
|
-
{
|
108
|
-
if(!PyTuple_Check(pTuple)) return Qnil;
|
109
|
-
|
110
|
-
VALUE rArray;
|
111
|
-
PyObject* pList;
|
112
|
-
|
113
|
-
pList = PySequence_List(pTuple);
|
114
|
-
rArray = ptorList(pList);
|
115
|
-
Py_DECREF(pList);
|
116
|
-
|
117
|
-
return rArray;
|
118
|
-
}
|
119
|
-
|
120
|
-
|
121
|
-
VALUE ptorDict(PyObject* pDict)
|
122
|
-
{
|
123
|
-
if(!PyDict_Check(pDict)) return Qnil;
|
124
|
-
|
125
|
-
VALUE rHash;
|
126
|
-
VALUE rKey, rVal;
|
127
|
-
PyObject *key,*val;
|
128
|
-
Py_ssize_t pos = 0;
|
129
|
-
|
130
|
-
rHash = rb_hash_new();
|
131
|
-
|
132
|
-
while(PyDict_Next(pDict,&pos,&key,&val))
|
133
|
-
{
|
134
|
-
Py_XINCREF(key);
|
135
|
-
Py_XINCREF(val);
|
136
|
-
rKey = ptorObject(key);
|
137
|
-
rVal = ptorObject(val);
|
138
|
-
if(rKey == Qnil) continue;
|
139
|
-
rb_hash_aset(rHash, rKey, rVal);
|
140
|
-
}
|
141
|
-
|
142
|
-
return rHash;
|
143
|
-
}
|
144
|
-
|
145
|
-
static VALUE ptorObjectBasic(PyObject *pObj, int destructive)
|
146
|
-
{
|
147
|
-
VALUE rObj;
|
148
|
-
|
149
|
-
// Test the Python object vs various types and convert / wrap it
|
150
|
-
// appropriately. If the destructive flag is set, we destroy
|
151
|
-
// the original.
|
152
|
-
|
153
|
-
if(PyObject_TypeCheck(pObj,&PyString_Type))
|
154
|
-
{
|
155
|
-
rObj = ptorString(pObj);
|
156
|
-
if(destructive) Py_DECREF(pObj);
|
157
|
-
return rObj;
|
158
|
-
}
|
159
|
-
|
160
|
-
if(PyObject_TypeCheck(pObj,&PyList_Type))
|
161
|
-
{
|
162
|
-
rObj = ptorList(pObj);
|
163
|
-
if(destructive) Py_DECREF(pObj);
|
164
|
-
return rObj;
|
165
|
-
}
|
166
|
-
if(PyObject_TypeCheck(pObj,&PyInt_Type))
|
167
|
-
{
|
168
|
-
rObj = ptorInt(pObj);
|
169
|
-
if(destructive) Py_DECREF(pObj);
|
170
|
-
return rObj;
|
171
|
-
}
|
172
|
-
if(PyObject_TypeCheck(pObj,&PyLong_Type))
|
173
|
-
{
|
174
|
-
rObj = ptorLong(pObj);
|
175
|
-
if(destructive) Py_DECREF(pObj);
|
176
|
-
return rObj;
|
177
|
-
}
|
178
|
-
if(PyObject_TypeCheck(pObj,&PyFloat_Type))
|
179
|
-
{
|
180
|
-
rObj = ptorFloat(pObj);
|
181
|
-
if(destructive) Py_DECREF(pObj);
|
182
|
-
return rObj;
|
183
|
-
}
|
184
|
-
if(PyObject_TypeCheck(pObj,&PyTuple_Type))
|
185
|
-
{
|
186
|
-
rObj = ptorTuple(pObj);
|
187
|
-
if(destructive) Py_DECREF(pObj);
|
188
|
-
return rObj;
|
189
|
-
}
|
190
|
-
if(PyObject_TypeCheck(pObj,&PyDict_Type))
|
191
|
-
{
|
192
|
-
rObj = ptorDict(pObj);
|
193
|
-
if(destructive) Py_DECREF(pObj);
|
194
|
-
return rObj;
|
195
|
-
}
|
196
|
-
|
197
|
-
if(pObj == Py_True)
|
198
|
-
{
|
199
|
-
if(destructive) Py_DECREF(Py_True);
|
200
|
-
return Qtrue;
|
201
|
-
}
|
202
|
-
if(pObj == Py_False)
|
203
|
-
{
|
204
|
-
if(destructive) Py_DECREF(Py_False);
|
205
|
-
return Qfalse;
|
206
|
-
}
|
207
|
-
if(pObj == Py_None)
|
208
|
-
{
|
209
|
-
return Qnil;
|
210
|
-
}
|
211
|
-
if(PyFunction_Check(pObj)||PyMethod_Check(pObj)||!PyObject_HasAttrString(pObj,"__dict__"))
|
212
|
-
{
|
213
|
-
return rpFunctionFromPyObject(pObj);
|
214
|
-
|
215
|
-
}
|
216
|
-
if(PyInstance_Check(pObj))
|
217
|
-
{
|
218
|
-
rObj = rpInstanceFromPyObject(pObj);
|
219
|
-
return rObj;
|
220
|
-
}
|
221
|
-
|
222
|
-
// Fallthrough behavior: The object is a class which should be wrapped
|
223
|
-
return rpClassFromPyObject(pObj);
|
224
|
-
}
|
225
|
-
|
226
|
-
// Convert a Python object to a Ruby object and destroy the original
|
227
|
-
VALUE ptorObjectKeep(PyObject *pObj)
|
228
|
-
{
|
229
|
-
VALUE rObj;
|
230
|
-
rObj = ptorObjectBasic(pObj, 0);
|
231
|
-
return rObj;
|
232
|
-
}
|
233
|
-
|
234
|
-
|
235
|
-
// Convert a Python object to a Ruby object while keeping the original
|
236
|
-
VALUE ptorObject(PyObject* pObj)
|
237
|
-
{
|
238
|
-
VALUE rObj;
|
239
|
-
rObj = ptorObjectBasic(pObj, 1);
|
240
|
-
return rObj;
|
241
|
-
}
|
242
|
-
|
@@ -1,15 +0,0 @@
|
|
1
|
-
#include "config.h"
|
2
|
-
|
3
|
-
#ifndef _PTOR_H_
|
4
|
-
#define _PTOR_H_
|
5
|
-
//Python to Ruby Conversion
|
6
|
-
VALUE ptorString(PyObject* pString);
|
7
|
-
VALUE ptorList(PyObject* pList);
|
8
|
-
VALUE ptorInt(PyObject* pNum);
|
9
|
-
VALUE ptorLong(PyObject* pNum);
|
10
|
-
VALUE ptorFloat(PyObject* pNum);
|
11
|
-
VALUE ptorTuple(PyObject* pTuple);
|
12
|
-
VALUE ptorDict(PyObject* pDict);
|
13
|
-
VALUE ptorObject(PyObject* pObj);
|
14
|
-
VALUE ptorObjectKeep(PyObject *pObj);
|
15
|
-
#endif /* _PTOR_H_ */
|
@@ -1,42 +0,0 @@
|
|
1
|
-
#include "rp_blankobject.h"
|
2
|
-
|
3
|
-
RUBY_EXTERN VALUE mRubyPythonBridge;
|
4
|
-
|
5
|
-
VALUE cBlankObject;
|
6
|
-
|
7
|
-
// :nodoc:
|
8
|
-
/* This functions is used as a predicate function. Every function name
|
9
|
-
for which it returns true will be removed from the blank object
|
10
|
-
dictionary.
|
11
|
-
*/
|
12
|
-
VALUE blank_undef_if(VALUE name, VALUE klass)
|
13
|
-
{
|
14
|
-
VALUE mname = rb_funcall(name, rb_intern("to_s"), 0);
|
15
|
-
VALUE methodRe = rb_str_new2("(?:^__)|(?:\\?$)|(?:^send$)|(?:^class$)");
|
16
|
-
|
17
|
-
if(rb_funcall(mname, rb_intern("match"), 1, methodRe) == Qnil)
|
18
|
-
{
|
19
|
-
rb_undef_method(klass, STR2CSTR(mname));
|
20
|
-
return Qtrue;
|
21
|
-
}
|
22
|
-
else
|
23
|
-
{
|
24
|
-
return Qfalse;
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
// :nodoc:
|
29
|
-
VALUE blank_obj_prep(VALUE self)
|
30
|
-
{
|
31
|
-
VALUE instance_methods = rb_funcall(self, rb_intern("instance_methods"), 0);
|
32
|
-
|
33
|
-
rb_iterate(rb_each, instance_methods, blank_undef_if, self);
|
34
|
-
return self;
|
35
|
-
}
|
36
|
-
|
37
|
-
// :nodoc:
|
38
|
-
inline void Init_BlankObject()
|
39
|
-
{
|
40
|
-
cBlankObject = rb_define_class_under(mRubyPythonBridge,"BlankObject", rb_cObject);
|
41
|
-
blank_obj_prep(cBlankObject);
|
42
|
-
}
|
@@ -1,56 +0,0 @@
|
|
1
|
-
#include "rp_class.h"
|
2
|
-
|
3
|
-
#include "rp_module.h"
|
4
|
-
#include "rp_object.h"
|
5
|
-
|
6
|
-
RUBY_EXTERN VALUE mRubyPythonBridge;
|
7
|
-
RUBY_EXTERN VALUE ePythonError;
|
8
|
-
RUBY_EXTERN VALUE cRubyPyObject;
|
9
|
-
RUBY_EXTERN VALUE cBlankObject;
|
10
|
-
|
11
|
-
VALUE cRubyPyClass;
|
12
|
-
|
13
|
-
VALUE rpClassFromPyObject(PyObject *pClass)
|
14
|
-
{
|
15
|
-
PObj* self;
|
16
|
-
PyObject* pClassDict;
|
17
|
-
VALUE rDict;
|
18
|
-
VALUE rClass = rb_class_new_instance(0, NULL, cRubyPyClass);
|
19
|
-
|
20
|
-
Data_Get_Struct(rClass, PObj, self);
|
21
|
-
self->pObject = pClass;
|
22
|
-
|
23
|
-
pClassDict = PyObject_GetAttrString(pClass,"__dict__");
|
24
|
-
Py_XINCREF(pClassDict);
|
25
|
-
|
26
|
-
rDict = rpObjectFromPyObject
|
27
|
-
(pClassDict);
|
28
|
-
rb_iv_set(rClass,"@pdict", rDict);
|
29
|
-
|
30
|
-
return rClass;
|
31
|
-
}
|
32
|
-
|
33
|
-
static
|
34
|
-
VALUE rpClassNew(VALUE self, VALUE args)
|
35
|
-
{
|
36
|
-
PyObject* pSelf;
|
37
|
-
|
38
|
-
pSelf = rpObjectGetPyObject(self);
|
39
|
-
|
40
|
-
return rpCall(pSelf, args);
|
41
|
-
}
|
42
|
-
|
43
|
-
/*
|
44
|
-
A wrapper class for Python classes and instances.
|
45
|
-
|
46
|
-
This allows objects which cannot easily be converted to native Ruby types to still be accessible
|
47
|
-
from within ruby. Most users need not concern themselves with anything about this class except
|
48
|
-
its existence.
|
49
|
-
|
50
|
-
*/
|
51
|
-
inline void Init_RubyPyClass()
|
52
|
-
{
|
53
|
-
cRubyPyClass = rb_define_class_under(mRubyPythonBridge,"RubyPyClass", cRubyPyObject);
|
54
|
-
rb_define_method(cRubyPyClass,"method_missing", rpModuleDelegate,- 2);
|
55
|
-
rb_define_method(cRubyPyClass,"new", rpClassNew,- 2);
|
56
|
-
}
|
@@ -1,34 +0,0 @@
|
|
1
|
-
#include "rp_error.h"
|
2
|
-
#include "ptor.h"
|
3
|
-
|
4
|
-
VALUE ePythonError;
|
5
|
-
VALUE eRubyPyError;
|
6
|
-
|
7
|
-
void rpPythonError()
|
8
|
-
{
|
9
|
-
PyObject *pType,*pValue,*pTraceback;
|
10
|
-
PyObject *pTypeName;
|
11
|
-
|
12
|
-
PyErr_Fetch(&pType,&pValue,&pTraceback);
|
13
|
-
|
14
|
-
pTypeName = PyObject_GetAttrString(pType,"__name__");
|
15
|
-
Py_XDECREF(pType);
|
16
|
-
|
17
|
-
rb_raise(ePythonError,"%s:(%s)\n", STR2CSTR(ptorObject(pTypeName)), STR2CSTR(rb_inspect(ptorObject(pValue))));
|
18
|
-
|
19
|
-
Py_XDECREF(pTraceback);
|
20
|
-
}
|
21
|
-
|
22
|
-
void rpRubyPyError(char* eString) {
|
23
|
-
rb_raise(eRubyPyError, eString);
|
24
|
-
}
|
25
|
-
|
26
|
-
/*
|
27
|
-
Used to pass error information back into Ruby should an error occur in the embedded Python
|
28
|
-
interpreter.
|
29
|
-
*/
|
30
|
-
inline void Init_RubyPyError()
|
31
|
-
{
|
32
|
-
ePythonError = rb_define_class("PythonError", rb_eException);
|
33
|
-
eRubyPyError = rb_define_class("RubyPyError", rb_eException);
|
34
|
-
}
|