lib/usher/util/generate.rb in usher-0.6.2 vs lib/usher/util/generate.rb in usher-0.6.3
- old
+ new
@@ -10,32 +10,54 @@
generate_path_for_base_params(@usher.named_routes[name].find_matching_path(params), params)
end
def generate_path_for_base_params(path, params)
raise UnrecognizedException.new unless path
-
result = ''
- path.parts.each do |part|
- case part
- when Route::Variable::Glob
- value = (params && params.delete(part.name)) || part.default_value || raise(MissingParameterException.new)
- value.each_with_index do |current_value, index|
- part.valid!(current_value)
- result << current_value.to_s
- result << usher.delimiters.first if index != value.size - 1
+
+ case params
+ when nil, Hash
+ path.parts.each do |part|
+ case part
+ when String
+ result << part
+ when Route::Variable::Glob
+ value = (params && params.delete(part.name)) || part.default_value || raise(MissingParameterException.new)
+ value.each_with_index do |current_value, index|
+ part.valid!(current_value)
+ result << current_value.to_s
+ result << usher.delimiters.first if index != value.size - 1
+ end
+ when Route::Variable
+ value = (params && params.delete(part.name)) || part.default_value || raise(MissingParameterException.new)
+ part.valid!(value)
+ result << value.to_s
end
- when Route::Variable
- value = (params && params.delete(part.name)) || part.default_value || raise(MissingParameterException.new)
- part.valid!(value)
- result << value.to_s
- else
- result << part
end
+ else
+ params = Array(params)
+ path.parts.each do |part|
+ case part
+ when String
+ result << part
+ when Route::Variable::Glob
+ value = (params && params.shift) || part.default_value || raise(MissingParameterException.new)
+ value.each_with_index do |current_value, index|
+ part.valid!(current_value)
+ result << current_value.to_s
+ result << usher.delimiters.first if index != value.size - 1
+ end
+ when Route::Variable
+ value = (params && params.shift) || part.default_value || raise(MissingParameterException.new)
+ part.valid!(value)
+ result << value.to_s
+ end
+ end
end
result
end
-
+
end
class URL < Generic
class UrlParts < Struct.new(:path, :request)
@@ -102,30 +124,34 @@
generate_path(path_for_routing_lookup(routing_lookup, params), params)
end
def generate_path(path, params = nil, generate_extra = true)
params = Array(params) if params.is_a?(String)
+ extra_params = nil
case params
when nil
params = path && path.route.default_values
when Hash
params = path.route.default_values.merge(params) if path && path.route.default_values
- when String, Array
+ else
params = Array(params)
- given_size = params.size
extra_params = params.last.is_a?(Hash) ? params.pop : nil
- params = Hash[*path.dynamic_parts.inject(path.route.default_values ? path.route.default_values.to_a : []){|a, dynamic_part| a.concat([dynamic_part.name, params.shift || raise(MissingParameterException.new("got #{given_size}, expected #{path.dynamic_parts.size} parameters"))]); a}]
- params.merge!(extra_params) if extra_params
+ raise MissingParameterException.new("got #{params.size}, expected #{path.dynamic_parts.size} parameters") unless path.dynamic_parts.size == params.size
end
result = Rack::Utils.uri_escape(generate_path_for_base_params(path, params))
+
+ params = extra_params if extra_params
+
unless !generate_extra || params.nil? || params.empty?
if usher.consider_destination_keys? && path.route.destination_keys
params.delete_if{|k, v| path.route.destination_keys.include?(k)}
end
- extra_params = generate_extra_params(params, result[??])
- result << extra_params
+ unless params.empty?
+ result << '?' unless result[??]
+ result << generate_extra_params(params)
+ end
end
result
end
def generation_module
@@ -186,34 +212,36 @@
(url[-1] == ?/) ? url[0..-2] : url
end
def path_for_routing_lookup(routing_lookup, params = {})
path = case routing_lookup
+ when Route::Path
+ routing_lookup
when Symbol
route = @usher.named_routes[routing_lookup]
raise UnrecognizedException unless route
route.find_matching_path(params || {})
when Route
routing_lookup.find_matching_path(params)
when nil
params.is_a?(Hash) ? usher.path_for_options(params) : raise
- when Route::Path
- routing_lookup
end
end
- def generate_extra_params(params, has_question_mark)
+ def generate_extra_params(params)
extra_params_result = ''
params.each do |k,v|
case v
when Array
v.each do |v_part|
- extra_params_result << (has_question_mark ? '&' : has_question_mark = true && '?') << Rack::Utils.escape("#{k.to_s}[]") << '=' << Rack::Utils.escape(v_part.to_s)
+ extra_params_result << '&' unless extra_params_result.empty?
+ extra_params_result << Rack::Utils.escape("#{k.to_s}[]") << '=' << Rack::Utils.escape(v_part.to_s)
end
else
- extra_params_result << (has_question_mark ? '&' : has_question_mark = true && '?') << Rack::Utils.escape(k.to_s) << '=' << Rack::Utils.escape(v.to_s)
+ extra_params_result << '&' unless extra_params_result.empty?
+ extra_params_result << Rack::Utils.escape(k.to_s) << '=' << Rack::Utils.escape(v.to_s)
end
end
extra_params_result
end