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.



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

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

Instance Attribute Details

#callbackObject

Returns the value of attribute callback.



46
47
48
# File 'lib/utopia/controller/actions.rb', line 46

def callback
  @callback
end

#optionsObject

Returns the value of attribute options.



46
47
48
# File 'lib/utopia/controller/actions.rb', line 46

def options
  @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.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.



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

Returns:

  • (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, **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)


52
53
54
# File 'lib/utopia/controller/actions.rb', line 52

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

#hashObject



56
57
58
# File 'lib/utopia/controller/actions.rb', line 56

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

#inspectObject



117
118
119
120
121
122
123
# File 'lib/utopia/controller/actions.rb', line 117

def inspect
	if callback?
		"<action " + super + ":#{callback.source_location}(#{options})>"
	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