Class: RedGrape::Element

Inherits:
Object show all
Defined in:
lib/red_grape/element.rb

Direct Known Subclasses

Edge, Vertex

Instance Method Summary collapse

Constructor Details

#initialize(graph, opts = {}) ⇒ Element

Returns a new instance of Element.


5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/red_grape/element.rb', line 5

def initialize(graph, opts={})
  @graph = graph
  @property = {}
  if opts[:property_description]
    @property_description = opts[:property_description]
    (opts[:property] || {}).each do |k, v|
      self[k] = v
    end
  else
    @property_description = {}
    opts.each do |k, v|
      self[k] = v
    end
  end
  @property_description.each do |k ,v|
    if v.is_a? Array
      v = PropertyDescription.new(*v)
    elsif v.is_a? Hash
      v = PropertyDescription.new v[:name], v[:type], v[:default]
    end
    @property_description[k] = v
    set_property k, v.default if v.has_default?
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object


101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/red_grape/element.rb', line 101

def method_missing(name, *args, &block)
  if name.to_s =~ /(.*)=$/
    name = $1
    if self[name]
      self[name] = args.first
    else
      raise NoMethodError.new(name.to_s)
    end
  else
    self[name.to_s] or raise NoMethodError.new(name.to_s)
  end
end

Instance Method Details

#<=>(other) ⇒ Object


78
79
80
# File 'lib/red_grape/element.rb', line 78

def <=>(other)
  self.id <=> other.id
end

#==(obj) ⇒ Object


74
75
76
# File 'lib/red_grape/element.rb', line 74

def ==(obj)
  self.class == obj.class && self.id == obj.id
end

#[](k) ⇒ Object


66
67
68
# File 'lib/red_grape/element.rb', line 66

def [](k)
  @property[k.to_s]
end

#[]=(k, v) ⇒ Object

set property value without type checking


62
63
64
# File 'lib/red_grape/element.rb', line 62

def []=(k, v)
  @property[k.to_s] = v
end

#directed_value(direction, out_value, in_value, error = true) ⇒ Object


82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/red_grape/element.rb', line 82

def directed_value(direction, out_value, in_value, error=true)
  case direction.to_s
  when 'out'
    if out_value.is_a? Proc
      out_value.call
    else
      out_value
    end
  when 'in'
    if in_value.is_a? Proc
      in_value.call
    else
      in_value
    end
  else error
    raise ArgumentError.new '"out" or "in"'
  end
end

#pass_through(pipe, context) ⇒ Object


70
71
72
# File 'lib/red_grape/element.rb', line 70

def pass_through(pipe, context)
  pipe.pass self, context
end

#property(k = nil) ⇒ Object


49
50
51
52
53
54
55
# File 'lib/red_grape/element.rb', line 49

def property(k=nil)
  if k
    self[k]
  else
    @property
  end
end

#property_keysObject


30
31
32
# File 'lib/red_grape/element.rb', line 30

def property_keys
  @property.keys
end

#remove_property(k) ⇒ Object


57
58
59
# File 'lib/red_grape/element.rb', line 57

def remove_property(k)
  @property.delete k.to_s
end

#set_property(kid, v) ⇒ Object

set property value with type checking if its definition exists


35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/red_grape/element.rb', line 35

def set_property(kid, v)
  if @property_description && desc = @property_description[kid]
    if desc.accessible? v
      self[desc.name] = v
    elsif desc.convertable? v
      self[desc.name] = desc.convert v
    else
      raise ArgumentError.new "#{kid} should be #{desc.type}."
    end
  else
    self[kid] = v
  end
end