journey 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,5 @@
1
- === 1.0.0 / (not released)
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.
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "journey"
5
- s.version = "1.0.0.20120112111444"
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-12"
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
@@ -3,7 +3,7 @@ require 'journey/gtg/transition_table'
3
3
  module Journey
4
4
  module GTG
5
5
  class Builder
6
- DUMMY = Nodes::Literal.new Object.new # :nodoc:
6
+ DUMMY = Nodes::Dummy.new # :nodoc:
7
7
 
8
8
  attr_reader :root, :ast, :endpoints
9
9
 
@@ -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
- %w{ Symbol Slash Literal Dot }.each do |t|
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
@@ -17,7 +17,7 @@ module Journey
17
17
  class RoutingError < ::StandardError
18
18
  end
19
19
 
20
- VERSION = '1.0.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
- addr = env['REMOTE_ADDR']
119
- req = request_class.new env
126
+ req = request_class.new env
120
127
 
121
- routes = filter_routes(env['PATH_INFO']) + custom_routes.find_all { |r|
122
- r.path.match(env['PATH_INFO'])
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 === env['REQUEST_METHOD']
128
- }.reject { |r| addr && !(r.ip === addr) }.map { |r|
129
- match_data = r.path.match(env['PATH_INFO'])
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 }]
@@ -47,7 +47,7 @@ module Journey
47
47
  [:DOT, text]
48
48
  when text = @ss.scan(/:\w+/)
49
49
  [:SYMBOL, text]
50
- when text = @ss.scan(/[\w-]+/)
50
+ when text = @ss.scan(/[\w%-]+/)
51
51
  [:LITERAL, text]
52
52
  # any char
53
53
  when text = @ss.scan(/./)
@@ -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.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 00:00:00.000000000 Z
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: &70268988140640 !ruby/object:Gem::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: *70268988140640
35
+ version_requirements: *70096229172040
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: rdoc
27
- requirement: &70268988140040 !ruby/object:Gem::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: *70268988140040
46
+ version_requirements: *70096229171400
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: json
38
- requirement: &70268988139560 !ruby/object:Gem::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: *70268988139560
57
+ version_requirements: *70096229162660
47
58
  - !ruby/object:Gem::Dependency
48
- name: hoe
49
- requirement: &70268988138820 !ruby/object:Gem::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: '2.12'
65
+ version: '3.10'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *70268988138820
68
+ version_requirements: *70096229161760
58
69
  - !ruby/object:Gem::Dependency
59
- name: rdoc
60
- requirement: &70268988435100 !ruby/object:Gem::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: '3.10'
76
+ version: '2.12'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *70268988435100
79
+ version_requirements: *70096229161220
69
80
  description: Journey is a router. It routes requests.
70
81
  email:
71
82
  - aaron@tenderlovemaking.com