pycall 1.0.1-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +41 -0
  5. data/CHANGES.md +39 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +91 -0
  9. data/Rakefile +29 -0
  10. data/appveyor.yml +138 -0
  11. data/bin/console +10 -0
  12. data/bin/guard +17 -0
  13. data/bin/rspec +17 -0
  14. data/bin/runner +6 -0
  15. data/bin/setup +8 -0
  16. data/config/Guardfile +30 -0
  17. data/docker/Dockerfile +191 -0
  18. data/docker/Gemfile +12 -0
  19. data/docker/README.md +22 -0
  20. data/examples/classifier_comparison.rb +135 -0
  21. data/examples/datascience_rb_20170519.ipynb +4836 -0
  22. data/examples/hist.rb +32 -0
  23. data/examples/notebooks/classifier_comparison.ipynb +226 -0
  24. data/examples/notebooks/forest_importances.ipynb +238 -0
  25. data/examples/notebooks/iruby_integration.ipynb +183 -0
  26. data/examples/notebooks/lorenz_attractor.ipynb +214 -0
  27. data/examples/notebooks/polar_axes.ipynb +209 -0
  28. data/examples/notebooks/sum_benchmarking.ipynb +374 -0
  29. data/examples/notebooks/xkcd_style.ipynb +149 -0
  30. data/examples/plot_forest_importances_faces.rb +46 -0
  31. data/examples/sum_benchmarking.rb +49 -0
  32. data/ext/pycall/extconf.rb +3 -0
  33. data/ext/pycall/gc.c +74 -0
  34. data/ext/pycall/libpython.c +217 -0
  35. data/ext/pycall/pycall.c +2184 -0
  36. data/ext/pycall/pycall_internal.h +700 -0
  37. data/ext/pycall/range.c +69 -0
  38. data/ext/pycall/ruby_wrapper.c +432 -0
  39. data/lib/2.1/pycall.so +0 -0
  40. data/lib/2.2/pycall.so +0 -0
  41. data/lib/2.3/pycall.so +0 -0
  42. data/lib/2.4/pycall.so +0 -0
  43. data/lib/pycall/conversion.rb +173 -0
  44. data/lib/pycall/dict.rb +48 -0
  45. data/lib/pycall/error.rb +10 -0
  46. data/lib/pycall/gc_guard.rb +84 -0
  47. data/lib/pycall/import.rb +120 -0
  48. data/lib/pycall/init.rb +55 -0
  49. data/lib/pycall/iruby_helper.rb +40 -0
  50. data/lib/pycall/libpython/finder.rb +170 -0
  51. data/lib/pycall/libpython/pyobject_struct.rb +30 -0
  52. data/lib/pycall/libpython/pytypeobject_struct.rb +273 -0
  53. data/lib/pycall/libpython.rb +12 -0
  54. data/lib/pycall/list.rb +45 -0
  55. data/lib/pycall/pretty_print.rb +9 -0
  56. data/lib/pycall/pyerror.rb +30 -0
  57. data/lib/pycall/pyobject_wrapper.rb +212 -0
  58. data/lib/pycall/python/PyCall/__init__.py +1 -0
  59. data/lib/pycall/python/PyCall/six.py +23 -0
  60. data/lib/pycall/python/investigator.py +7 -0
  61. data/lib/pycall/pytypeobject_wrapper.rb +90 -0
  62. data/lib/pycall/set.rb +19 -0
  63. data/lib/pycall/slice.rb +8 -0
  64. data/lib/pycall/tuple.rb +46 -0
  65. data/lib/pycall/version.rb +3 -0
  66. data/lib/pycall/wrapper_object_cache.rb +61 -0
  67. data/lib/pycall.rb +91 -0
  68. data/pycall.gemspec +40 -0
  69. data/tasks/docker.rake +21 -0
  70. data/tasks/pycall.rake +7 -0
  71. metadata +228 -0
