Class: Utopia::Controller::Actions::Action
- Inherits:
-
Hash
- Object
- Hash
- Utopia::Controller::Actions::Action
- 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
-
#callback ⇒ Object
Returns the value of attribute callback.
-
#options ⇒ Object
Returns the value of attribute options.
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#apply(path, index = -1,, &block) ⇒ Object
Given a path, iterate over all actions that match.
- #callback? ⇒ Boolean
- #define(path, **options, &callback) ⇒ Object
- #eql?(other) ⇒ Boolean
- #hash ⇒ Object
-
#initialize(options = {}, &block) ⇒ Action
constructor
A new instance of Action.
- #inspect ⇒ Object
- #matching(path, &block) ⇒ Object
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( = {}, &block) @options = @callback = block super() end |
Instance Attribute Details
#callback ⇒ Object
Returns the value of attribute callback.
29 30 31 |
# File 'lib/utopia/controller/actions.rb', line 29 def callback @callback end |
#options ⇒ Object
Returns the value of attribute options.
29 30 31 |
# File 'lib/utopia/controller/actions.rb', line 29 def @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. end |
#apply(path, index = -1,, &block) ⇒ Object
Given a path, iterate over all actions that match. Actions match from most specific to most general.
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
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, **, &callback) # puts "Defining path: #{path.inspect}" current = self path.reverse_each do |name| current = (current[name] ||= Action.new) end current. = current.callback = callback return current end |
#eql?(other) ⇒ 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. end |
#hash ⇒ Object
39 40 41 |
# File 'lib/utopia/controller/actions.rb', line 39 def hash [super, @callback, @options].hash end |
#inspect ⇒ Object
100 101 102 103 104 105 106 |
# File 'lib/utopia/controller/actions.rb', line 100 def inspect if callback? "<action " + super + ":#{callback.source_location}(#{})>" 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 |