correct naming

This commit is contained in:
Josh Hull 2011-09-13 23:32:18 -07:00
parent 941f0f565b
commit a470c30a39
6 changed files with 64 additions and 43 deletions

View File

@ -10,7 +10,7 @@ u.add('/simple')
u.add('/simple/:variable') .name(:one_variable).to{}
u.add('/simple/:var1/:var2/:var3') .name(:three_variables).to{}
u.add('/simple/:v1/:v2/:v3/:v4/:v5/:v6/:v7/:v8') .name(:eight_variables).to{}
u.add('/with_condition/:cond1/:cond2').matching(:cond1 => /^\d+$/, :cond2 => /^[a-z]+$/) .name(:two_conditions).to{}
u.add('/with_condition/:cond1/:cond2').matches_with(:cond1 => /^\d+$/, :cond2 => /^[a-z]+$/) .name(:two_conditions).to{}
TIMES = 50_000

View File

@ -162,6 +162,12 @@ class HttpRouter
end
alias_method :compiling_url, :url
def url_ns(route, *args)
compile
url_ns(route, *args)
end
alias_method :compiling_url_ns, :url_ns
def path(route, *args)
compile
path(route, *args)
@ -239,17 +245,19 @@ class HttpRouter
routes.sort!{|r1, r2| r2.max_param_count <=> r1.max_param_count }
end
instance_eval "undef :path; alias :path :raw_path;
undef :url; alias :url :raw_url;
undef :call; alias :call :raw_call", __FILE__, __LINE__
instance_eval "undef :path; alias :path :raw_path;
undef :url; alias :url :raw_url;
undef :url_ns; alias :url_ns :raw_url_ns;
undef :call; alias :call :raw_call", __FILE__, __LINE__
@compiled = true
end
def uncompile
return unless @compiled
instance_eval "undef :path; alias :path :compiling_path;
undef :url; alias :url :compiling_url;
undef :call; alias :call :compiling_call", __FILE__, __LINE__
instance_eval "undef :path; alias :path :compiling_path;
undef :url; alias :url :compiling_url;
undef :url_ns; alias :url_ns :compiling_url_ns;
undef :call; alias :call :compiling_call", __FILE__, __LINE__
@root.uncompile
@compiled = false
end
@ -259,7 +267,15 @@ class HttpRouter
when Symbol then @named_routes.key?(route) && @named_routes[route].each{|r| url = r.url(*args); return url if url}
when Route then return route.url(*args)
end
raise(InvalidRouteException)
raise(InvalidRouteException.new "No route (url) could be generated for #{route.inspect}")
end
def raw_url_ns(route, *args)
case route
when Symbol then @named_routes.key?(route) && @named_routes[route].each{|r| url = r.url_ns(*args); return url if url}
when Route then return route.url_ns(*args)
end
raise(InvalidRouteException.new "No route (url_ns) could be generated for #{route.inspect}")
end
def raw_path(route, *args)
@ -267,7 +283,7 @@ class HttpRouter
when Symbol then @named_routes.key?(route) && @named_routes[route].each{|r| path = r.path(*args); return path if path}
when Route then return route.path(*args)
end
raise(InvalidRouteException)
raise(InvalidRouteException.new "No route (path) could be generated for #{route.inspect}")
end
def raw_call(env, perform_call = true)

View File

