rubypython 0.2.11 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data.tar.gz.sig +0 -0
  2. data/{History.txt → History.markdown} +34 -28
  3. data/Manifest.txt +26 -40
  4. data/PostInstall.txt +2 -1
  5. data/README.markdown +103 -0
  6. data/Rakefile +19 -3
  7. data/lib/rubypython.rb +118 -114
  8. data/lib/rubypython/blankobject.rb +21 -0
  9. data/lib/rubypython/conversion.rb +198 -0
  10. data/lib/rubypython/core_ext/string.rb +7 -0
  11. data/lib/rubypython/legacy.rb +15 -0
  12. data/lib/rubypython/macros.rb +47 -0
  13. data/lib/rubypython/operators.rb +111 -0
  14. data/lib/rubypython/pymainclass.rb +51 -0
  15. data/lib/rubypython/pyobject.rb +203 -0
  16. data/lib/rubypython/python.rb +111 -0
  17. data/lib/rubypython/pythonerror.rb +78 -0
  18. data/lib/rubypython/rubypyproxy.rb +214 -0
  19. data/lib/rubypython/version.rb +4 -3
  20. data/spec/conversion_spec.rb +66 -0
  21. data/spec/legacy_spec.rb +22 -0
  22. data/spec/pymainclass_spec.rb +26 -0
  23. data/spec/pyobject_spec.rb +264 -0
  24. data/spec/python_helpers/objects.py +41 -0
  25. data/spec/pythonerror_spec.rb +43 -0
  26. data/spec/refcnt_spec.rb +68 -0
  27. data/spec/rubypyclass_spec.rb +13 -0
  28. data/spec/rubypyproxy_spec.rb +249 -0
  29. data/spec/rubypython_spec.rb +62 -0
  30. data/spec/spec.opts +2 -0
  31. data/spec/spec_helper.rb +51 -0
  32. metadata +79 -73
  33. metadata.gz.sig +0 -0
  34. data/README.txt +0 -60
  35. data/ext/rubypython_bridge/cbridge.c +0 -150
  36. data/ext/rubypython_bridge/cbridge.h +0 -15
  37. data/ext/rubypython_bridge/config.h +0 -14
  38. data/ext/rubypython_bridge/extconf.rb +0 -43
  39. data/ext/rubypython_bridge/ptor.c +0 -242
  40. data/ext/rubypython_bridge/ptor.h +0 -15
  41. data/ext/rubypython_bridge/rp_blankobject.c +0 -42
  42. data/ext/rubypython_bridge/rp_blankobject.h +0 -11
  43. data/ext/rubypython_bridge/rp_class.c +0 -56
  44. data/ext/rubypython_bridge/rp_class.h +0 -7
  45. data/ext/rubypython_bridge/rp_error.c +0 -34
  46. data/ext/rubypython_bridge/rp_error.h +0 -11
  47. data/ext/rubypython_bridge/rp_function.c +0 -31
  48. data/ext/rubypython_bridge/rp_function.h +0 -7
  49. data/ext/rubypython_bridge/rp_instance.c +0 -164
  50. data/ext/rubypython_bridge/rp_instance.h +0 -7
  51. data/ext/rubypython_bridge/rp_module.c +0 -160
  52. data/ext/rubypython_bridge/rp_module.h +0 -8
  53. data/ext/rubypython_bridge/rp_object.c +0 -194
  54. data/ext/rubypython_bridge/rp_object.h +0 -23
  55. data/ext/rubypython_bridge/rp_util.c +0 -63
  56. data/ext/rubypython_bridge/rp_util.h +0 -11
  57. data/ext/rubypython_bridge/rtop.c +0 -212
  58. data/ext/rubypython_bridge/rtop.h +0 -17
  59. data/ext/rubypython_bridge/rubypython_bridge.c +0 -125
  60. data/ext/rubypython_bridge/rubypython_bridge.h +0 -10
  61. data/lib/rubypython/session.rb +0 -4
  62. data/lib/rubypython/wrapper_extensions.rb +0 -83
  63. data/setup.rb +0 -1585
  64. data/tasks/environment.rake +0 -7
  65. data/tasks/extconf.rake +0 -13
  66. data/tasks/extconf/rubypython_bridge.rake +0 -49
  67. data/test/python_helpers/objects.py +0 -12
  68. data/test/test.wav +0 -0
  69. data/test/test_helper.rb +0 -2
  70. data/test/test_rubypython.rb +0 -215
  71. data/test/test_rubypython_bridge_extn.rb +0 -133
  72. data/test/test_session.rb +0 -6
