class Python::PyObject

Public Class Methods

new(attr={}) click to toggle source
# File lib/python/pyobject.rb, line 3
def initialize(attr={})
  self.merge!(attr)
end

Public Instance Methods

base_traverse(&proc) click to toggle source
# File lib/python/pyobject.rb, line 105
def base_traverse(&proc)
  queue = [self]
  until queue.empty?
    cls = queue.pop
    if judge = proc.call(cls)
      return cls
    end
    queue += (cls[:bases] || [])
  end
  return nil
end
call(*args) click to toggle source
# File lib/python/pyobject.rb, line 15
def call(*args)
  if self[:entity] && self[:entity].is_a?(Proc)
    self[:entity].call(*args)
  else
    call_special_method("__call__", *args)
  end
end
call_special_method(method_name, *args) click to toggle source
# File lib/python/pyobject.rb, line 23
def call_special_method(method_name, *args)
  get_special_attr(method_name).call(*args)
end
datadescriptor?() click to toggle source
# File lib/python/pyobject.rb, line 101
def datadescriptor?
  descriptor? && self[:class].base_traverse{|cls| cls["__set__"] || cls["__delete__"]}
end
descriptor?() click to toggle source
# File lib/python/pyobject.rb, line 88
def descriptor?
  self[:class] && self[:class].base_traverse{|cls| cls["__get__"]}
end
entity() click to toggle source
# File lib/python/pyobject.rb, line 11
def entity
  self[:entity]
end
get_attr(name) click to toggle source
# File lib/python/pyobject.rb, line 49
def get_attr(name)
  if !self[:class]
    raise "failed to get attr #{name} from #{self}: #{self} doesn't have class"
  elsif cls = self[:class].base_traverse{|cls| cls[name] && cls[name].datadescriptor?}
    cls[name].get_get_method.call(cls[name], self, self[:class])
  elsif owner = self.base_traverse{|owner| owner[name]}
    owner[name]
  elsif cls = self[:class].base_traverse{|cls| cls[name]}
    if cls[name].descriptor?
      cls[name].get_get_method.call(cls[name], self, self[:class])
    else
      cls[name]
    end
  else
    raise "failed to get attr #{name} from #{self}: #{name} is not found"
  end
end
get_get_method() click to toggle source
# File lib/python/pyobject.rb, line 83
def get_get_method
  cls = self[:class].base_traverse{|cls| cls["__get__"]}
  cls["__get__"]
end
get_set_method() click to toggle source
# File lib/python/pyobject.rb, line 92
def get_set_method
  cls = self[:class].base_traverse{|cls| cls["__set__"] || cls["__delete__"]}
  unless cls["__set__"]
    raise "cannot set data on datadescriptor '#{cls}'"
  else
    cls["__set__"]
  end
end
get_special_attr(name) click to toggle source
# File lib/python/pyobject.rb, line 27
def get_special_attr(name)
  if !self[:class]
    raise "failed to get special attr #{name} from #{self}: #{self} doesn't have class"
  elsif cls = self[:class].base_traverse{|cls| cls[name] && cls[name].datadescriptor?}
    cls[name].get_get_method.call(cls[name], self, self[:class])
  elsif cls = self[:class].base_traverse{|cls| cls[name]}
    if cls[name].descriptor?
      cls[name].get_get_method.call(cls[name], self, self[:class])
    else
      cls[name]
    end
  else
    raise "failed to get special attr #{name} from #{self}: #{name} is not found"
  end
end
has_attr?(name) click to toggle source
# File lib/python/pyobject.rb, line 67
def has_attr?(name)
  get_attr(name)
rescue
  nil
end
has_special_attr?(name) click to toggle source
# File lib/python/pyobject.rb, line 43
def has_special_attr?(name)
  get_special_attr(name)
rescue
  nil
end
inspect() click to toggle source
Calls superclass method
# File lib/python/pyobject.rb, line 117
def inspect
  if self[:name]
    self[:name]
  elsif self[:entity]
    self[:entity].to_s
  elsif self[:class] && self[:class][:name]
    "<instance of:#{self[:class][:name]}"
  else
    super
  end
end
make_instance(entity=nil, &entity_proc) click to toggle source
# File lib/python/pyobject.rb, line 7
def make_instance(entity=nil, &entity_proc)
  PyObject.new(:class => self, :entity => entity || entity_proc)
end
set_attr(name, pyobj) click to toggle source
# File lib/python/pyobject.rb, line 73
def set_attr(name, pyobj)
  if !self[:class]
    raise "failed to set attr #{name} on #{self}: #{self} doesn't have class"
  elsif cls = self[:class].base_traverse{|cls| cls[name] && cls[name].datadescriptor?}
    cls[name].get_set_method.call(cls[name], self, pyobj)
  else
    self[name] = pyobj
  end
end