http_router 0.8.11 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +32 -3
- data/js/lib/http_router.coffee +368 -0
- data/js/lib/http_router.js +668 -0
- data/js/package.json +10 -0
- data/js/test/test.coffee +136 -0
- data/js/test/test.js +229 -0
- data/lib/http_router/node/arbitrary.rb +1 -1
- data/lib/http_router/node/free_regex.rb +3 -2
- data/lib/http_router/node/glob.rb +4 -3
- data/lib/http_router/node/glob_regex.rb +3 -2
- data/lib/http_router/node/lookup.rb +2 -3
- data/lib/http_router/node/path.rb +62 -0
- data/lib/http_router/node/request.rb +13 -2
- data/lib/http_router/node/root.rb +29 -2
- data/lib/http_router/node/spanning_regex.rb +6 -5
- data/lib/http_router/node.rb +7 -12
- data/lib/http_router/rack/builder.rb +0 -8
- data/lib/http_router/regex_route.rb +13 -0
- data/lib/http_router/route.rb +57 -42
- data/lib/http_router/util.rb +41 -0
- data/lib/http_router/version.rb +1 -1
- data/lib/http_router.rb +17 -22
- data/test/common/generate.txt +8 -2
- data/test/common/http_recognize.txt +58 -0
- data/test/common/recognize.txt +12 -65
- data/test/generation.rb +5 -102
- data/test/generic.rb +111 -0
- data/test/recognition.rb +6 -100
- data/test/test_misc.rb +26 -2
- data/test/test_mounting.rb +4 -4
- data/test/test_recognition.rb +18 -0
- metadata +94 -34
- data/lib/http_router/node/destination.rb +0 -45
- data/lib/http_router/path.rb +0 -58
data/test/generation.rb
CHANGED
@@ -1,83 +1,13 @@
|
|
1
1
|
require 'json'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
class GenerationTest
|
7
|
-
Info = Struct.new(:case, :original_line, :num)
|
8
|
-
|
9
|
-
attr_reader :routes, :tests
|
10
|
-
def initialize(file)
|
11
|
-
@tests = []
|
12
|
-
@routes = Info.new([], "", 0)
|
13
|
-
end
|
14
|
-
|
15
|
-
def error(msg)
|
16
|
-
raise("Error in case: #{@routes.original_line.strip}:#{@routes.num + 1}\n#{msg}")
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_test(line, num)
|
20
|
-
@tests << Info.new(JSON.parse(line), line, num)
|
21
|
-
end
|
22
|
-
|
23
|
-
def add_routes(line, num)
|
24
|
-
info = Info.new(JSON.parse(line), line, num)
|
25
|
-
error("Routes have already been defined without tests") if info.case.is_a?(Array) && !@routes.case.empty?
|
26
|
-
if info.case.is_a?(Array)
|
27
|
-
@routes = info
|
28
|
-
elsif @routes.case.empty?
|
29
|
-
info.case = [info.case]
|
30
|
-
@routes = info
|
31
|
-
else
|
32
|
-
@routes.case << info.case
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def interpret_val(val)
|
37
|
-
case val
|
38
|
-
when nil
|
39
|
-
error("Unable to interpret #{val.inspect}")
|
40
|
-
when Hash
|
41
|
-
val['regex'] ? Regexp.new(val['regex']) : error("Okay serious, no idea #{val.inspect}")
|
42
|
-
else
|
43
|
-
val
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def invoke
|
48
|
-
error("invoke called with no tests or routes") if @tests.empty? || @routes.nil?
|
49
|
-
router = HttpRouter.new
|
50
|
-
@routes.case.each do |route_definition|
|
51
|
-
error("Too many keys! #{route_definition.keys.inspect}") unless route_definition.keys.size == 1
|
52
|
-
route_name, route_properties = route_definition.keys.first, route_definition.values.first
|
53
|
-
route = case route_properties
|
54
|
-
when String
|
55
|
-
router.add(route_properties)
|
56
|
-
when Hash
|
57
|
-
opts = {}
|
58
|
-
route_path = interpret_val(route_properties.delete("path"))
|
59
|
-
if route_properties.key?("conditions")
|
60
|
-
opts[:conditions] = Hash[route_properties.delete("conditions").map{|k, v| [k.to_sym, interpret_val(v)]}]
|
61
|
-
end
|
62
|
-
if route_properties.key?("default")
|
63
|
-
opts[:default_values] = Hash[route_properties.delete("default").map{|k, v| [k.to_sym, interpret_val(v)]}]
|
64
|
-
end
|
65
|
-
route_properties.each do |key, val|
|
66
|
-
opts[key.to_sym] = interpret_val(val)
|
67
|
-
end
|
68
|
-
router.add(route_path, opts)
|
69
|
-
else
|
70
|
-
error("Route isn't a String or hash")
|
71
|
-
end
|
72
|
-
route.name(route_name.to_sym)
|
73
|
-
route.to{|env| [200, {"env-to-test" => env.dup}, [route_name]]}
|
74
|
-
end
|
2
|
+
require "#{File.dirname(__FILE__)}/generic"
|
3
|
+
class GenerationTest < AbstractTest
|
4
|
+
def run_tests
|
75
5
|
@tests.map(&:case).each do |(expected_result, name, args)|
|
76
6
|
args = [args] unless args.is_a?(Array)
|
77
7
|
args.compact!
|
78
8
|
args.map!{|a| a.is_a?(Hash) ? Hash[a.map{|k,v| [k.to_sym, v]}] : a }
|
79
9
|
result = begin
|
80
|
-
router.url(name.to_sym, *args)
|
10
|
+
@router.url(name.to_sym, *args)
|
81
11
|
rescue HttpRouter::InvalidRouteException
|
82
12
|
nil
|
83
13
|
rescue HttpRouter::MissingParameterException
|
@@ -89,31 +19,4 @@ class GenerationTest
|
|
89
19
|
end
|
90
20
|
end
|
91
21
|
|
92
|
-
|
93
|
-
test = nil
|
94
|
-
num = 0
|
95
|
-
generation.each_line do |line|
|
96
|
-
begin
|
97
|
-
case line
|
98
|
-
when /^#/, /^\s*$/
|
99
|
-
# skip
|
100
|
-
when /^( |\t)/
|
101
|
-
test.add_test(line, num)
|
102
|
-
else
|
103
|
-
if test.nil? || !test.tests.empty?
|
104
|
-
tests << test if test
|
105
|
-
test = GenerationTest.new(generation_file)
|
106
|
-
end
|
107
|
-
test.add_routes(line, num)
|
108
|
-
end
|
109
|
-
rescue
|
110
|
-
warn "There was a problem with #{num}:#{line}"
|
111
|
-
raise
|
112
|
-
end
|
113
|
-
num += 1
|
114
|
-
end
|
115
|
-
tests << test
|
116
|
-
|
117
|
-
puts "Running generation tests (Routes: #{tests.size}, Tests: #{tests.inject(0){|s, t| s+=t.tests.size}})..."
|
118
|
-
tests.each(&:invoke)
|
119
|
-
puts "\ndone!"
|
22
|
+
GenerationTest.run("#{File.dirname(__FILE__)}/common/generate.txt")
|
data/test/generic.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class AbstractTest
|
4
|
+
def self.run(file)
|
5
|
+
contents = File.read(file)
|
6
|
+
tests = []
|
7
|
+
test = nil
|
8
|
+
num = 0
|
9
|
+
contents.each_line do |line|
|
10
|
+
begin
|
11
|
+
case line
|
12
|
+
when /^#/, /^\s*$/
|
13
|
+
# skip
|
14
|
+
when /^( |\t)/
|
15
|
+
test.add_test(line, num)
|
16
|
+
else
|
17
|
+
if test.nil? || !test.tests.empty?
|
18
|
+
tests << test if test
|
19
|
+
test = new(file)
|
20
|
+
end
|
21
|
+
test.add_routes(line, num)
|
22
|
+
end
|
23
|
+
rescue
|
24
|
+
warn "There was a problem with #{num}:#{line}"
|
25
|
+
raise
|
26
|
+
end
|
27
|
+
num += 1
|
28
|
+
end
|
29
|
+
tests << test
|
30
|
+
|
31
|
+
puts "Running tests (#{name}) (Routes: #{tests.size}, Tests: #{tests.inject(0){|s, t| s+=t.tests.size}})..."
|
32
|
+
tests.each(&:invoke)
|
33
|
+
puts "\ndone!"
|
34
|
+
end
|
35
|
+
|
36
|
+
Info = Struct.new(:case, :original_line, :num)
|
37
|
+
|
38
|
+
attr_reader :routes, :tests
|
39
|
+
def initialize(file)
|
40
|
+
@tests = []
|
41
|
+
@routes = Info.new([], "", 0)
|
42
|
+
end
|
43
|
+
|
44
|
+
def error(msg)
|
45
|
+
raise("Error in case: #{@routes.original_line.strip}:#{@routes.num + 1}\n#{msg}")
|
46
|
+
end
|
47
|
+
|
48
|
+
def add_test(line, num)
|
49
|
+
@tests << Info.new(JSON.parse(line), line, num)
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_routes(line, num)
|
53
|
+
info = Info.new(JSON.parse(line), line, num)
|
54
|
+
error("Routes have already been defined without tests") if info.case.is_a?(Array) && !@routes.case.empty?
|
55
|
+
if info.case.is_a?(Array)
|
56
|
+
@routes = info
|
57
|
+
elsif @routes.case.empty?
|
58
|
+
info.case = [info.case]
|
59
|
+
@routes = info
|
60
|
+
else
|
61
|
+
@routes.case << info.case
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def interpret_val(val)
|
66
|
+
case val
|
67
|
+
when nil
|
68
|
+
error("Unable to interpret #{val.inspect}")
|
69
|
+
when Hash
|
70
|
+
val['regex'] ? Regexp.new(val['regex']) : error("Okay serious, no idea #{val.inspect}")
|
71
|
+
else
|
72
|
+
val
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def run_tests
|
77
|
+
raise
|
78
|
+
end
|
79
|
+
|
80
|
+
def invoke
|
81
|
+
error("invoke called with no tests or routes") if @tests.empty? || @routes.nil?
|
82
|
+
@router = HttpRouter.new
|
83
|
+
@routes.case.each do |route_definition|
|
84
|
+
error("Too many keys! #{route_definition.keys.inspect}") unless route_definition.keys.size == 1
|
85
|
+
route_name, route_properties = route_definition.keys.first, route_definition.values.first
|
86
|
+
route = case route_properties
|
87
|
+
when String
|
88
|
+
@router.add(route_properties)
|
89
|
+
when Hash
|
90
|
+
opts = {}
|
91
|
+
route_path = interpret_val(route_properties.delete("path"))
|
92
|
+
if route_properties.key?("conditions")
|
93
|
+
opts[:conditions] = Hash[route_properties.delete("conditions").map{|k, v| [k.to_sym, interpret_val(v)]}]
|
94
|
+
end
|
95
|
+
if route_properties.key?("default")
|
96
|
+
opts[:default_values] = Hash[route_properties.delete("default").map{|k, v| [k.to_sym, interpret_val(v)]}]
|
97
|
+
end
|
98
|
+
route_properties.each do |key, val|
|
99
|
+
opts[key.to_sym] = interpret_val(val)
|
100
|
+
end
|
101
|
+
@router.add(route_path, opts)
|
102
|
+
else
|
103
|
+
error("Route isn't a String or hash")
|
104
|
+
end
|
105
|
+
route.name(route_name.to_sym)
|
106
|
+
route.to{|env| [200, {"env-to-test" => env.dup}, [route_name]]}
|
107
|
+
end
|
108
|
+
run_tests
|
109
|
+
print '.'
|
110
|
+
end
|
111
|
+
end
|
data/test/recognition.rb
CHANGED
@@ -1,74 +1,6 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
|
4
|
-
recognition = File.read(recognition_file)
|
5
|
-
|
6
|
-
class RecognitionTest
|
7
|
-
Info = Struct.new(:case, :original_line, :num)
|
8
|
-
|
9
|
-
attr_reader :routes, :tests
|
10
|
-
def initialize(file)
|
11
|
-
@tests = []
|
12
|
-
@routes = Info.new([], "", 0)
|
13
|
-
end
|
14
|
-
|
15
|
-
def error(msg)
|
16
|
-
raise("Error in case: #{@routes.original_line.strip}:#{@routes.num + 1}\n#{msg}")
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_test(line, num)
|
20
|
-
@tests << Info.new(JSON.parse(line), line, num)
|
21
|
-
end
|
22
|
-
|
23
|
-
def add_routes(line, num)
|
24
|
-
info = Info.new(JSON.parse(line), line, num)
|
25
|
-
error("Routes have already been defined without tests") if info.case.is_a?(Array) && !@routes.case.empty?
|
26
|
-
if info.case.is_a?(Array)
|
27
|
-
@routes = info
|
28
|
-
elsif @routes.case.empty?
|
29
|
-
info.case = [info.case]
|
30
|
-
@routes = info
|
31
|
-
else
|
32
|
-
@routes.case << info.case
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def interpret_val(val)
|
37
|
-
case val
|
38
|
-
when nil
|
39
|
-
error("Unable to interpret #{val.inspect}")
|
40
|
-
when Hash
|
41
|
-
val['regex'] ? Regexp.new(val['regex']) : error("Okay serious, no idea #{val.inspect}")
|
42
|
-
else
|
43
|
-
val
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def invoke
|
48
|
-
error("invoke called with no tests or routes") if @tests.empty? || @routes.nil?
|
49
|
-
router = HttpRouter.new
|
50
|
-
@routes.case.each do |route_definition|
|
51
|
-
error("Too many keys! #{route_definition.keys.inspect}") unless route_definition.keys.size == 1
|
52
|
-
route_name, route_properties = route_definition.keys.first, route_definition.values.first
|
53
|
-
route = case route_properties
|
54
|
-
when String
|
55
|
-
router.add(route_properties)
|
56
|
-
when Hash
|
57
|
-
opts = {}
|
58
|
-
route_path = interpret_val(route_properties.delete("path"))
|
59
|
-
if route_properties.key?("conditions")
|
60
|
-
opts[:conditions] = Hash[route_properties.delete("conditions").map{|k, v| [k.to_sym, interpret_val(v)]}]
|
61
|
-
end
|
62
|
-
route_properties.each do |key, val|
|
63
|
-
opts[key.to_sym] = interpret_val(val)
|
64
|
-
end
|
65
|
-
router.add(route_path, opts)
|
66
|
-
else
|
67
|
-
error("Route isn't a String or hash")
|
68
|
-
end
|
69
|
-
route.name(route_name.to_sym)
|
70
|
-
route.to{|env| [200, {"env-to-test" => env.dup}, [route_name]]}
|
71
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/generic"
|
2
|
+
class RecognitionTest < AbstractTest
|
3
|
+
def run_tests
|
72
4
|
@tests.map(&:case).each do |(name, req, params)|
|
73
5
|
env = case req
|
74
6
|
when String
|
@@ -79,7 +11,7 @@ class RecognitionTest
|
|
79
11
|
e['rack.url_scheme'] = req['scheme'] if req.key?('scheme')
|
80
12
|
e
|
81
13
|
end
|
82
|
-
response = router.call(env)
|
14
|
+
response = @router.call(env)
|
83
15
|
case name
|
84
16
|
when nil
|
85
17
|
error("Expected no response") unless response.first == 404
|
@@ -112,31 +44,5 @@ class RecognitionTest
|
|
112
44
|
end
|
113
45
|
end
|
114
46
|
|
115
|
-
|
116
|
-
|
117
|
-
num = 0
|
118
|
-
recognition.each_line do |line|
|
119
|
-
begin
|
120
|
-
case line
|
121
|
-
when /^#/, /^\s*$/
|
122
|
-
# skip
|
123
|
-
when /^( |\t)/
|
124
|
-
test.add_test(line, num)
|
125
|
-
else
|
126
|
-
if test.nil? || !test.tests.empty?
|
127
|
-
tests << test if test
|
128
|
-
test = RecognitionTest.new(recognition_file)
|
129
|
-
end
|
130
|
-
test.add_routes(line, num)
|
131
|
-
end
|
132
|
-
rescue
|
133
|
-
warn "There was a problem with #{num}:#{line}"
|
134
|
-
raise
|
135
|
-
end
|
136
|
-
num += 1
|
137
|
-
end
|
138
|
-
tests << test
|
139
|
-
|
140
|
-
puts "Running recognition tests (Routes: #{tests.size}, Tests: #{tests.inject(0){|s, t| s+=t.tests.size}})..."
|
141
|
-
tests.each(&:invoke)
|
142
|
-
puts "\ndone!"
|
47
|
+
RecognitionTest.run("#{File.dirname(__FILE__)}/common/recognize.txt")
|
48
|
+
RecognitionTest.run("#{File.dirname(__FILE__)}/common/http_recognize.txt")
|
data/test/test_misc.rb
CHANGED
@@ -8,8 +8,8 @@ class TestMisc < MiniTest::Unit::TestCase
|
|
8
8
|
|
9
9
|
assert_equal nil, r1.recognize(Rack::Request.new(Rack::MockRequest.env_for('/test2')))
|
10
10
|
assert r2.recognize(Rack::MockRequest.env_for('/test2'))
|
11
|
-
assert_equal r1.routes.first, r1.named_routes[:test_route]
|
12
|
-
assert_equal r2.routes.first, r2.named_routes[:test_route]
|
11
|
+
assert_equal r1.routes.first, r1.named_routes[:test_route].first
|
12
|
+
assert_equal r2.routes.first, r2.named_routes[:test_route].first
|
13
13
|
|
14
14
|
r1.add('/another').name(:test).to(:test2)
|
15
15
|
|
@@ -33,4 +33,28 @@ class TestMisc < MiniTest::Unit::TestCase
|
|
33
33
|
assert 304, response[0]
|
34
34
|
assert "/hi", response[1]["Location"]
|
35
35
|
end
|
36
|
+
|
37
|
+
def test_multi_name_gen
|
38
|
+
r = HttpRouter.new
|
39
|
+
r.add('/').name(:index).default_destination
|
40
|
+
r.add('/:name').name(:index).default_destination
|
41
|
+
r.add('/:name/:category').name(:index).default_destination
|
42
|
+
assert_equal '/', r.url(:index)
|
43
|
+
assert_equal '/name', r.url(:index, 'name')
|
44
|
+
assert_equal '/name/category', r.url(:index, 'name', 'category')
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_regex_generation
|
48
|
+
r = HttpRouter.new
|
49
|
+
r.add(%r|/test/.*|, :path_for_generation => '/test/:variable').name(:route).default_destination
|
50
|
+
assert_equal '/test/var', r.url(:route, "var")
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_regex_generation
|
54
|
+
r = HttpRouter.new
|
55
|
+
r.add(%r|/test/.*|, :path_for_generation => '/test/:variable').name(:route).default_destination
|
56
|
+
assert_equal '/test/var', r.url(:route, "var")
|
57
|
+
assert_equal '/test/var', r.url(:route, :variable => "var")
|
58
|
+
assert_raises(HttpRouter::InvalidRouteException) { r.url(:route) }
|
59
|
+
end
|
36
60
|
end
|
data/test/test_mounting.rb
CHANGED
@@ -30,10 +30,10 @@ class TestMounting < MiniTest::Unit::TestCase
|
|
30
30
|
|
31
31
|
def test_path_with_optional
|
32
32
|
@r1.add("/foo(/:bar)").to(@r2)
|
33
|
-
@r2.add("/hey(/:there)").name(:
|
34
|
-
assert_equal "/foo/hey", @r2.url(:
|
35
|
-
assert_equal "/foo/bar/hey", @r2.url(:
|
36
|
-
assert_equal "/foo/bar/hey/there", @r2.url(:
|
33
|
+
@r2.add("/hey(/:there)").name(:test2).to{|env| [200, {}, []]}
|
34
|
+
assert_equal "/foo/hey", @r2.url(:test2)
|
35
|
+
assert_equal "/foo/bar/hey", @r2.url(:test2, :bar => "bar")
|
36
|
+
assert_equal "/foo/bar/hey/there", @r2.url(:test2, :bar => "bar", :there => "there")
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_nest3
|
data/test/test_recognition.rb
CHANGED
@@ -73,6 +73,15 @@ class TestRecognition < MiniTest::Unit::TestCase
|
|
73
73
|
assert_body 'working', router.call(Rack::MockRequest.env_for('/'))
|
74
74
|
end
|
75
75
|
|
76
|
+
def test_non_path_matching
|
77
|
+
passed, working = router {
|
78
|
+
add(:conditions => {:user_agent => /MSIE/}).to { |env| [200, {}, ['IE']] }
|
79
|
+
add('/').to { |env| [200, {}, ['SOMETHING ELSE']] }
|
80
|
+
}
|
81
|
+
assert_body 'SOMETHING ELSE', router.call(Rack::MockRequest.env_for('/'))
|
82
|
+
assert_body 'IE', router.call(Rack::MockRequest.env_for('/', 'HTTP_USER_AGENT' => 'THIS IS MSIE DAWG'))
|
83
|
+
end
|
84
|
+
|
76
85
|
def test_passing_with_cascade
|
77
86
|
passed, working = router {
|
78
87
|
add('/').to { |env| [200, {'X-Cascade' => 'pass'}, ['pass']] }
|
@@ -90,4 +99,13 @@ class TestRecognition < MiniTest::Unit::TestCase
|
|
90
99
|
assert_route matching, '/test/123/123/asd/aasd/zxcqwe/asdzxc', {:var => '123', :var2 => '123', :glob => %w{asd aasd zxcqwe asdzxc}}
|
91
100
|
assert got_this_far, "matching should have gotten this far"
|
92
101
|
end
|
102
|
+
|
103
|
+
def test_compiling_uncompiling
|
104
|
+
@router = HttpRouter.new
|
105
|
+
root = @router.add('/').default_destination
|
106
|
+
assert_route root, '/'
|
107
|
+
test = @router.add('/test').default_destination
|
108
|
+
assert_route root, '/'
|
109
|
+
assert_route test, '/test'
|
110
|
+
end
|
93
111
|
end
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http_router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 61
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 9
|
9
|
+
- 3
|
10
|
+
version: 0.9.3
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Joshua Hull
|
@@ -10,119 +15,161 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-27 00:00:00 -07:00
|
14
19
|
default_executable:
|
15
20
|
dependencies:
|
16
21
|
- !ruby/object:Gem::Dependency
|
17
|
-
name: rack
|
18
22
|
prerelease: false
|
19
|
-
|
23
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
20
24
|
none: false
|
21
25
|
requirements:
|
22
26
|
- - ">="
|
23
27
|
- !ruby/object:Gem::Version
|
28
|
+
hash: 23
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 0
|
32
|
+
- 0
|
24
33
|
version: 1.0.0
|
34
|
+
requirement: *id001
|
35
|
+
name: rack
|
25
36
|
type: :runtime
|
26
|
-
version_requirements: *id001
|
27
37
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: url_mount
|
29
38
|
prerelease: false
|
30
|
-
|
39
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
31
40
|
none: false
|
32
41
|
requirements:
|
33
42
|
- - ~>
|
34
43
|
- !ruby/object:Gem::Version
|
44
|
+
hash: 21
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 2
|
48
|
+
- 1
|
35
49
|
version: 0.2.1
|
50
|
+
requirement: *id002
|
51
|
+
name: url_mount
|
36
52
|
type: :runtime
|
37
|
-
version_requirements: *id002
|
38
53
|
- !ruby/object:Gem::Dependency
|
39
|
-
name: minitest
|
40
54
|
prerelease: false
|
41
|
-
|
55
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
42
56
|
none: false
|
43
57
|
requirements:
|
44
58
|
- - ~>
|
45
59
|
- !ruby/object:Gem::Version
|
60
|
+
hash: 15
|
61
|
+
segments:
|
62
|
+
- 2
|
63
|
+
- 0
|
64
|
+
- 0
|
46
65
|
version: 2.0.0
|
66
|
+
requirement: *id003
|
67
|
+
name: minitest
|
47
68
|
type: :development
|
48
|
-
version_requirements: *id003
|
49
69
|
- !ruby/object:Gem::Dependency
|
50
|
-
name: code_stats
|
51
70
|
prerelease: false
|
52
|
-
|
71
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
53
72
|
none: false
|
54
73
|
requirements:
|
55
74
|
- - ">="
|
56
75
|
- !ruby/object:Gem::Version
|
76
|
+
hash: 3
|
77
|
+
segments:
|
78
|
+
- 0
|
57
79
|
version: "0"
|
80
|
+
requirement: *id004
|
81
|
+
name: code_stats
|
58
82
|
type: :development
|
59
|
-
version_requirements: *id004
|
60
83
|
- !ruby/object:Gem::Dependency
|
61
|
-
name: rake
|
62
84
|
prerelease: false
|
63
|
-
|
85
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
64
86
|
none: false
|
65
87
|
requirements:
|
66
88
|
- - ~>
|
67
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 49
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
- 8
|
94
|
+
- 7
|
68
95
|
version: 0.8.7
|
96
|
+
requirement: *id005
|
97
|
+
name: rake
|
69
98
|
type: :development
|
70
|
-
version_requirements: *id005
|
71
99
|
- !ruby/object:Gem::Dependency
|
72
|
-
name: rbench
|
73
100
|
prerelease: false
|
74
|
-
|
101
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
75
102
|
none: false
|
76
103
|
requirements:
|
77
104
|
- - ">="
|
78
105
|
- !ruby/object:Gem::Version
|
106
|
+
hash: 3
|
107
|
+
segments:
|
108
|
+
- 0
|
79
109
|
version: "0"
|
110
|
+
requirement: *id006
|
111
|
+
name: rbench
|
80
112
|
type: :development
|
81
|
-
version_requirements: *id006
|
82
113
|
- !ruby/object:Gem::Dependency
|
83
|
-
name: json
|
84
114
|
prerelease: false
|
85
|
-
|
115
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
86
116
|
none: false
|
87
117
|
requirements:
|
88
118
|
- - ">="
|
89
119
|
- !ruby/object:Gem::Version
|
120
|
+
hash: 3
|
121
|
+
segments:
|
122
|
+
- 0
|
90
123
|
version: "0"
|
124
|
+
requirement: *id007
|
125
|
+
name: json
|
91
126
|
type: :development
|
92
|
-
version_requirements: *id007
|
93
127
|
- !ruby/object:Gem::Dependency
|
94
|
-
name: phocus
|
95
128
|
prerelease: false
|
96
|
-
|
129
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
97
130
|
none: false
|
98
131
|
requirements:
|
99
132
|
- - ">="
|
100
133
|
- !ruby/object:Gem::Version
|
134
|
+
hash: 3
|
135
|
+
segments:
|
136
|
+
- 0
|
101
137
|
version: "0"
|
138
|
+
requirement: *id008
|
139
|
+
name: phocus
|
102
140
|
type: :development
|
103
|
-
version_requirements: *id008
|
104
141
|
- !ruby/object:Gem::Dependency
|
105
|
-
name: bundler
|
106
142
|
prerelease: false
|
107
|
-
|
143
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
108
144
|
none: false
|
109
145
|
requirements:
|
110
146
|
- - ~>
|
111
147
|
- !ruby/object:Gem::Version
|
148
|
+
hash: 23
|
149
|
+
segments:
|
150
|
+
- 1
|
151
|
+
- 0
|
152
|
+
- 0
|
112
153
|
version: 1.0.0
|
154
|
+
requirement: *id009
|
155
|
+
name: bundler
|
113
156
|
type: :development
|
114
|
-
version_requirements: *id009
|
115
157
|
- !ruby/object:Gem::Dependency
|
116
|
-
name: thin
|
117
158
|
prerelease: false
|
118
|
-
|
159
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
119
160
|
none: false
|
120
161
|
requirements:
|
121
162
|
- - "="
|
122
163
|
- !ruby/object:Gem::Version
|
164
|
+
hash: 15
|
165
|
+
segments:
|
166
|
+
- 1
|
167
|
+
- 2
|
168
|
+
- 8
|
123
169
|
version: 1.2.8
|
170
|
+
requirement: *id010
|
171
|
+
name: thin
|
124
172
|
type: :development
|
125
|
-
version_requirements: *id010
|
126
173
|
description: This library allows you to recognize and build URLs in a Rack application.
|
127
174
|
email: joshbuddy@gmail.com
|
128
175
|
executables: []
|
@@ -156,20 +203,24 @@ files:
|
|
156
203
|
- examples/variable.ru
|
157
204
|
- examples/variable_with_regex.ru
|
158
205
|
- http_router.gemspec
|
206
|
+
- js/lib/http_router.coffee
|
207
|
+
- js/lib/http_router.js
|
208
|
+
- js/package.json
|
209
|
+
- js/test/test.coffee
|
210
|
+
- js/test/test.js
|
159
211
|
- lib/http_router.rb
|
160
212
|
- lib/http_router/node.rb
|
161
213
|
- lib/http_router/node/arbitrary.rb
|
162
|
-
- lib/http_router/node/destination.rb
|
163
214
|
- lib/http_router/node/free_regex.rb
|
164
215
|
- lib/http_router/node/glob.rb
|
165
216
|
- lib/http_router/node/glob_regex.rb
|
166
217
|
- lib/http_router/node/lookup.rb
|
218
|
+
- lib/http_router/node/path.rb
|
167
219
|
- lib/http_router/node/regex.rb
|
168
220
|
- lib/http_router/node/request.rb
|
169
221
|
- lib/http_router/node/root.rb
|
170
222
|
- lib/http_router/node/spanning_regex.rb
|
171
223
|
- lib/http_router/node/variable.rb
|
172
|
-
- lib/http_router/path.rb
|
173
224
|
- lib/http_router/rack.rb
|
174
225
|
- lib/http_router/rack/builder.rb
|
175
226
|
- lib/http_router/rack/url_map.rb
|
@@ -177,10 +228,13 @@ files:
|
|
177
228
|
- lib/http_router/request.rb
|
178
229
|
- lib/http_router/response.rb
|
179
230
|
- lib/http_router/route.rb
|
231
|
+
- lib/http_router/util.rb
|
180
232
|
- lib/http_router/version.rb
|
181
233
|
- test/common/generate.txt
|
234
|
+
- test/common/http_recognize.txt
|
182
235
|
- test/common/recognize.txt
|
183
236
|
- test/generation.rb
|
237
|
+
- test/generic.rb
|
184
238
|
- test/helper.rb
|
185
239
|
- test/rack/test_route.rb
|
186
240
|
- test/recognition.rb
|
@@ -202,12 +256,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
202
256
|
requirements:
|
203
257
|
- - ">="
|
204
258
|
- !ruby/object:Gem::Version
|
259
|
+
hash: 3
|
260
|
+
segments:
|
261
|
+
- 0
|
205
262
|
version: "0"
|
206
263
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
207
264
|
none: false
|
208
265
|
requirements:
|
209
266
|
- - ">="
|
210
267
|
- !ruby/object:Gem::Version
|
268
|
+
hash: 3
|
269
|
+
segments:
|
270
|
+
- 0
|
211
271
|
version: "0"
|
212
272
|
requirements: []
|
213
273
|
|