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.
39 40 41 42 43 44 |
# File 'lib/utopia/controller/actions.rb', line 39 def initialize( = {}, &block) @options = @callback = block super() end |
Instance Attribute Details
#callback ⇒ Object
Returns the value of attribute callback.
46 47 48 |
# File 'lib/utopia/controller/actions.rb', line 46 def callback @callback end |
#options ⇒ Object
Returns the value of attribute options.
46 47 48 |
# File 'lib/utopia/controller/actions.rb', line 46 def @options end |
Instance Method Details
#==(other) ⇒ Object
60 61 62 |
# File 'lib/utopia/controller/actions.rb', line 60 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.
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/utopia/controller/actions.rb', line 72 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
48 49 50 |
# File 'lib/utopia/controller/actions.rb', line 48 def callback? @callback != nil end |
#define(path, **options, &callback) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/utopia/controller/actions.rb', line 103 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
52 53 54 |
# File 'lib/utopia/controller/actions.rb', line 52 def eql? other super and @callback.eql? other.callback and @options.eql? other. end |
#hash ⇒ Object
56 57 58 |
# File 'lib/utopia/controller/actions.rb', line 56 def hash [super, @callback, @options].hash end |
#inspect ⇒ Object
117 118 119 120 121 122 123 |
# File 'lib/utopia/controller/actions.rb', line 117 def inspect if callback? "<action " + super + ":#{callback.source_location}(#{})>" else "<action " + super + ">" end end |
#matching(path, &block) ⇒ Object
99 100 101 |
# File 'lib/utopia/controller/actions.rb', line 99 def matching(path, &block) to_enum(:apply, path).to_a end |