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.
@@ -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