Module: PyCall::PyTypeObjectWrapper

Includes:
PyObjectWrapper
Defined in:
lib/pycall/pytypeobject_wrapper.rb

Constant Summary

Constants included from PyObjectWrapper

PyCall::PyObjectWrapper::OPERATOR_METHOD_NAMES

Instance Attribute Summary

Attributes included from PyObjectWrapper

#__pyptr__

Class Method Summary collapse

Instance Method Summary collapse

Methods included from PyObjectWrapper

#[], #[]=, #call, #coerce, #dup, #inspect, #kind_of?, #method_missing, #respond_to_missing?, #to_f, #to_i, #to_s

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class PyCall::PyObjectWrapper

Class Method Details

.extend_object(cls) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
# File 'lib/pycall/pytypeobject_wrapper.rb', line 7

def self.extend_object(cls)
  unless cls.kind_of? Class
    raise TypeError, "PyTypeObjectWrapper cannot extend non-class objects"
  end
  pyptr = cls.instance_variable_get(:@__pyptr__)
  unless pyptr.kind_of? PyTypePtr
    raise TypeError, "@__pyptr__ should have PyCall::PyTypePtr object"
  end
  super
  cls.include PyObjectWrapper
end

Instance Method Details

#<(other) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/pycall/pytypeobject_wrapper.rb', line 52

def <(other)
  case other
  when self
    false
  when PyTypeObjectWrapper
    __pyptr__ < other.__pyptr__
  when Class
    false if other.ancestors.include?(self)
  when Module
    if ancestors.include?(other)
      true
    elsif other.ancestors.include?(self)
      false
    end
  else
    raise TypeError, "compared with non class/module"
  end
end

#===(other) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/pycall/pytypeobject_wrapper.rb', line 41

def ===(other)
  case other
  when PyObjectWrapper
    __pyptr__ === other.__pyptr__
  when PyPtr
    __pyptr__ === other
  else
    super
  end
end

#inherited(subclass) ⇒ Object



19
20
21
# File 'lib/pycall/pytypeobject_wrapper.rb', line 19

def inherited(subclass)
  subclass.instance_variable_set(:@__pyptr__, __pyptr__)
end

#new(*args) ⇒ Object



23
24
25
# File 'lib/pycall/pytypeobject_wrapper.rb', line 23

def new(*args)
  wrap_pyptr(LibPython::Helpers.call_object(__pyptr__, *args))
end

#wrap_pyptr(pyptr) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/pycall/pytypeobject_wrapper.rb', line 27

def wrap_pyptr(pyptr)
  return pyptr if pyptr.kind_of? self
  pyptr = pyptr.__pyptr__ if pyptr.kind_of? PyObjectWrapper
  unless pyptr.kind_of? PyPtr
    raise TypeError, "unexpected argument type #{pyptr.class} (expected PyCall::PyPtr)"
  end
  unless pyptr.kind_of? __pyptr__
    raise TypeError, "unexpected argument Python type #{pyptr.__ob_type__.__tp_name__} (expected #{__pyptr__.__tp_name__})"
  end
  allocate.tap do |obj|
    obj.instance_variable_set(:@__pyptr__, pyptr)
  end
end