journey 1.0.0 → 1.0.1
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/CHANGELOG.rdoc +4 -5
- data/journey.gemspec +8 -5
- data/lib/journey/gtg/builder.rb +1 -1
- data/lib/journey/nodes/node.rb +19 -1
- data/lib/journey/router.rb +15 -8
- data/lib/journey/scanner.rb +1 -1
- data/test/test_router.rb +47 -0
- metadata +27 -16
data/CHANGELOG.rdoc
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
* 1 major enhancement
|
4
|
-
|
5
|
-
* Birthday!
|
1
|
+
Mon Jan 23 17:07:53 2012 Aaron Patterson <aaron@tenderlovemaking.com>
|
6
2
|
|
3
|
+
* Added symbol? and literal? predicate methods to the ast nodes for
|
4
|
+
easier AST traversal.
|
5
|
+
* Made the dummy node a real class.
|
data/journey.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "journey"
|
5
|
-
s.version = "1.0.
|
5
|
+
s.version = "1.0.1.20120126101943"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Aaron Patterson"]
|
9
|
-
s.date = "2012-01-
|
9
|
+
s.date = "2012-01-26"
|
10
10
|
s.description = "Journey is a router. It routes requests."
|
11
11
|
s.email = ["aaron@tenderlovemaking.com"]
|
12
12
|
s.extra_rdoc_files = ["Manifest.txt", "CHANGELOG.rdoc", "README.rdoc"]
|
@@ -23,23 +23,26 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.specification_version = 3
|
24
24
|
|
25
25
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
s.add_development_dependency(%q<minitest>, ["~> 2.10"])
|
26
27
|
s.add_development_dependency(%q<racc>, [">= 1.4.6"])
|
27
28
|
s.add_development_dependency(%q<rdoc>, ["~> 3.11"])
|
28
29
|
s.add_development_dependency(%q<json>, [">= 0"])
|
29
|
-
s.add_development_dependency(%q<hoe>, ["~> 2.12"])
|
30
30
|
s.add_development_dependency(%q<rdoc>, ["~> 3.10"])
|
31
|
+
s.add_development_dependency(%q<hoe>, ["~> 2.12"])
|
31
32
|
else
|
33
|
+
s.add_dependency(%q<minitest>, ["~> 2.10"])
|
32
34
|
s.add_dependency(%q<racc>, [">= 1.4.6"])
|
33
35
|
s.add_dependency(%q<rdoc>, ["~> 3.11"])
|
34
36
|
s.add_dependency(%q<json>, [">= 0"])
|
35
|
-
s.add_dependency(%q<hoe>, ["~> 2.12"])
|
36
37
|
s.add_dependency(%q<rdoc>, ["~> 3.10"])
|
38
|
+
s.add_dependency(%q<hoe>, ["~> 2.12"])
|
37
39
|
end
|
38
40
|
else
|
41
|
+
s.add_dependency(%q<minitest>, ["~> 2.10"])
|
39
42
|
s.add_dependency(%q<racc>, [">= 1.4.6"])
|
40
43
|
s.add_dependency(%q<rdoc>, ["~> 3.11"])
|
41
44
|
s.add_dependency(%q<json>, [">= 0"])
|
42
|
-
s.add_dependency(%q<hoe>, ["~> 2.12"])
|
43
45
|
s.add_dependency(%q<rdoc>, ["~> 3.10"])
|
46
|
+
s.add_dependency(%q<hoe>, ["~> 2.12"])
|
44
47
|
end
|
45
48
|
end
|
data/lib/journey/gtg/builder.rb
CHANGED
data/lib/journey/nodes/node.rb
CHANGED
@@ -35,13 +35,29 @@ module Journey
|
|
35
35
|
def type
|
36
36
|
raise NotImplementedError
|
37
37
|
end
|
38
|
+
|
39
|
+
def symbol?; false; end
|
40
|
+
def literal?; false; end
|
38
41
|
end
|
39
42
|
|
40
43
|
class Terminal < Node
|
41
44
|
alias :symbol :left
|
42
45
|
end
|
43
46
|
|
44
|
-
|
47
|
+
class Literal < Terminal
|
48
|
+
def literal?; true; end
|
49
|
+
def type; :LITERAL; end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Dummy < Literal
|
53
|
+
def initialize x = Object.new
|
54
|
+
super
|
55
|
+
end
|
56
|
+
|
57
|
+
def literal?; false; end
|
58
|
+
end
|
59
|
+
|
60
|
+
%w{ Symbol Slash Dot }.each do |t|
|
45
61
|
class_eval %{
|
46
62
|
class #{t} < Terminal
|
47
63
|
def type; :#{t.upcase}; end
|
@@ -62,6 +78,8 @@ module Journey
|
|
62
78
|
def default_regexp?
|
63
79
|
regexp == DEFAULT_EXP
|
64
80
|
end
|
81
|
+
|
82
|
+
def symbol?; true; end
|
65
83
|
end
|
66
84
|
|
67
85
|
class Unary < Node
|
data/lib/journey/router.rb
CHANGED
@@ -17,7 +17,7 @@ module Journey
|
|
17
17
|
class RoutingError < ::StandardError
|
18
18
|
end
|
19
19
|
|
20
|
-
VERSION = '1.0.
|
20
|
+
VERSION = '1.0.1'
|
21
21
|
|
22
22
|
class NullReq # :nodoc:
|
23
23
|
attr_reader :env
|
@@ -29,6 +29,14 @@ module Journey
|
|
29
29
|
env['REQUEST_METHOD']
|
30
30
|
end
|
31
31
|
|
32
|
+
def path_info
|
33
|
+
env['PATH_INFO']
|
34
|
+
end
|
35
|
+
|
36
|
+
def ip
|
37
|
+
env['REMOTE_ADDR']
|
38
|
+
end
|
39
|
+
|
32
40
|
def [](k); env[k]; end
|
33
41
|
end
|
34
42
|
|
@@ -115,18 +123,17 @@ module Journey
|
|
115
123
|
end
|
116
124
|
|
117
125
|
def find_routes env
|
118
|
-
|
119
|
-
req = request_class.new env
|
126
|
+
req = request_class.new env
|
120
127
|
|
121
|
-
routes = filter_routes(
|
122
|
-
r.path.match(
|
128
|
+
routes = filter_routes(req.path_info) + custom_routes.find_all { |r|
|
129
|
+
r.path.match(req.path_info)
|
123
130
|
}
|
124
131
|
|
125
132
|
routes.sort_by(&:precedence).find_all { |r|
|
126
133
|
r.constraints.all? { |k,v| v === req.send(k) } &&
|
127
|
-
r.verb ===
|
128
|
-
}.reject { |r|
|
129
|
-
match_data = r.path.match(
|
134
|
+
r.verb === req.request_method
|
135
|
+
}.reject { |r| req.ip && !(r.ip === req.ip) }.map { |r|
|
136
|
+
match_data = r.path.match(req.path_info)
|
130
137
|
match_names = match_data.names.map { |n| n.to_sym }
|
131
138
|
match_values = match_data.captures.map { |v| v && Utils.unescape_uri(v) }
|
132
139
|
info = Hash[match_names.zip(match_values).find_all { |_,y| y }]
|
data/lib/journey/scanner.rb
CHANGED
data/test/test_router.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
require 'helper'
|
2
3
|
|
3
4
|
module Journey
|
@@ -26,6 +27,10 @@ module Journey
|
|
26
27
|
self.called = true
|
27
28
|
'world'
|
28
29
|
end
|
30
|
+
|
31
|
+
def path_info; env['PATH_INFO']; end
|
32
|
+
def request_method; env['REQUEST_METHOD']; end
|
33
|
+
def ip; env['REMOTE_ADDR']; end
|
29
34
|
end
|
30
35
|
|
31
36
|
def test_dashes
|
@@ -45,6 +50,24 @@ module Journey
|
|
45
50
|
assert called
|
46
51
|
end
|
47
52
|
|
53
|
+
def test_unicode
|
54
|
+
klass = FakeRequestFeeler.new nil
|
55
|
+
router = Router.new(routes, {})
|
56
|
+
|
57
|
+
#match the escaped version of /ほげ
|
58
|
+
exp = Router::Strexp.new '/%E3%81%BB%E3%81%92', {}, ['/.?']
|
59
|
+
path = Path::Pattern.new exp
|
60
|
+
|
61
|
+
routes.add_route nil, path, {}, {:id => nil}, {}
|
62
|
+
|
63
|
+
env = rails_env 'PATH_INFO' => '/%E3%81%BB%E3%81%92'
|
64
|
+
called = false
|
65
|
+
router.recognize(env) do |r, _, params|
|
66
|
+
called = true
|
67
|
+
end
|
68
|
+
assert called
|
69
|
+
end
|
70
|
+
|
48
71
|
def test_request_class_and_requirements_success
|
49
72
|
klass = FakeRequestFeeler.new nil
|
50
73
|
router = Router.new(routes, {:request_class => klass })
|
@@ -85,6 +108,30 @@ module Journey
|
|
85
108
|
assert_equal env.env, klass.env
|
86
109
|
end
|
87
110
|
|
111
|
+
class CustomPathRequest < Router::NullReq
|
112
|
+
def path_info
|
113
|
+
env['custom.path_info']
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_request_class_overrides_path_info
|
118
|
+
router = Router.new(routes, {:request_class => CustomPathRequest })
|
119
|
+
|
120
|
+
exp = Router::Strexp.new '/bar', {}, ['/.?']
|
121
|
+
path = Path::Pattern.new exp
|
122
|
+
|
123
|
+
routes.add_route nil, path, {}, {}, {}
|
124
|
+
|
125
|
+
env = rails_env 'PATH_INFO' => '/foo', 'custom.path_info' => '/bar'
|
126
|
+
|
127
|
+
recognized = false
|
128
|
+
router.recognize(env) do |r, _, params|
|
129
|
+
recognized = true
|
130
|
+
end
|
131
|
+
|
132
|
+
assert recognized, "route should have been recognized"
|
133
|
+
end
|
134
|
+
|
88
135
|
def test_regexp_first_precedence
|
89
136
|
add_routes @router, [
|
90
137
|
Router::Strexp.new("/whois/:domain", {:domain => /\w+\.[\w\.]+/}, ['/', '.', '?']),
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: journey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: minitest
|
16
|
+
requirement: &70096229172640 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2.10'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70096229172640
|
14
25
|
- !ruby/object:Gem::Dependency
|
15
26
|
name: racc
|
16
|
-
requirement: &
|
27
|
+
requirement: &70096229172040 !ruby/object:Gem::Requirement
|
17
28
|
none: false
|
18
29
|
requirements:
|
19
30
|
- - ! '>='
|
@@ -21,10 +32,10 @@ dependencies:
|
|
21
32
|
version: 1.4.6
|
22
33
|
type: :development
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *70096229172040
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: rdoc
|
27
|
-
requirement: &
|
38
|
+
requirement: &70096229171400 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ~>
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: '3.11'
|
33
44
|
type: :development
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70096229171400
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: json
|
38
|
-
requirement: &
|
49
|
+
requirement: &70096229162660 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,29 +54,29 @@ dependencies:
|
|
43
54
|
version: '0'
|
44
55
|
type: :development
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70096229162660
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
59
|
+
name: rdoc
|
60
|
+
requirement: &70096229161760 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ~>
|
53
64
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
65
|
+
version: '3.10'
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70096229161760
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
60
|
-
requirement: &
|
70
|
+
name: hoe
|
71
|
+
requirement: &70096229161220 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ~>
|
64
75
|
- !ruby/object:Gem::Version
|
65
|
-
version: '
|
76
|
+
version: '2.12'
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70096229161220
|
69
80
|
description: Journey is a router. It routes requests.
|
70
81
|
email:
|
71
82
|
- aaron@tenderlovemaking.com
|