@ -7,7 +7,6 @@ class HttpRouter
def initialize(route, path, validation_regex = nil)
@route = route
@path = path.dup
puts "path is a string? #{@path.is_a?(String)}"
@param_names = if @path.respond_to?(:names)
@path.names.map(&:to_sym)
elsif path.is_a?(String)
@ -15,7 +14,6 @@ class HttpRouter
else
[]
end
puts "path #{@path.inspect} #{@param_names.inspect}"
if path.is_a?(String)
path[0, 0] = '/' unless path[0] == ?/
@ -43,20 +41,14 @@ class HttpRouter
if validation_regex
instance_eval <<-EOT, __FILE__, __LINE__ + 1
def generate(args, options)
puts 'generating!'
puts "args: \#{args.inspect}"
puts "options: \#{options.inspect}"
generated_path = \"#{code}\"
puts "after .. args: \#{args.inspect}"
puts "generated path \#{generated_path.inspect}"
p #{validation_regex.inspect}.match(generated_path)
#{validation_regex.inspect}.match(generated_path) ? generated_path : nil
#{validation_regex.inspect}.match(generated_path) ? URI.escape(generated_path) : nil
end
EOT
else
instance_eval <<-EOT, __FILE__, __LINE__ + 1
def generate(args, options)
\"#{code}\"
URI.escape(\"#{code}\")
end
EOT
end
@ -72,6 +64,9 @@ class HttpRouter
@path_generators = @paths.map do |p|
generator = PathGenerator.new(route, p.is_a?(String) ? p : route.path_for_generation, p.is_a?(Regexp) ? p : nil)
end
@path_generators.sort! do |p1, p2|
p2.param_names.size <=> p1.param_names.size
end
end
def max_param_count
@ -82,11 +77,11 @@ class HttpRouter
@path_generators.each {|p| yield p.path, p.param_names}
end
def full_url(*args)
"#{scheme_port.first}#{url(*args)}"
def url(*args)
"#{scheme_port.first}#{url_ns(*args)}"
end
def url(*args)
def url_ns(*args)
"://#{@route.host || @router.default_host}#{scheme_port.last}#{path(*args)}"
end
@ -109,7 +104,6 @@ class HttpRouter
path_args_processing(a) do |args, options|
path = args.empty? ? matching_path(options) : matching_path(args, options)
path &&= path.generate(args, options)
puts "path is #{path.inspect}"
raise TooManyParametersException unless args.empty?
raise InvalidRouteException.new("Error generating #{@route.path_for_generation}") unless path
path ? [path, options] : nil
@ -129,12 +123,15 @@ class HttpRouter
return @path_generators.first if @path_generators.size == 1
case params
when Array, nil
significant_keys = other_hash && param_names & other_hash.keys
@path_generators.find { |path|
params_size = params ? params.size : 0
path.param_names.size == (significant_keys ? (params_size) + significant_keys.size : params_size) }
@path_generators.find do |path|
significant_key_count = params ? params.size : 0
significant_key_count += (path.param_names & other_hash.keys).size if other_hash
significant_key_count >= path.param_names.size
end
# params_size = params ? params.size : 0
# path.param_names.size == (significant_keys ? (params_size) + significant_keys.size : params_size) }
when Hash
@path_generators.find { |path| p path.param_names; (params && !params.empty? && (path.param_names & params.keys).size == path.param_names.size) || path.param_names.empty? }
@path_generators.find { |path| (params && !params.empty? && (path.param_names & params.keys).size == path.param_names.size) || path.param_names.empty? }
end
end

View File

@ -69,8 +69,8 @@ class HttpRouter
nil
end
def full_url(*args)
@generator.full_url(*args)
def url_ns(*args)
@generator.url_ns(*args)
rescue InvalidRouteException
nil
end

View File

@ -30,7 +30,12 @@ class HttpRouter
end
def name(name = nil)
name ? route.name = name : route.name
if name
route.name = name
self
else
route.name
end
end
def process_opts(opts)
@ -39,7 +44,6 @@ class HttpRouter
opts.delete(:conditions)
end
opts.each do |k, v|
puts "k #{k.inspect} with adding? #{@route.respond_to?(:"add_#{k}")}"
if @route.respond_to?(:"#{k}=")
@route.send(:"#{k}=", v)
elsif @route.respond_to?(:"add_#{k}")

View File

@ -2,18 +2,22 @@ require 'json'
require "#{File.dirname(__FILE__)}/generic"
class GenerationTest < AbstractTest
def run_tests
@tests.map(&:case).each do |(expected_result, name, args)|
args = [args] unless args.is_a?(Array)
args.compact!
args.map!{|a| a.is_a?(Hash) ? Hash[a.map{|k,v| [k.to_sym, v]}] : a }
result = begin
@router.path(name.to_sym, *args)
rescue HttpRouter::InvalidRouteException
nil
rescue HttpRouter::MissingParameterException
nil
@tests.map(&:case).each do |(expected_result, name, oargs)|
oargs = [oargs] unless oargs.is_a?(Array)
oargs.compact!
oargs.map!{|a| a.is_a?(Hash) ? Hash[a.map{|k,v| [k.to_sym, v]}] : a }
[[:path, ''], [:url_ns, '://localhost'], [:url, 'http://localhost']].each do |(meth, prefix)|
args = oargs.map{|o| o.dup rescue o}
result = begin
path = @router.send(meth, name.to_sym, *args.dup)
path
rescue HttpRouter::InvalidRouteException
nil
rescue HttpRouter::MissingParameterException
nil
end
error("Result #{result.inspect} did not match expectation #{expected_result.inspect}") unless result == (expected_result ? prefix + expected_result : expected_result)
end
error("Result #{result.inspect} did not match expectation #{expected_result.inspect}") unless result == expected_result
end
print '.'
end