@@ -0,0 +1,217 @@
1
+ #include "pycall_internal.h"
2
+
3
+ static pycall_libpython_api_table_t api_table = { NULL, };
4
+ static int python_string_as_bytes;
5
+
6
+ pycall_libpython_api_table_t *
7
+ pycall_libpython_api_table(void)
8
+ {
9
+ return &api_table;
10
+ }
11
+
12
+ struct lookup_libpython_api_args {
13
+ VALUE libpython_handle;
14
+ char const *name;
15
+ };
16
+
17
+ static VALUE
18
+ lookup_libpython_api_0(struct lookup_libpython_api_args *args)
19
+ {
20
+ return rb_funcall(args->libpython_handle, rb_intern("sym"), 1, rb_str_new2(args->name));
21
+ }
22
+
23
+ static void *
24
+ lookup_libpython_api(VALUE libpython_handle, char const *name)
25
+ {
26
+ struct lookup_libpython_api_args arg;
27
+ VALUE addr;
28
+ int state;
29
+
30
+ arg.libpython_handle = libpython_handle;
31
+ arg.name = name;
32
+ addr = rb_protect((VALUE (*)(VALUE))lookup_libpython_api_0, (VALUE)&arg, &state);
33
+ return (state || NIL_P(addr)) ? NULL : NUM2PTR(addr);
34
+ }
35
+
36
+ #define LOOKUP_API_ENTRY(api_name) lookup_libpython_api(libpython_handle, #api_name)
37
+ #define CHECK_API_ENTRY(api_name) (LOOKUP_API_ENTRY(api_name) != NULL)
38
+
39
+ #define required 1
40
+ #define optional 0
41
+
42
+ #define INIT_API_TABLE_ENTRY2(member_name, api_name, required) do { \
43
+ void *fptr = LOOKUP_API_ENTRY(api_name); \
44
+ if (!fptr && required) { \
45
+ rb_raise(eLibPythonFunctionNotFound, "Unable to find the required symbol in libpython: %s", #api_name); \
46
+ } \
47
+ (api_table.member_name) = fptr; \
48
+ } while (0)
49
+
50
+ #define INIT_API_TABLE_ENTRY(api_name, required) INIT_API_TABLE_ENTRY2(api_name, api_name, required)
51
+
52
+ #define INIT_API_TABLE_ENTRY_PTR(api_name, required) do { \
53
+ INIT_API_TABLE_ENTRY(api_name, required); \
54
+ (api_table.api_name) = *(void **)(api_table.api_name); \
55
+ } while (0)
56
+
57
+ void
58
+ pycall_init_libpython_api_table(VALUE libpython_handle)
59
+ {
60
+ VALUE eLibPythonFunctionNotFound = rb_const_get_at(pycall_mPyCall, rb_intern("LibPythonFunctionNotFound"));
61
+
62
+ INIT_API_TABLE_ENTRY(_Py_NoneStruct, required);
63
+
64
+ INIT_API_TABLE_ENTRY(PyBool_Type, required);
65
+ INIT_API_TABLE_ENTRY(PyClass_Type, optional);
66
+ INIT_API_TABLE_ENTRY(PyComplex_Type, required);
67
+ INIT_API_TABLE_ENTRY(PyDict_Type, required);
68
+ INIT_API_TABLE_ENTRY(PyFloat_Type, required);
69
+ INIT_API_TABLE_ENTRY(PyList_Type, required);
70
+ INIT_API_TABLE_ENTRY(PyInstance_Type, optional);
71
+ INIT_API_TABLE_ENTRY(PyInt_Type, optional);
72
+ INIT_API_TABLE_ENTRY(PyLong_Type, required);
73
+ INIT_API_TABLE_ENTRY(PyModule_Type, required);
74
+ python_string_as_bytes = !CHECK_API_ENTRY(PyString_Type);
75
+ if (python_string_as_bytes) {
76
+ INIT_API_TABLE_ENTRY2(PyString_Type, PyBytes_Type, required);
77
+ }
78
+ else {
79
+ INIT_API_TABLE_ENTRY(PyString_Type, required);
80
+ }
81
+ INIT_API_TABLE_ENTRY(PyTuple_Type, required);
82
+ INIT_API_TABLE_ENTRY(PyType_Type, required);
83
+ INIT_API_TABLE_ENTRY(PyUnicode_Type, required);
84
+
85
+ INIT_API_TABLE_ENTRY(Py_InitializeEx, required);
86
+ INIT_API_TABLE_ENTRY(Py_IsInitialized, required);
87
+ INIT_API_TABLE_ENTRY(Py_GetVersion, required);
88
+
89
+ INIT_API_TABLE_ENTRY(PySys_SetArgvEx, required);
90
+
91
+ INIT_API_TABLE_ENTRY(Py_IncRef, required);
92
+ INIT_API_TABLE_ENTRY(Py_DecRef, required);
93
+
94
+ INIT_API_TABLE_ENTRY(_PyObject_New, required);
95
+ INIT_API_TABLE_ENTRY(PyCallable_Check, required);
96
+ INIT_API_TABLE_ENTRY(PyObject_IsInstance, required);
97
+ INIT_API_TABLE_ENTRY2(PyObject_Hash._hash_t, PyObject_Hash, required);
98
+ INIT_API_TABLE_ENTRY(PyObject_RichCompare, required);
99
+ INIT_API_TABLE_ENTRY(PyObject_Call, required);
100
+ INIT_API_TABLE_ENTRY(PyObject_CallMethod, required);
101
+ INIT_API_TABLE_ENTRY(PyObject_Dir, required);
102
+ INIT_API_TABLE_ENTRY(PyObject_GenericGetAttr, required);
103
+ INIT_API_TABLE_ENTRY(PyObject_GetAttrString, required);
104
+ INIT_API_TABLE_ENTRY(PyObject_SetAttrString, required);
105
+ INIT_API_TABLE_ENTRY(PyObject_HasAttrString, required);
106
+ INIT_API_TABLE_ENTRY(PyObject_GetItem, required);
107
+ INIT_API_TABLE_ENTRY(PyObject_SetItem, required);
108
+ INIT_API_TABLE_ENTRY(PyObject_DelItem, required);
109
+ INIT_API_TABLE_ENTRY(PyObject_GetIter, required);
110
+ INIT_API_TABLE_ENTRY(PyObject_Str, required);
111
+ INIT_API_TABLE_ENTRY(PyObject_Repr, required);
112
+
113
+ INIT_API_TABLE_ENTRY(PyType_Ready, required);
114
+ INIT_API_TABLE_ENTRY(PyType_GenericNew, required);
115
+
116
+ INIT_API_TABLE_ENTRY(PyCFunction_NewEx, required);
117
+
118
+ INIT_API_TABLE_ENTRY(PyWeakref_NewRef, required);
119
+
120
+ INIT_API_TABLE_ENTRY(PyBool_FromLong, required);
121
+
122
+ INIT_API_TABLE_ENTRY(PyComplex_RealAsDouble, required);
123
+ INIT_API_TABLE_ENTRY(PyComplex_ImagAsDouble, required);
124
+ INIT_API_TABLE_ENTRY(PyComplex_FromDoubles, required);
125
+
126
+ INIT_API_TABLE_ENTRY(PyFloat_AsDouble, required);
127
+ INIT_API_TABLE_ENTRY(PyFloat_FromDouble, required);
128
+
129
+ INIT_API_TABLE_ENTRY(PyList_New, required);
130
+ INIT_API_TABLE_ENTRY(PyList_Size, required);
131
+ INIT_API_TABLE_ENTRY(PyList_GetItem, required);
132
+ INIT_API_TABLE_ENTRY(PyList_SetItem, required);
133
+ INIT_API_TABLE_ENTRY(PyList_Insert, required);
134
+ INIT_API_TABLE_ENTRY(PyList_Append, required);
135
+
136
+ INIT_API_TABLE_ENTRY(PyInt_FromLong, optional);
137
+ INIT_API_TABLE_ENTRY(PyInt_FromSsize_t, optional);
138
+ INIT_API_TABLE_ENTRY(PyInt_AsSsize_t, optional);
139
+
140
+ INIT_API_TABLE_ENTRY(PyLong_AsLongAndOverflow, required);
141
+ INIT_API_TABLE_ENTRY(PyLong_FromLong, required);
142
+ #ifdef HAVE_LONG_LONG
143
+ INIT_API_TABLE_ENTRY(PyLong_AsLongLongAndOverflow, required);
144
+ INIT_API_TABLE_ENTRY(PyLong_FromLongLong, required);
145
+ #endif
146
+ INIT_API_TABLE_ENTRY(PyLong_AsSsize_t, required);
147
+
148
+ INIT_API_TABLE_ENTRY(PyTuple_New, required);
149
+ INIT_API_TABLE_ENTRY(PyTuple_Size, required);
150
+ INIT_API_TABLE_ENTRY(PyTuple_GetItem, required);
151
+ INIT_API_TABLE_ENTRY(PyTuple_SetItem, required);
152
+
153
+ INIT_API_TABLE_ENTRY(PySlice_New, required);
154
+
155
+ INIT_API_TABLE_ENTRY(PyIter_Next, required);
156
+
157
+ INIT_API_TABLE_ENTRY(PyErr_Occurred, required);
158
+ INIT_API_TABLE_ENTRY(PyErr_Fetch, required);
159
+ INIT_API_TABLE_ENTRY(PyErr_Restore, required);
160
+ INIT_API_TABLE_ENTRY(PyErr_Clear, required);
161
+ INIT_API_TABLE_ENTRY(PyErr_SetString, required);
162
+ INIT_API_TABLE_ENTRY(PyErr_Format, required);
163
+
164
+ INIT_API_TABLE_ENTRY(PyImport_ImportModule, required);
165
+ INIT_API_TABLE_ENTRY(PyImport_ImportModuleLevel, required);
166
+
167
+ INIT_API_TABLE_ENTRY(PyOS_AfterFork, required);
168
+
169
+ INIT_API_TABLE_ENTRY(PyList_Size, required);
170
+ INIT_API_TABLE_ENTRY(PyList_GetItem, required);
171
+
172
+ INIT_API_TABLE_ENTRY(PyDict_New, required);
173
+ INIT_API_TABLE_ENTRY(PyDict_Contains, required);
174
+ INIT_API_TABLE_ENTRY(PyDict_SetItemString, required);
175
+ INIT_API_TABLE_ENTRY(PyDict_Next, required);
176
+
177
+ INIT_API_TABLE_ENTRY(PySequence_Check, required);
178
+ INIT_API_TABLE_ENTRY(PySequence_Size, required);
179
+ INIT_API_TABLE_ENTRY(PySequence_Contains, required);
180
+ INIT_API_TABLE_ENTRY(PySequence_GetItem, required);
181
+
182
+ if (python_string_as_bytes) {
183
+ INIT_API_TABLE_ENTRY2(PyString_AsStringAndSize, PyBytes_AsStringAndSize, required);
184
+ INIT_API_TABLE_ENTRY2(PyString_FromStringAndSize, PyBytes_FromStringAndSize, required);
185
+ INIT_API_TABLE_ENTRY2(PyString_FromFormatV, PyBytes_FromFormat, required);
186
+ }
187
+ else {
188
+ INIT_API_TABLE_ENTRY(PyString_AsStringAndSize, required);
189
+ INIT_API_TABLE_ENTRY(PyString_FromStringAndSize, required);
190
+ INIT_API_TABLE_ENTRY(PyString_FromFormatV, required);
191
+ }
192
+
193
+ if (CHECK_API_ENTRY(PyUnicode_DecodeUTF8)) {
194
+ INIT_API_TABLE_ENTRY(PyUnicode_AsUTF8String, required);
195
+ INIT_API_TABLE_ENTRY(PyUnicode_DecodeUTF8, required);
196
+ INIT_API_TABLE_ENTRY(PyUnicode_FromFormatV, required);
197
+ }
198
+ else if (CHECK_API_ENTRY(PyUnicodeUCS4_DecodeUTF8)) {
199
+ INIT_API_TABLE_ENTRY2(PyUnicode_AsUTF8String, PyUnicodeUCS4_AsUTF8String, required);
200
+ INIT_API_TABLE_ENTRY2(PyUnicode_DecodeUTF8, PyUnicodeUCS4_DecodeUTF8, required);
201
+ INIT_API_TABLE_ENTRY2(PyUnicode_FromFormatV, PyUnicodeUCS4_FromFormatV, required);
202
+ }
203
+ else if (CHECK_API_ENTRY(PyUnicodeUCS2_DecodeUTF8)) {
204
+ INIT_API_TABLE_ENTRY2(PyUnicode_AsUTF8String, PyUnicodeUCS2_AsUTF8String, required);
205
+ INIT_API_TABLE_ENTRY2(PyUnicode_DecodeUTF8, PyUnicodeUCS2_DecodeUTF8, required);
206
+ INIT_API_TABLE_ENTRY2(PyUnicode_FromFormatV, PyUnicodeUCS2_FromFormatV, required);
207
+ }
208
+ }
209
+
210
+ void
211
+ pycall_init_exceptions(VALUE libpython_handle)
212
+ {
213
+ VALUE eLibPythonFunctionNotFound = rb_const_get_at(pycall_mPyCall, rb_intern("LibPythonFunctionNotFound"));
214
+
215
+ INIT_API_TABLE_ENTRY_PTR(PyExc_RuntimeError, required);
216
+ INIT_API_TABLE_ENTRY_PTR(PyExc_TypeError, required);
217
+ }