http_router 0.11.0 → 0.11.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: afb349e4d4bfdd4a1d17f69c7447304b1150ff74
4
+ data.tar.gz: 1c784865657a739153919fb02b33620e9b1daaa4
5
+ SHA512:
6
+ metadata.gz: 40163e582745fabb018c8ce4a7da8ca36a6ea3ee4dc06d88fe8c571e5435a8cf2a39e5f18d00f0a301eff2ba86b178b883f858dcb2febddb38b82df4ad37ae6e
7
+ data.tar.gz: 925003de1d9d4455099a42e645d5d4915f7bdaf7129ecccc07168832804130cc2932be9c29f86edec126af4bcc205ecdac06a256ec5fd85caa486660ca943e8d
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
- gemspec
3
+ gemspec
data/Rakefile CHANGED
@@ -161,11 +161,15 @@ namespace :test do
161
161
  end
162
162
  end
163
163
 
164
- require 'rake/rdoctask'
164
+ begin
165
+ require 'rake/rdoctask'
166
+ rescue
167
+ require 'rdoc/task'
168
+ end
165
169
  desc "Generate documentation"
166
170
  Rake::RDocTask.new do |rd|
167
- rd.main = "README.rdoc"
168
- rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
171
+ rd.main = "README.md"
172
+ rd.rdoc_files.include("README.md", "lib/**/*.rb")
169
173
  rd.rdoc_dir = 'rdoc'
170
174
  end
171
175
 
data/lib/http_router.rb CHANGED
@@ -24,6 +24,8 @@ class HttpRouter
24
24
  TooManyParametersException = Class.new(RuntimeError)
25
25
  # Raised when there are left over options
26
26
  LeftOverOptions = Class.new(RuntimeError)
27
+ # Raised when there are duplicate param names specified in a Path
28
+ AmbiguousVariableException = Class.new(RuntimeError)
27
29
 
28
30
  RecognizeResponse = Struct.new(:matches, :acceptable_methods)
29
31
 
@@ -104,41 +106,20 @@ class HttpRouter
104
106
  end
105
107
  end
106
108
 
109
+ # Creates helper methods for each supported HTTP verb, except GET, which is
110
+ # a special case that accepts both GET and HEAD requests.
111
+ Route::VALID_HTTP_VERBS_WITHOUT_GET.each do |request_method|
112
+ request_method_symbol = request_method.downcase.to_sym
113
+ define_method(request_method_symbol) do |path, opts = {}, &app|
114
+ add_with_request_method(path, request_method_symbol, opts, &app)
115
+ end
116
+ end
117
+
107
118
  # Adds a path that only responds to the request method +GET+.
108
119
  #
109
120
  # Returns the route object.
110
121
  def get(path, opts = {}, &app); add_with_request_method(path, [:get, :head], opts, &app); end
111
122
 
112
- # Adds a path that only responds to the request method +POST+.
113
- #
114
- # Returns the route object.
115
- def post(path, opts = {}, &app); add_with_request_method(path, :post, opts, &app); end
116
-
117
- # Adds a path that only responds to the request method +DELETE+.
118
- #
119
- # Returns the route object.
120
- def delete(path, opts = {}, &app); add_with_request_method(path, :delete, opts, &app); end
121
-
122
- # Adds a path that only responds to the request method +PUT+.
123
- #
124
- # Returns the route object.
125
- def put(path, opts = {}, &app); add_with_request_method(path, :put, opts, &app); end
126
-
127
- # Adds a path that only responds to the request method +PATCH+.
128
- #
129
- # Returns the route object.
130
- def patch(path, opts = {}, &app); add_with_request_method(path, :patch, opts, &app); end
131
-
132
- # Adds a path that only responds to the request method +OPTIONS+.
133
- #
134
- # Returns the route object.
135
- def trace(path, opts = {}, &app); add_with_request_method(path, :trace, opts, &app); end
136
-
137
- # Adds a path that only responds to the request method +OPTIONS+.
138
- #
139
- # Returns the route object.
140
- def conenct(path, opts = {}, &app); add_with_request_method(path, :conenct, opts, &app); end
141
-
142
123
  # Performs recoginition without actually calling the application and returns an array of all
143
124
  # matching routes or nil if no match was found.
144
125
  def recognize(env, &callback)
@@ -6,7 +6,8 @@ class HttpRouter
6
6
  def initialize(router, parent, route, path, param_names = [])
7
7
  @route, @path, @param_names, @dynamic = route, path, param_names, !param_names.empty?
8
8
  @route.add_path(self)
