rack-mount 0.6.0 → 0.6.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/lib/rack/mount/analysis/frequency.rb +3 -3
- data/lib/rack/mount/generation/route.rb +10 -5
- data/lib/rack/mount/generation/route_set.rb +25 -6
- data/lib/rack/mount/strexp/parser.rb +0 -0
- data/lib/rack/mount/strexp/parser.y +33 -0
- data/lib/rack/mount/strexp/tokenizer.rex +12 -0
- data/lib/rack/mount/vendor/reginald/reginald/expression.rb +24 -0
- data/lib/rack/mount/vendor/reginald/reginald/parser.rb +11 -10
- data/lib/rack/mount/version.rb +3 -0
- metadata +21 -22
@@ -36,10 +36,10 @@ module Rack::Mount
|
|
36
36
|
def process_key(requirements, method, requirement)
|
37
37
|
if requirement.is_a?(Regexp)
|
38
38
|
expression = Utils.parse_regexp(requirement)
|
39
|
-
expression = expression.reject { |e| e.is_a?(Reginald::Anchor) }
|
40
39
|
|
41
|
-
if expression.is_a?(Reginald::Expression) && expression.
|
42
|
-
|
40
|
+
if expression.is_a?(Reginald::Expression) && expression.anchored_to_line?
|
41
|
+
expression = expression.reject { |e| e.is_a?(Reginald::Anchor) }
|
42
|
+
return requirements[method] = expression.to_s if expression.literal?
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -26,12 +26,17 @@ module Rack::Mount
|
|
26
26
|
@has_significant_params
|
27
27
|
end
|
28
28
|
|
29
|
-
def generate(
|
30
|
-
if
|
31
|
-
result =
|
32
|
-
|
29
|
+
def generate(method, params = {}, recall = {}, options = {})
|
30
|
+
if method.nil?
|
31
|
+
result = @conditions.inject({}) { |h, (method, condition)|
|
32
|
+
if condition.respond_to?(:generate)
|
33
|
+
h[method] = condition.generate(params, recall, options)
|
34
|
+
end
|
35
|
+
h
|
36
|
+
}
|
37
|
+
return nil if result.values.compact.empty?
|
33
38
|
else
|
34
|
-
result = generate_method(
|
39
|
+
result = generate_method(method, params, recall, options)
|
35
40
|
end
|
36
41
|
|
37
42
|
if result
|
@@ -51,7 +51,7 @@ module Rack::Mount
|
|
51
51
|
only_path = params.delete(:only_path)
|
52
52
|
recall = env[@parameters_key] || {}
|
53
53
|
|
54
|
-
unless result = generate(
|
54
|
+
unless result = generate(:all, named_route, params, recall,
|
55
55
|
:parameterize => lambda { |name, param| Utils.escape_uri(param) })
|
56
56
|
return
|
57
57
|
end
|
@@ -67,16 +67,15 @@ module Rack::Mount
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
req =
|
71
|
-
|
72
|
-
|
73
|
-
uri << "?#{Utils.build_nested_query(params)}" if params.any?
|
74
|
-
uri
|
70
|
+
req = stubbed_request_class.new(env)
|
71
|
+
req._stubbed_values = parts.merge(:query_string => Utils.build_nested_query(params))
|
72
|
+
only_path ? req.fullpath : req.url
|
75
73
|
end
|
76
74
|
|
77
75
|
def generate(method, *args) #:nodoc:
|
78
76
|
raise 'route set not finalized' unless @generation_graph
|
79
77
|
|
78
|
+
method = nil if method == :all
|
80
79
|
named_route, params, recall, options = extract_params!(*args)
|
81
80
|
merged = recall.merge(params)
|
82
81
|
route = nil
|
@@ -176,6 +175,26 @@ module Rack::Mount
|
|
176
175
|
|
177
176
|
[named_route, params.dup, recall.dup, options.dup]
|
178
177
|
end
|
178
|
+
|
179
|
+
def instance_variables_to_serialize
|
180
|
+
super - [:@stubbed_request_class]
|
181
|
+
end
|
182
|
+
|
183
|
+
def stubbed_request_class
|
184
|
+
@stubbed_request_class ||= begin
|
185
|
+
klass = Class.new(@request_class)
|
186
|
+
klass.public_instance_methods.each do |method|
|
187
|
+
next if method =~ /^__|object_id/
|
188
|
+
klass.class_eval <<-RUBY
|
189
|
+
def #{method}(*args, &block)
|
190
|
+
@_stubbed_values[:#{method}] || super
|
191
|
+
end
|
192
|
+
RUBY
|
193
|
+
end
|
194
|
+
klass.class_eval { attr_accessor :_stubbed_values }
|
195
|
+
klass
|
196
|
+
end
|
197
|
+
end
|
179
198
|
end
|
180
199
|
end
|
181
200
|
end
|
Binary file
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class Rack::Mount::StrexpParser
|
2
|
+
rule
|
3
|
+
target: expr { result = anchor ? "\\A#{val.join}\\Z" : "\\A#{val.join}" }
|
4
|
+
|
5
|
+
expr: expr token { result = val.join }
|
6
|
+
| token
|
7
|
+
|
8
|
+
token: PARAM {
|
9
|
+
name = val[0].to_sym
|
10
|
+
requirement = requirements[name]
|
11
|
+
result = REGEXP_NAMED_CAPTURE % [name, requirement]
|
12
|
+
}
|
13
|
+
| GLOB {
|
14
|
+
name = val[0].to_sym
|
15
|
+
result = REGEXP_NAMED_CAPTURE % [name, '.+']
|
16
|
+
}
|
17
|
+
| LPAREN expr RPAREN { result = "(?:#{val[1]})?" }
|
18
|
+
| CHAR { result = Regexp.escape(val[0]) }
|
19
|
+
end
|
20
|
+
|
21
|
+
---- header ----
|
22
|
+
require 'rack/mount/utils'
|
23
|
+
require 'rack/mount/strexp/tokenizer'
|
24
|
+
|
25
|
+
---- inner
|
26
|
+
|
27
|
+
if Reginald.regexp_supports_named_captures?
|
28
|
+
REGEXP_NAMED_CAPTURE = '(?<%s>%s)'.freeze
|
29
|
+
else
|
30
|
+
REGEXP_NAMED_CAPTURE = '(?:<%s>%s)'.freeze
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_accessor :anchor, :requirements
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Rack::Mount::StrexpParser
|
2
|
+
macro
|
3
|
+
RESERVED \(|\)|:|\*
|
4
|
+
ALPHA_U [a-zA-Z_]
|
5
|
+
rule
|
6
|
+
\\({RESERVED}) { [:CHAR, @ss[1]] }
|
7
|
+
\:({ALPHA_U}\w*) { [:PARAM, @ss[1]] }
|
8
|
+
\*({ALPHA_U}\w*) { [:GLOB, @ss[1]] }
|
9
|
+
\( { [:LPAREN, text] }
|
10
|
+
\) { [:RPAREN, text] }
|
11
|
+
. { [:CHAR, text] }
|
12
|
+
end
|
@@ -41,6 +41,30 @@ module Reginald
|
|
41
41
|
!ignorecase && all? { |e| e.literal? }
|
42
42
|
end
|
43
43
|
|
44
|
+
def anchored?
|
45
|
+
anchored_to_start? && anchored_to_end?
|
46
|
+
end
|
47
|
+
|
48
|
+
def anchored_to_start?
|
49
|
+
first.is_a?(Anchor) && first == '\A'
|
50
|
+
end
|
51
|
+
|
52
|
+
def anchored_to_end?
|
53
|
+
last.is_a?(Anchor) && last == '\Z'
|
54
|
+
end
|
55
|
+
|
56
|
+
def anchored_to_line?
|
57
|
+
anchored_to_start_of_line? && anchored_to_end_of_line?
|
58
|
+
end
|
59
|
+
|
60
|
+
def anchored_to_start_of_line?
|
61
|
+
anchored_to_start? || (first.is_a?(Anchor) && first == '^')
|
62
|
+
end
|
63
|
+
|
64
|
+
def anchored_to_end_of_line?
|
65
|
+
anchored_to_end? || (last.is_a?(Anchor) && last == '$')
|
66
|
+
end
|
67
|
+
|
44
68
|
def options
|
45
69
|
flag = 0
|
46
70
|
flag |= Regexp::MULTILINE if multiline
|
@@ -298,7 +298,7 @@ end
|
|
298
298
|
def _reduce_3(val, _values, result)
|
299
299
|
val[1].quantifier = val[2]
|
300
300
|
result = Expression.reduce(val[0], val[1])
|
301
|
-
|
301
|
+
|
302
302
|
result
|
303
303
|
end
|
304
304
|
|
@@ -310,7 +310,7 @@ end
|
|
310
310
|
def _reduce_5(val, _values, result)
|
311
311
|
val[0].quantifier = val[1]
|
312
312
|
result = val[0]
|
313
|
-
|
313
|
+
|
314
314
|
result
|
315
315
|
end
|
316
316
|
|
@@ -356,7 +356,7 @@ end
|
|
356
356
|
def _reduce_15(val, _values, result)
|
357
357
|
result = Group.new(val[1])
|
358
358
|
result.index = @capture_index_stack.pop
|
359
|
-
|
359
|
+
|
360
360
|
result
|
361
361
|
end
|
362
362
|
|
@@ -368,14 +368,14 @@ def _reduce_16(val, _values, result)
|
|
368
368
|
result.expression.ignorecase = options[:ignorecase];
|
369
369
|
result.expression.extended = options[:extended];
|
370
370
|
@options_stack.pop
|
371
|
-
|
371
|
+
|
372
372
|
result
|
373
373
|
end
|
374
374
|
|
375
375
|
def _reduce_17(val, _values, result)
|
376
376
|
result = Group.new(val[3]);
|
377
377
|
result.capture = false;
|
378
|
-
|
378
|
+
|
379
379
|
result
|
380
380
|
end
|
381
381
|
|
@@ -383,7 +383,7 @@ def _reduce_18(val, _values, result)
|
|
383
383
|
result = Group.new(val[3]);
|
384
384
|
result.name = val[2];
|
385
385
|
result.index = @capture_index_stack.pop
|
386
|
-
|
386
|
+
|
387
387
|
result
|
388
388
|
end
|
389
389
|
|
@@ -493,25 +493,25 @@ end
|
|
493
493
|
|
494
494
|
def _reduce_44(val, _values, result)
|
495
495
|
@options_stack << result = { val[1] => false, val[2] => false, val[3] => false }
|
496
|
-
|
496
|
+
|
497
497
|
result
|
498
498
|
end
|
499
499
|
|
500
500
|
def _reduce_45(val, _values, result)
|
501
501
|
@options_stack << result = { val[0] => true, val[2] => false, val[3] => false }
|
502
|
-
|
502
|
+
|
503
503
|
result
|
504
504
|
end
|
505
505
|
|
506
506
|
def _reduce_46(val, _values, result)
|
507
507
|
@options_stack << result = { val[0] => true, val[1] => true, val[3] => false }
|
508
|
-
|
508
|
+
|
509
509
|
result
|
510
510
|
end
|
511
511
|
|
512
512
|
def _reduce_47(val, _values, result)
|
513
513
|
@options_stack << result = { val[0] => true, val[1] => true, val[2] => true }
|
514
|
-
|
514
|
+
|
515
515
|
result
|
516
516
|
end
|
517
517
|
|
@@ -538,3 +538,4 @@ end
|
|
538
538
|
end # module Reginald
|
539
539
|
|
540
540
|
require 'reginald/tokenizer'
|
541
|
+
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-mount
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 6
|
8
|
+
- 1
|
9
|
+
version: 0.6.1
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Joshua Peek
|
@@ -9,19 +14,10 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-03-06 00:00:00 -06:00
|
13
18
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: rack
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.0.0
|
24
|
-
version:
|
19
|
+
dependencies: []
|
20
|
+
|
25
21
|
description: Stackable dynamic tree based Rack router
|
26
22
|
email: josh@joshpeek.com
|
27
23
|
executables: []
|
@@ -29,9 +25,10 @@ executables: []
|
|
29
25
|
extensions: []
|
30
26
|
|
31
27
|
extra_rdoc_files:
|
32
|
-
- README.rdoc
|
33
28
|
- LICENSE
|
29
|
+
- README.rdoc
|
34
30
|
files:
|
31
|
+
- lib/rack/mount.rb
|
35
32
|
- lib/rack/mount/analysis/frequency.rb
|
36
33
|
- lib/rack/mount/analysis/histogram.rb
|
37
34
|
- lib/rack/mount/analysis/splitting.rb
|
@@ -48,13 +45,16 @@ files:
|
|
48
45
|
- lib/rack/mount/regexp_with_named_groups.rb
|
49
46
|
- lib/rack/mount/route.rb
|
50
47
|
- lib/rack/mount/route_set.rb
|
48
|
+
- lib/rack/mount/strexp.rb
|
51
49
|
- lib/rack/mount/strexp/parser.rb
|
50
|
+
- lib/rack/mount/strexp/parser.y
|
52
51
|
- lib/rack/mount/strexp/tokenizer.rb
|
53
|
-
- lib/rack/mount/strexp.
|
52
|
+
- lib/rack/mount/strexp/tokenizer.rex
|
54
53
|
- lib/rack/mount/utils.rb
|
55
54
|
- lib/rack/mount/vendor/multimap/multimap.rb
|
56
55
|
- lib/rack/mount/vendor/multimap/multiset.rb
|
57
56
|
- lib/rack/mount/vendor/multimap/nested_multimap.rb
|
57
|
+
- lib/rack/mount/vendor/reginald/reginald.rb
|
58
58
|
- lib/rack/mount/vendor/reginald/reginald/alternation.rb
|
59
59
|
- lib/rack/mount/vendor/reginald/reginald/anchor.rb
|
60
60
|
- lib/rack/mount/vendor/reginald/reginald/atom.rb
|
@@ -65,10 +65,7 @@ files:
|
|
65
65
|
- lib/rack/mount/vendor/reginald/reginald/group.rb
|
66
66
|
- lib/rack/mount/vendor/reginald/reginald/parser.rb
|
67
67
|
- lib/rack/mount/vendor/reginald/reginald/tokenizer.rb
|
68
|
-
- lib/rack/mount/
|
69
|
-
- lib/rack/mount.rb
|
70
|
-
- README.rdoc
|
71
|
-
- LICENSE
|
68
|
+
- lib/rack/mount/version.rb
|
72
69
|
has_rdoc: true
|
73
70
|
homepage: http://github.com/josh/rack-mount
|
74
71
|
licenses: []
|
@@ -82,18 +79,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
79
|
requirements:
|
83
80
|
- - ">="
|
84
81
|
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 0
|
85
84
|
version: "0"
|
86
|
-
version:
|
87
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
86
|
requirements:
|
89
87
|
- - ">="
|
90
88
|
- !ruby/object:Gem::Version
|
89
|
+
segments:
|
90
|
+
- 0
|
91
91
|
version: "0"
|
92
|
-
version:
|
93
92
|
requirements: []
|
94
93
|
|
95
94
|
rubyforge_project:
|
96
|
-
rubygems_version: 1.3.
|
95
|
+
rubygems_version: 1.3.6
|
97
96
|
signing_key:
|
98
97
|
specification_version: 3
|
99
98
|
summary: Stackable dynamic tree based Rack router
|