Class: Utopia::Controller::Actions::Action

Inherits:
Hash
  • Object
show all
Defined in:
lib/utopia/controller/actions.rb

Overview

A nested action lookup hash table.

Constant Summary collapse

WILDCARD_GREEDY =

Matches 0 or more path components.

"**".freeze
WILDCARD =

Matches any 1 path component.

"*".freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}, &block) ⇒ Action

Returns a new instance of Action.



22
23
24
25
26
27
# File 'lib/utopia/controller/actions.rb', line 22

def initialize(options = {}, &block)
  @options = options
  @callback = block
  
  super()
end

Instance Attribute Details

#callbackObject

Returns the value of attribute callback.



29
30
31
# File 'lib/utopia/controller/actions.rb', line 29

def callback
  @callback
end

#optionsObject

Returns the value of attribute options.



29
30
31
# File 'lib/utopia/controller/actions.rb', line 29

def options
  @options
end

Instance Method Details

#==(other) ⇒ Object



43
44
45
# File 'lib/utopia/controller/actions.rb', line 43

def == other
  super and @callback == other.callback and @options == other.options
end

#apply(path, index = -1,, &block) ⇒ Object

Given a path, iterate over all actions that match. Actions match from most specific to most general.

Returns:

  • nil if nothing matched, or true if something matched.



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/utopia/controller/actions.rb', line 55

def apply(path, index = -1, &block)
  # ** is greedy, it always matches if possible and matches all remaining input.
  if match_all = self[WILDCARD_GREEDY] and match_all.callback?
    # It's possible in this callback that path is modified.
    matched = true; yield(match_all)
  end
  
  if name = path[index]
    # puts "Matching #{name} in #{self.keys.inspect}"
    
    if match_name = self[name]
      # puts "Matched against exact name #{name}: #{match_name}"
      matched = match_name.apply(path, index-1, &block) || matched
    end
    
    if match_one = self[WILDCARD]
      # puts "Match against #{WILDCARD}: #{match_one}"
      matched = match_one.apply(path, index-1, &block) || matched
    end
  elsif self.callback?
    # Got to end, matched completely:
    matched = true; yield(self)
  end
  
  return matched
end

#callback?Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/utopia/controller/actions.rb', line 31

def callback?
  @callback != nil
end

#define(path, **options, &callback) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/utopia/controller/actions.rb', line 86

def define(path, **options, &callback)
  # puts "Defining path: #{path.inspect}"
  current = self
  
  path.reverse_each do |name|
    current = (current[name] ||= Action.new)
  end
  
  current.options = options
  current.callback = callback
  
  return current
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/utopia/controller/actions.rb', line 35

def eql? other
  super and @callback.eql? other.callback and @options.eql? other.options
end

#hashObject



39
40
41
# File 'lib/utopia/controller/actions.rb', line 39

def hash
  [super, @callback, @options].hash
end

#inspectObject



100
101
102
103
104
105
106
# File 'lib/utopia/controller/actions.rb', line 100

def inspect
  if callback?
    "<action " + super + ":#{callback.source_location}(#{options})>"
  else
    "<action " + super + ">"
  end
end

#matching(path, &block) ⇒ Object



82
83
84
# File 'lib/utopia/controller/actions.rb', line 82

def matching(path, &block)
  to_enum(:apply, path).to_a
end