@@ -1,23 +0,0 @@
1
- #include "config.h"
2
- #include "ptor.h"
3
- #include "rtop.h"
4
- #include "cbridge.h"
5
- #include "rp_error.h"
6
-
7
- #ifndef _RP_OBJECT_H_
8
- #define _RP_OBJECT_H_
9
-
10
- typedef struct RubyPyObj
11
- {
12
- PyObject* pObject;
13
- } PObj;
14
-
15
- PyObject* rpObjectGetPyObject(VALUE);
16
-
17
- VALUE rpObjectFromPyObject(PyObject*);
18
-
19
- int rpHasSymbol(VALUE, ID);
20
-
21
- VALUE rpRespondsTo(VALUE, VALUE);
22
- inline void Init_RubyPyObject();
23
- #endif
@@ -1,63 +0,0 @@
1
- #include "rp_util.h"
2
-
3
- #include "rp_object.h"
4
- #include "rp_function.h"
5
- #include "rp_instance.h"
6
- #include "rp_class.h"
7
-
8
- RUBY_EXTERN VALUE mRubyPythonBridge;
9
- RUBY_EXTERN VALUE ePythonError;
10
- RUBY_EXTERN VALUE cRubyPyObject;
11
- RUBY_EXTERN VALUE cBlankObject;
12
- RUBY_EXTERN VALUE cRubyPyClass;
13
- RUBY_EXTERN VALUE cRubyPyFunction;
14
- RUBY_EXTERN VALUE cRubyPyInstance;
15
-
16
- VALUE rpObjectWrap(PyObject* pObj)
17
- {
18
- VALUE rObj;
19
-
20
- if(PyFunction_Check(pObj)||PyMethod_Check(pObj)||!PyObject_HasAttrString(pObj,"__dict__"))
21
- {
22
- return rpFunctionFromPyObject(pObj);
23
-
24
- }
25
-
26
- if(PyInstance_Check(pObj))
27
- {
28
- rObj = rpInstanceFromPyObject(pObj);
29
- return rObj;
30
- }
31
-
32
- return rpClassFromPyObject(pObj);
33
- }
34
-
35
-
36
- //Pass this function the argument list for a function call. Checks to see
37
- //if the first parameter (the method symbol name here because this is called
38
- //from within method_missing) ends with an equals
39
- int rpSymbolIsSetter(VALUE args)
40
- {
41
- VALUE mname;
42
- VALUE name_string;
43
- VALUE isSetter_;
44
-
45
- mname = rb_ary_entry(args, 0);
46
- name_string = rb_funcall(mname, rb_intern("to_s"), 0);
47
-
48
- isSetter_ = rb_funcall(name_string, rb_intern("end_with?"), 1, rb_str_new2("="));
49
-
50
- return Qtrue == isSetter_;
51
- }
52
-
53
-
54
-
55
- //Tests if the first argument ends with !!. See the comment for
56
- //rpSymbolIsSetter
57
- int rpSymbolIsDoubleBang(VALUE args)
58
- {
59
- VALUE mname = rb_ary_entry(args, 0);
60
- VALUE name_string = rb_funcall(mname, rb_intern("to_s"), 0);
61
-
62
- return Qtrue == rb_funcall(name_string, rb_intern("end_with?"), 1, rb_str_new2("!!"));
63
- }
@@ -1,11 +0,0 @@
1
- #include "config.h"
2
-
3
- #ifndef _RP_UTIL_H_
4
- #define _RP_UTIL_H_
5
- int rpSymbolIsSetter();
6
-
7
- int rpSymbolIsDoubleBang(VALUE);
8
-
9
- VALUE rpObjectWrap(PyObject*);
10
-
11
- #endif /* _RP_UTIL_H_ */
@@ -1,212 +0,0 @@
1
- #include "rtop.h"
2
-
3
- RUBY_EXTERN VALUE cRubyPyObject;
4
- RUBY_EXTERN PyObject* rpObjectGetPyObject(VALUE self);
5
-
6
- /*
7
- * Note: For the builtin types rubypython creates a copy of the ruby
8
- * object to pass into python. Builtin types are passed by VALUE not
9
- * by REFERENCE.
10
- */
11
-
12
- PyObject* rtopString(VALUE rString)
13
- {
14
-
15
- PyObject* pString;
16
- char* cString;
17
- char* cStringCopy;
18
-
19
- cString = STR2CSTR(rString);
20
- cStringCopy = malloc(strlen(cString) * sizeof(char));
21
- strcpy(cStringCopy, cString);
22
-
23
- pString = PyString_FromString(cStringCopy);
24
-
25
- return pString;
26
- }
27
-
28
-
29
- PyObject* rtopArrayToList(VALUE rArray)
30
- {
31
- PyObject* pList;
32
- int i;
33
- int size = RARRAY_LEN(rArray);
34
-
35
- pList = PyList_New(size);
36
-
37
- for(i = 0; i < size; i++)
38
- {
39
- PyList_SetItem(pList, i, rtopObject(rb_ary_entry(rArray, i), 0));
40
- }
41
-
42
- return pList;
43
- }
44
-
45
- PyObject* rtopArrayToTuple(VALUE rArray)
46
- {
47
- PyObject *pTuple,*pList;
48
-
49
- pList = rtopArrayToList(rArray);
50
- pTuple = PySequence_Tuple(pList);
51
- Py_XDECREF(pList);
52
-
53
- return pTuple;
54
- }
55
-
56
- PyObject* rtopHash(VALUE rHash)
57
- {
58
- PyObject *pDict;
59
- VALUE rKeys;
60
- VALUE rKey, rVal;
61
- int i;
62
-
63
- pDict = PyDict_New();
64
-
65
- rKeys = rb_funcall(rHash, rb_intern("keys"), 0);
66
-
67
- for(i = 0; i < RARRAY_LEN(rKeys); i++)
68
- {
69
- rKey = rb_ary_entry(rKeys, i);
70
- rVal = rb_hash_aref(rHash, rKey);
71
- PyDict_SetItem(pDict, rtopObject(rKey, 1), rtopObject(rVal, 0));
72
- }
73
-
74
- return pDict;
75
- }
76
-
77
- PyObject* rtopFixnum(VALUE rNum)
78
- {
79
- PyObject* pNum;
80
- long cNum;
81
-
82
- cNum = NUM2LONG(rNum);
83
- pNum = PyInt_FromLong(cNum);
84
-
85
- return pNum;
86
- }
87
-
88
- PyObject* rtopBignum(VALUE rNum)
89
- {
90
- PyObject* pNum;
91
- long cNum;
92
-
93
- cNum = NUM2LONG(rNum);
94
- pNum = PyLong_FromLong(cNum);
95
-
96
- return pNum;
97
- }
98
-
99
- PyObject* rtopFloat(VALUE rNum)
100
- {
101
- PyObject* pNum;
102
- double cNum;
103
-
104
- cNum = NUM2DBL(rNum);
105
- pNum = PyFloat_FromDouble(cNum);
106
-
107
- return pNum;
108
- }
109
-
110
- PyObject* rtopFalse()
111
- {
112
- Py_RETURN_FALSE;
113
- }
114
-
115
- PyObject* rtopTrue()
116
- {
117
- Py_RETURN_TRUE;
118
- }
119
-
120
- PyObject* rtopSymbol(VALUE rSymbol)
121
- {
122
- PyObject* pString;
123
- char* cStr;
124
-
125
- cStr = STR2CSTR(rb_funcall(rSymbol, rb_intern("to_s"), 0));
126
- pString = PyString_FromString(cStr);
127
-
128
- return pString;
129
-
130
- }
131
-
132
- PyObject* rtopObject(VALUE rObj, int is_key)
133
- {
134
- // The above is_key parameter determines whether the object
135
- // created show be immutable if possible
136
-
137
- PyObject *pObj;
138
- VALUE rInspect;
139
-
140
- // Check the object for its type and apply the appropriate
141
- // conversion function
142
-
143
- switch(TYPE(rObj))
144
- {
145
- case T_STRING:
146
- pObj = rtopString(rObj);
147
- break;
148
-
149
- case T_ARRAY:
150
- // If this object is going to be used as a
151
- // hash key we should make it a tuple instead
152
- // of a list
153
- if(is_key) pObj = rtopArrayToTuple(rObj);
154
- else
155
- {
156
- pObj = rtopArrayToList(rObj);
157
- }
158
- break;
159
-
160
- case T_HASH:
161
- pObj = rtopHash(rObj);
162
- break;
163
-
164
- case T_FIXNUM:
165
- pObj = rtopFixnum(rObj);
166
- break;
167
-
168
- case T_BIGNUM:
169
- pObj = rtopBignum(rObj);
170
- break;
171
-
172
- case T_FLOAT:
173
- pObj = rtopFloat(rObj);
174
- break;
175
-
176
- case T_NIL:
177
- pObj = Py_None;
178
- break;
179
-
180
- case T_TRUE:
181
- pObj = rtopTrue();
182
- break;
183
-
184
- case T_FALSE:
185
- pObj = rtopFalse();
186
- break;
187
-
188
- case T_SYMBOL:
189
- pObj = rtopSymbol(rObj);
190
- break;
191
-
192
- default:
193
- if(rb_obj_is_kind_of(rObj, cRubyPyObject) == Qtrue)
194
- {
195
- // rObj is a wrapped python object. We
196
- // just take the object it wraps. In
197
- // this case we are effectively passing
198
- // a python object by reference
199
- pObj = rpObjectGetPyObject(rObj);
200
- }
201
- else
202
- {
203
- // If we can't figure out what else to
204
- // do with the ruby object we just pass
205
- // a string representation of it
206
- rInspect = rb_inspect(rObj);
207
- pObj = rtopString(rInspect);
208
- }
209
- }
210
-
211
- return pObj;
212
- }
@@ -1,17 +0,0 @@
1
- #include "config.h"
2
-
3
- #ifndef _RTOP_H_
4
- #define _RTOP_H_
5
- PyObject* rtopString(VALUE);
6
- PyObject* rtopArrayToList(VALUE);
7
- PyObject* rtopArrayToTuple(VALUE);
8
- PyObject* rtopHash(VALUE);
9
- PyObject* rtopFixnum(VALUE);
10
- PyObject* rtopBignum(VALUE);
11
- PyObject* rtopFloat(VALUE);
12
- PyObject* rtopFalse(void);
13
- PyObject* rtopTrue(void);
14
- PyObject* rtopSymbol(VALUE);
15
- PyObject* rtopObject(VALUE, int);
16
-
17
- #endif /* _RTOP_H_ */
@@ -1,125 +0,0 @@
1
- #include "rubypython_bridge.h"
2
-
3
- #include "ptor.h" //PyObject* to VALUE conversion
4
- #include "rtop.h" //VALUE to PyObject* conversion
5
- #include "cbridge.h" //General interface functions
6
- #include "rp_error.h" //Error propogation from Python to Ruby
7
- #include "rp_object.h"
8
- #include "rp_blankobject.h"
9
- #include "rp_util.h"
10
- #include "rp_module.h"
11
- #include "rp_class.h"
12
- #include "rp_function.h"
13
- #include "rp_instance.h"
14
-
15
- VALUE mRubyPythonBridge;
16
-
17
- RUBY_EXTERN VALUE cRubyPyObject;
18
- RUBY_EXTERN VALUE cRubyPyModule;
19
- RUBY_EXTERN VALUE cRubyPyClass;
20
- RUBY_EXTERN VALUE cBlankObject;
21
-
22
-
23
- /*
24
- call - seq: func(modname, funcname, *args)
25
-
26
- Given a python module name _modname_ and a function name _funcname_ calls the given function
27
- with the supplied arguments.
28
-
29
- Use builtins as the module for a built in function.
30
-
31
- */
32
- static VALUE func_with_module(VALUE self, VALUE args)
33
- {
34
- // Before doing anything we attempt to start the interpreter
35
- // Started here will be 1 if the interpreter is started by this
36
- // function and zero otherwise
37
- int started_here = rpSafeStart();
38
-
39
- VALUE module, func, return_val;
40
-
41
- // If we hav less than two arguments we cannot proceed.
42
- // Perhaps it would make more sense to throw an error here.
43
- if(RARRAY_LEN(args) < 2) return Qfalse;
44
-
45
- module = rb_ary_shift(args);
46
- func = rb_ary_shift(args);
47
-
48
- // rpCallWithModule is defined in cbridge.c
49
- return_val = rpCallWithModule(module, func, args);
50
-
51
- // If we started the interpreter, we now halt it.
52
- rpSafeStop(started_here);
53
-
54
- return return_val;
55
- }
56
-
57
-
58
- /*
59
- * call - seq: import(modname)
60
- *
61
- * Imports the python module _modname_ using the interpreter and returns a ruby wrapper
62
- */
63
- static VALUE rp_import(VALUE self, VALUE mname)
64
- {
65
- return rb_class_new_instance(1,&mname, cRubyPyModule);
66
- }
67
-
68
-
69
- /*
70
- * call - seq: start()
71
- *
72
- * Starts the python interpreter
73
- */
74
- VALUE rp_start(VALUE self)
75
- {
76
-
77
-
78
- if(Py_IsInitialized())
79
- {
80
- return Qfalse;
81
- }
82
- Py_Initialize();
83
-
84
- return Qtrue;
85
- }
86
-
87
- /*
88
- * call - seq: stop()
89
- *
90
- * Stop the python interpreter
91
- */
92
- VALUE rp_stop(VALUE self)
93
- {
94
-
95
- if(Py_IsInitialized())
96
- {
97
- Py_Finalize();
98
- return Qtrue;
99
- }
100
- return Qfalse;
101
-
102
- }
103
-
104
-
105
- /*
106
- * Module containing an interface to the the python interpreter.
107
- *
108
- * Use RubyPython instead.
109
- */
110
- void Init_rubypython_bridge()
111
- {
112
- mRubyPythonBridge = rb_define_module("RubyPythonBridge");
113
- rb_define_module_function(mRubyPythonBridge,"func", func_with_module,- 2);
114
- rb_define_module_function(mRubyPythonBridge,"start", rp_start, 0);
115
- rb_define_module_function(mRubyPythonBridge,"stop", rp_stop, 0);
116
- rb_define_module_function(mRubyPythonBridge,"import", rp_import, 1);
117
- Init_BlankObject();
118
- Init_RubyPyObject();
119
- Init_RubyPyModule();
120
- Init_RubyPyClass();
121
- Init_RubyPyFunction();
122
- Init_RubyPyError();
123
- Init_RubyPyInstance();
124
-
125
- }