module PyCall::LibPython::Helpers
Public Class Methods
call_object(*args)
click to toggle source
static VALUE pycall_libpython_helpers_m_call_object(int argc, VALUE *argv, VALUE mod) { VALUE pyptr; PyObject *pyobj; if (argc < 1) { rb_raise(rb_eArgError, "too few arguments (%d for >=1)", argc); } pyptr = argv[0]; if (!is_pycall_pyptr(pyptr)) { rb_raise(rb_eTypeError, "PyCall::PyPtr is required"); } pyobj = get_pyobj_ptr(pyptr); if (!Py_API(PyCallable_Check)(pyobj)) { rb_raise(rb_eTypeError, "Non-callable Python object was given"); } if (argc == 1) { return pycall_call_python_callable(pyobj, 0, NULL); } else { return pycall_call_python_callable(pyobj, argc - 1, argv + 1); } }
callable?(p1)
click to toggle source
static VALUE pycall_libpython_helpers_m_callable_p(VALUE mod, VALUE pyptr) { PyObject *pyobj; int res; if (!is_pycall_pyptr(pyptr)) { rb_raise(rb_eTypeError, "PyCall::PyPtr is required"); } pyobj = get_pyobj_ptr(pyptr); res = Py_API(PyCallable_Check)(pyobj); return res ? Qtrue : Qfalse; }
compare(p1, p2, p3)
click to toggle source
static VALUE pycall_libpython_helpers_m_compare(VALUE mod, VALUE op, VALUE pyptr_a, VALUE pyptr_b) { PyObject *pyobj_a, *pyobj_b, *res; int opid; opid = pycall_rich_compare_opid(op); if (!is_pycall_pyptr(pyptr_a)) { rb_raise(rb_eTypeError, "unexpected 2nd argument type %s (expected PyCall::PyPtr)", rb_class2name(CLASS_OF(pyptr_a))); } if (!is_pycall_pyptr(pyptr_b)) { rb_raise(rb_eTypeError, "unexpected 3rd argument type %s (expected PyCall::PyPtr)", rb_class2name(CLASS_OF(pyptr_b))); } pyobj_a = get_pyobj_ptr(pyptr_a); pyobj_b = get_pyobj_ptr(pyptr_b); res = Py_API(PyObject_RichCompare)(pyobj_a, pyobj_b, opid); if (!res) { pycall_pyerror_fetch_and_raise("PyObject_RichCompare in pycall_libpython_helpers_m_compare"); } return pycall_pyobject_to_ruby(res); }
define_wrapper_method(p1, p2)
click to toggle source
static VALUE pycall_libpython_helpers_m_define_wrapper_method(VALUE mod, VALUE wrapper, VALUE name) { VALUE pyptr, name_sym; PyObject *pyobj, *attr; char *name_cstr; pyptr = rb_attr_get(wrapper, rb_intern("@__pyptr__")); if (NIL_P(pyptr) || !is_pycall_pyptr(pyptr)) { rb_raise(rb_eTypeError, "Wrong wrapper object is given"); } pyobj = get_pyobj_ptr(pyptr); if (RB_TYPE_P(name, T_SYMBOL)) { name_sym = name; name = rb_sym_to_s(name); } else if (RB_TYPE_P(name, T_STRING)) { name_sym = rb_str_intern(name); } name_cstr = StringValueCStr(name); if (name_cstr[RSTRING_LEN(name) - 1] == '=') { name_cstr[RSTRING_LEN(name) - 1] = '\0'; attr = Py_API(PyObject_GetAttrString)(pyobj, name_cstr); name_cstr[RSTRING_LEN(name) - 1] = '='; } else { attr = Py_API(PyObject_GetAttrString)(pyobj, name_cstr); } if (!attr) { pycall_pyerror_fetch_and_raise("PyObject_GetAttrString in pycall_libpython_helpers_m_define_wrapper_method"); } pycall_Py_DecRef(attr); rb_define_singleton_method(wrapper, name_cstr, pycall_pyobject_wrapper_wrapper_method, -1); return Qnil; }
delitem(p1, p2)
click to toggle source
static VALUE pycall_libpython_helpers_m_delitem(VALUE mod, VALUE pyptr, VALUE key, VALUE v) { PyObject *pyobj, *pyobj_key; int res; pyobj = check_get_pyobj_ptr(pyptr, NULL); pyobj_key = pycall_convert_index(key); res = Py_API(PyObject_DelItem)(pyobj, pyobj_key); if (res == -1) { pycall_pyerror_fetch_and_raise("PyObject_DelItem"); } return v; }
dict_contains(p1, p2)
click to toggle source
static VALUE pycall_libpython_helpers_m_dict_contains(VALUE mod, VALUE pyptr, VALUE key) { PyObject *pyobj, *pyobj_key; int res; pyobj = check_get_pyobj_ptr(pyptr, Py_API(PyDict_Type)); pyobj_key = pycall_pyobject_from_ruby(key); res = Py_API(PyDict_Contains)(pyobj, pyobj_key); if (res == -1) { pycall_pyerror_fetch_and_raise("PyDict_Contains"); } return res ? Qtrue : Qfalse; }
dict_each(p1)
click to toggle source
static VALUE pycall_libpython_helpers_m_dict_each(VALUE mod, VALUE pyptr) { PyObject *pyobj, *pyobj_key, *pyobj_value; Py_ssize_t pos; pyobj = check_get_pyobj_ptr(pyptr, Py_API(PyDict_Type)); pos = 0; while (Py_API(PyDict_Next)(pyobj, &pos, &pyobj_key, &pyobj_value)) { VALUE key, value; key = pycall_pyobject_to_ruby(pyobj_key); value = pycall_pyobject_to_ruby(pyobj_value); rb_yield(rb_assoc_new(key, value)); } return Qnil; }
getattr(p1, p2, p3 = v3)
click to toggle source
static VALUE pycall_libpython_helpers_m_getattr(int argc, VALUE *argv, VALUE mod) { VALUE pyptr, name, default_value; if (rb_scan_args(argc, argv, "21", &pyptr, &name, &default_value) == 2) { default_value = Qundef; } if (!is_pycall_pyptr(pyptr)) { rb_raise(rb_eTypeError, "PyCall::PyPtr is required"); } if (RB_TYPE_P(name, T_SYMBOL)) { name = rb_sym_to_s(name); } return pycall_getattr_default(pyptr, StringValueCStr(name), default_value); }
getitem(p1, p2)
click to toggle source
static VALUE pycall_libpython_helpers_m_getitem(VALUE mod, VALUE pyptr, VALUE key) { PyObject *pyobj, *pyobj_key, *pyobj_v; VALUE obj; if (!is_pycall_pyptr(pyptr)) { rb_raise(rb_eTypeError, "PyCall::PyPtr is required"); } pyobj = get_pyobj_ptr(pyptr); pyobj_key = pycall_convert_index(key); pyobj_v = Py_API(PyObject_GetItem)(pyobj, pyobj_key); if (!pyobj_v) { pycall_pyerror_fetch_and_raise("PyObject_GetItem in pycall_libpython_helpers_m_getitem"); } obj = pycall_pyobject_to_ruby(pyobj_v); pycall_Py_DecRef(pyobj_v); return obj; }
hasattr?(p1, p2)
click to toggle source
static VALUE pycall_libpython_helpers_m_hasattr_p(VALUE mod, VALUE pyptr, VALUE name) { PyObject *pyobj; int res; if (!is_pycall_pyptr(pyptr)) { rb_raise(rb_eTypeError, "PyCall::PyPtr is required"); } pyobj = get_pyobj_ptr(pyptr); if (RB_TYPE_P(name, T_SYMBOL)) { name = rb_sym_to_s(name); } res = Py_API(PyObject_HasAttrString)(pyobj, StringValueCStr(name)); return res ? Qtrue : Qfalse; }
import_module(p1, p2 = v2, p3 = v3, p4 = v4, p5 = v5)
click to toggle source
static VALUE pycall_libpython_helpers_m_import_module(int argc, VALUE *argv, VALUE mod) { VALUE name, globals, locals, fromlist, level; char const *name_cstr; rb_scan_args(argc, argv, "14", &name, &globals, &locals, &fromlist, &level); if (RB_TYPE_P(name, T_SYMBOL)) { name = rb_sym_to_s(name); } name_cstr = StringValueCStr(name); if (argc == 1) { return pycall_import_module(name_cstr); } if (argc == 5) { level = rb_check_to_integer(level, "to_int"); } else { /* TODO: set the default level to 0 */ } return pycall_import_module_level(name_cstr, globals, locals, fromlist, NUM2INT(level)); }
sequence_contains(p1, p2)
click to toggle source
static VALUE pycall_libpython_helpers_m_sequence_contains(VALUE mod, VALUE pyptr, VALUE key) { PyObject *pyobj, *pyobj_key; int res; pyobj = check_get_pyobj_ptr(pyptr, NULL); if (!Py_API(PySequence_Check)(pyobj)) rb_raise(rb_eTypeError, "unexpected Python type %s (expected a Python sequence object)", Py_TYPE(pyobj)->tp_name); pyobj_key = pycall_pyobject_from_ruby(key); res = Py_API(PySequence_Contains)(pyobj, pyobj_key); if (res == -1) { pycall_pyerror_fetch_and_raise("PySequence_Contains"); } return res ? Qtrue : Qfalse; }
sequence_each(p1)
click to toggle source
static VALUE pycall_libpython_helpers_m_sequence_each(VALUE mod, VALUE pyptr) { PyObject *pyobj, *pyobj_iter, *pyobj_item; pyobj = check_get_pyobj_ptr(pyptr, NULL); if (!Py_API(PySequence_Check)(pyobj)) rb_raise(rb_eTypeError, "unexpected Python type %s (expected a Python sequence object)", Py_TYPE(pyobj)->tp_name); pyobj_iter = Py_API(PyObject_GetIter)(pyobj); if (!pyobj_iter) { pycall_pyerror_fetch_and_raise("PyObject_GetIter in pycall_libpython_helpers_m_sequence_each"); } while ((pyobj_item = Py_API(PyIter_Next)(pyobj_iter))) { rb_yield(pycall_pyobject_to_ruby(pyobj_item)); pycall_Py_DecRef(pyobj_item); } pycall_Py_DecRef(pyobj_iter); if (Py_API(PyErr_Occurred)() != NULL) { pycall_pyerror_fetch_and_raise("checking error just in case at the end of pycall_libpython_helpers_m_sequence_each"); } return Qnil; }
setitem(p1, p2, p3)
click to toggle source
static VALUE pycall_libpython_helpers_m_setitem(VALUE mod, VALUE pyptr, VALUE key, VALUE v) { PyObject *pyobj, *pyobj_key, *pyobj_value; int res; pyobj = check_get_pyobj_ptr(pyptr, NULL); pyobj_key = pycall_convert_index(key); pyobj_value = pycall_pyobject_from_ruby(v); res = Py_API(PyObject_SetItem)(pyobj, pyobj_key, pyobj_value); if (res == -1) { pycall_pyerror_fetch_and_raise("PyObject_SetItem in pycall_libpython_helpers_m_setitem"); } Py_API(Py_DecRef(pyobj_key)); Py_API(Py_DecRef(pyobj_value)); return v; }
str(p1)
click to toggle source
static VALUE pycall_libpython_helpers_m_str(VALUE mod, VALUE pyptr) { PyObject *pyobj, *pyobj_str; pyobj = check_get_pyobj_ptr(pyptr, NULL); pyobj_str = Py_API(PyObject_Str)(pyobj); if (!pyobj_str) { pycall_pyerror_fetch_and_raise("PyObject_Str"); } return pycall_pyobject_to_ruby(pyobj_str); }