9
- raise AmbiguousVariableException, "You have duplicate variable name present: #{param_names.join(', ')}" if param_names.uniq.size != param_names.size
9
+
10
+ raise AmbiguousVariableException, "You have duplicate variable names present: #{duplicates.join(', ')}" if param_names.uniq.size != param_names.size
10
11
  super router, parent
11
12
  router.uncompile
12
13
  end
@@ -46,6 +47,10 @@ class HttpRouter
46
47
  def inspect_label
47
48
  "Path: #{path.inspect} for route #{route.name || 'unnamed route'} to #{route.dest.inspect}"
48
49
  end
50
+
51
+ def duplicates
52
+ param_names.group_by { |e| e }.select { |k, v| v.size > 1 }.map(&:first)
53
+ end
49
54
  end
50
55
  end
51
56
  end
@@ -12,10 +12,10 @@ class HttpRouter
12
12
  request.path = remaining_path.split('/')
13
13
  #{node_to_code}
14
14
  request.path = _#{whole_path_var}
15
- request.params.slice!(#{-params_count.size}, #{params_count})
15
+ request.params.slice!(#{-params_count}, #{params_count})
16
16
  end
17
17
  "
18
18
  end
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -2,7 +2,9 @@ require 'set'
2
2
 
3
3
  class HttpRouter
4
4
  class Route
5
- VALID_HTTP_VERBS = %w{GET POST PUT DELETE HEAD OPTIONS TRACE}
5
+ # The list of HTTP request methods supported by HttpRouter.
6
+ VALID_HTTP_VERBS = %w{GET POST PUT DELETE HEAD OPTIONS TRACE PATCH OPTIONS LINK UNLINK}
7
+ VALID_HTTP_VERBS_WITHOUT_GET = VALID_HTTP_VERBS - %w{GET}
6
8
 
7
9
  attr_reader :default_values, :router, :match_partially, :other_hosts, :paths, :request_methods, :name
8
10
  attr_accessor :match_partially, :router, :host, :user_agent, :ignore_trailing_slash,
@@ -46,7 +46,9 @@ class HttpRouter
46
46
  methods = [methods] unless methods.is_a?(Array)
47
47
  methods.each do |method|
48
48
  method = method.to_s.upcase
49
- raise unless Route::VALID_HTTP_VERBS.include?(method)
49
+ unless Route::VALID_HTTP_VERBS.include?(method)
50
+ raise ArgumentError, "Unsupported HTTP request method: #{method}"
51
+ end
50
52
  @request_methods << method
51
53
  end
52
54
  end
@@ -77,28 +79,17 @@ class HttpRouter
77
79
  self
78
80
  end
79
81
 
80
- def head
81
- add_request_method "HEAD"
82
- self
82
+ # Creates helper methods for each supported HTTP verb.
83
+ Route::VALID_HTTP_VERBS_WITHOUT_GET.each do |request_method|
84
+ define_method(request_method.downcase) do
85
+ add_request_method(request_method)
86
+ self
87
+ end
83
88
  end
84
89
 
85
90
  def get
86
- add_request_method "GET"
87
- self
88
- end
89
-
90
- def post
91
- add_request_method "POST"
92
- self
93
- end
94
-
95
- def put
96
- add_request_method "PUT"
97
- self
98
- end
99
-
100
- def delete
101
- add_request_method "DELETE"
91
+ add_request_method("GET")
92
+ add_request_method("HEAD")
102
93
  self
103
94
  end
104
95
 
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  class HttpRouter #:nodoc
3
- VERSION = '0.11.0'
3
+ VERSION = '0.11.1'
4
4
  end
data/test/test_misc.rb CHANGED
@@ -87,6 +87,12 @@ class TestMisc < MiniTest::Unit::TestCase
87
87
  assert_raises(HttpRouter::InvalidRouteException) { r.path(:route) }
88
88
  end
89
89
 
90
+ def test_ambigiuous_parameters_in_route
91
+ r = router
92
+ r.add("/abc/:id/test/:id", :name => :route).default_destination
93
+ assert_raises(HttpRouter::AmbiguousVariableException) { r.path(:route, :id => 'fail') }
94
+ end
95
+
90
96
  def test_public_interface
91
97
  methods = HttpRouter.public_instance_methods.map(&:to_sym)
92
98
  assert methods.include?(:url_mount)
metadata CHANGED
@@ -1,126 +1,155 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_router
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
5
- prerelease:
4
+ version: 0.11.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Joshua Hull
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-04-11 00:00:00.000000000 Z
11
+ date: 2014-02-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rack
16
- requirement: &70277157558240 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 1.0.0
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70277157558240
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: url_mount
27
- requirement: &70277157557460 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ~>
31
32
  - !ruby/object:Gem::Version
32
33
  version: 0.2.1
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70277157557460
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.1
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: minitest
38
- requirement: &70277157556860 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ~>
42
46
  - !ruby/object:Gem::Version
43
47
  version: 2.0.0
44
48
  type: :development
45
49
  prerelease: false
46
- version_requirements: *70277157556860
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.0
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: code_stats
49
- requirement: &70277157556280 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - ! '>='
59
+ - - '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  type: :development
56
63
  prerelease: false
57
- version_requirements: *70277157556280
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: rake
60
- requirement: &70277157555580 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
73
  - - ~>
64
74
  - !ruby/object:Gem::Version
65
75
  version: 0.8.7
66
76
  type: :development
67
77
  prerelease: false
68
- version_requirements: *70277157555580
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 0.8.7
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rbench
71
- requirement: &70277157571180 !ruby/object:Gem::Requirement
72
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
73
86
  requirements:
74
- - - ! '>='
87
+ - - '>='
75
88
  - !ruby/object:Gem::Version
76
89
  version: '0'
77
90
  type: :development
78
91
  prerelease: false
79
- version_requirements: *70277157571180
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
80
97
  - !ruby/object:Gem::Dependency
81
98
  name: json
82
- requirement: &70277157570560 !ruby/object:Gem::Requirement
83
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
84
100
  requirements:
85
- - - ! '>='
101
+ - - '>='
86
102
  - !ruby/object:Gem::Version
87
103
  version: '0'
88
104
  type: :development
89
105
  prerelease: false
90
- version_requirements: *70277157570560
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
91
111
  - !ruby/object:Gem::Dependency
92
112
  name: phocus
93
- requirement: &70277157570000 !ruby/object:Gem::Requirement
94
- none: false
113
+ requirement: !ruby/object:Gem::Requirement
95
114
  requirements:
96
- - - ! '>='
115
+ - - '>='
97
116
  - !ruby/object:Gem::Version
98
117
  version: '0'
99
118
  type: :development
100
119
  prerelease: false
101
- version_requirements: *70277157570000
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
102
125
  - !ruby/object:Gem::Dependency
103
126
  name: bundler
104
- requirement: &70277157569360 !ruby/object:Gem::Requirement
105
- none: false
127
+ requirement: !ruby/object:Gem::Requirement
106
128
  requirements:
107
- - - ! '>='
129
+ - - '>='
108
130
  - !ruby/object:Gem::Version
109
131
  version: '0'
110
132
  type: :development
111
133
  prerelease: false
112
- version_requirements: *70277157569360
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
113
139
  - !ruby/object:Gem::Dependency
114
140
  name: thin
115
- requirement: &70277157568620 !ruby/object:Gem::Requirement
116
- none: false
141
+ requirement: !ruby/object:Gem::Requirement
117
142
  requirements:
118
- - - =
143
+ - - '='
119
144
  - !ruby/object:Gem::Version
120
145
  version: 1.2.8
121
146
  type: :development
122
147
  prerelease: false
123
- version_requirements: *70277157568620
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '='
151
+ - !ruby/object:Gem::Version
152
+ version: 1.2.8
124
153
  description: This library allows you to recognize and build URLs in a Rack application.
125
154
  email: joshbuddy@gmail.com
126
155
  executables: []
@@ -195,26 +224,25 @@ files:
195
224
  - test/test_trailing_slash.rb
196
225
  homepage: http://github.com/joshbuddy/http_router
197
226
  licenses: []
227
+ metadata: {}
198
228
  post_install_message:
199
229
  rdoc_options:
200
230
  - --charset=UTF-8
201
231
  require_paths:
202
232
  - lib
203
233
  required_ruby_version: !ruby/object:Gem::Requirement
204
- none: false
205
234
  requirements:
206
- - - ! '>='
235
+ - - '>='
207
236
  - !ruby/object:Gem::Version
208
237
  version: '0'
209
238
  required_rubygems_version: !ruby/object:Gem::Requirement
210
- none: false
211
239
  requirements:
212
- - - ! '>='
240
+ - - '>='
213
241
  - !ruby/object:Gem::Version
214
242
  version: '0'
215
243
  requirements: []
216
244
  rubyforge_project: http_router
217
- rubygems_version: 1.8.15
245
+ rubygems_version: 2.1.11
218
246
  signing_key:
219
247
  specification_version: 3
220
248
  summary: A kick-ass HTTP router for use in Rack
@@ -231,4 +259,3 @@ test_files:
231
259
  - test/test_mounting.rb
232
260
  - test/test_recognition.rb
233
261
  - test/test_trailing_slash.rb
234
- has_rdoc: