lib/usher/util/generate.rb in usher-0.5.11 vs lib/usher/util/generate.rb in usher-0.5.12
- old
+ new
@@ -36,17 +36,60 @@
end
class URL < Generic
+ class UrlParts < Struct.new(:path, :request)
+ def scheme
+ @scheme ||= generate_with(:scheme) || (request.respond_to?(:scheme) and request.scheme)
+ end
+
+ def protocol
+ @protocol ||= scheme ? "#{scheme}://" : request.protocol
+ end
+
+ def host
+ @host ||= generate_with(:host) || request.host
+ end
+
+ def port
+ @port ||= generate_with(:port) || request.port
+ end
+
+ def port_string
+ @port_string ||= standard_port? ? '' : ":#{port}"
+ end
+
+ def url
+ path.route.generate_with.nil? || path.route.generate_with.empty? ?
+ request.url :
+ protocol + host + port_string
+ end
+
+ protected
+
+ def generate_with(property)
+ path.route.generate_with and path.route.generate_with[property]
+ end
+
+ def standard_port?
+ ssl? ? port == 443 : port == 80
+ end
+
+ def ssl?
+ protocol[0..4] == 'https'
+ end
+ end
+
def initialize
- require File.join(File.dirname(__FILE__), 'rack-mixins')
+ require File.join('usher', 'util', 'rack-mixins')
end
def generate_full(routing_lookup, request, params = nil)
path = path_for_routing_lookup(routing_lookup, params)
- result = generate_start(path, request)
+
+ result = generate_start(path, request)
result << generate_path(path, params)
end
# Generates a completed URL based on a +route+ or set of optional +params+
#
@@ -103,16 +146,16 @@
END_EVAL
usher.named_routes.each do |name, route|
@generation_module.module_eval <<-END_EVAL
- def #{name}_url(name, request, params = nil)
- @@generator.generate_full(name, request, options)
+ def #{name}_url(options={})
+ @@generator.generate_full('#{name}'.to_sym, request, options)
end
- def #{name}_path(name, params = nil)
- @@generator.generate(name, options)
+ def #{name}_path(options={})
+ @@generator.generate('#{name}'.to_sym, options)
end
END_EVAL
end
end
end
@@ -125,23 +168,17 @@
else
'/'
end
end
- def generate_start(path, request)
- result = (path.route.generate_with && path.route.generate_with.scheme || request.scheme).dup
- result << '://'
- result << (path.route.generate_with && path.route.generate_with.host) ? path.route.generate_with.host : request.host
- port = path.route.generate_with && path.route.generate_with.port || request.port
- if result[4] == ?s
- result << ':' << port.to_s unless port == 443
- else
- result << ':' << port.to_s unless port == 80
- end
- result
+ def generate_start(path, request)
+ url_parts = UrlParts.new(path, request)
+ url = url_parts.url
+
+ (url[-1] == ?/) ? url[0..-2] : url
end
- def path_for_routing_lookup(routing_lookup, params = {})
+ def path_for_routing_lookup(routing_lookup, params = {})
path = case routing_lookup
when Symbol
route = @usher.named_routes[routing_lookup]
raise UnrecognizedException unless route
route.find_matching_path(params || {})